Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Oracle的插入、更新和删除在.NET C中不起作用?_C#_Oracle - Fatal编程技术网

C# Oracle的插入、更新和删除在.NET C中不起作用?

C# Oracle的插入、更新和删除在.NET C中不起作用?,c#,oracle,C#,Oracle,我和oracle和.net打交道已经有一段时间了,他们似乎并不完美地结合在一起。这是一件奇怪的事情,我找不到它发生的任何原因或如何修复它 我做简单的插入、更新和删除,但它们不起作用。它在服务器上失败 cmd.ExecuteNonQuery(); 下面是一段代码: sqlCommand = string.Format(@" INSERT INTO TABLE_1 (ID, NAME, DESCRIPTION)

我和oracle和.net打交道已经有一段时间了,他们似乎并不完美地结合在一起。这是一件奇怪的事情,我找不到它发生的任何原因或如何修复它

我做简单的插入、更新和删除,但它们不起作用。它在服务器上失败

cmd.ExecuteNonQuery();
下面是一段代码:

sqlCommand = string.Format(@" INSERT INTO TABLE_1
                              (ID, NAME, DESCRIPTION)
                              VALUES ((SELECT MAX(ID)+1 FROM TABLE_1),'{0}','{1}')", name, description);

using (OracleConnection conn = new OracleConnection(connectionString))
{
 OracleCommand cmd = new OracleCommand(sqlCommand, conn);
 cmd.CommandType = commandType;

 try
 {
  conn.Open();
  result = cmd.ExecuteNonQuery();                    
 }
 catch (Exception ex) { throw;}
 finally
 {
  conn.Close();
 }
一个简单的插入,对吗?!当我调试时,我会得到cmd.Text值,这将是sqlCommand,我会在oracle db中执行它,它运行得很好。当我在.Net中执行它时,它放弃了

这是已知的情况吗?有什么解决办法,有什么解释吗


Thnx提前

这与您的问题无关,但:

您应该使用序列,而不是选择
从表1中选择MAXID+1来生成id,我想我刚刚给出了一个合理的解释:

数据库应该一直在忙于执行另一个更新删除或插入操作,因此您一直在无限期地等待它从应用程序执行更新

我也有你的问题。我的问题是:


我们怎样才能避免这种等待,或者从数据库中获得一条消息,我稍后将尝试,以便用户知道发生了什么?

我想您的表被某人锁定了。或者该表是否具有位图索引?位图索引不应用于多用户同时更改数据的环境中,因为它们锁定了很多数据。在oltp环境中使用BTree索引


这与您的问题无关,但:

使用Oracle时,必须使用参数化查询,而不是string.Format..{}。。。。参数化查询速度更快,因为这意味着Oracle不必解析每个sql语句

然后做一些类似的事情

create sequence table_1_seq
插入表_1 id,值表_1_seq.nextval,,以填充该id

而不是

(SELECT MAX(ID)+1 FROM TABLE_1)
因为这在多用户环境中不起作用

编辑1

您可以运行此选择以确定是否存在位图索引:

select index_name,table_name from all_indexes 
where index_type = 'BITMAP';

取决于你是如何做到这一点的;您可以使用:

    catch (Exception ex)
    {
System.Data.OracleClient.OracleException oEx = (System.Data.OracleClient.OracleException)ex.InnerException;

      if (oEx.Message.IndexOf("ORA-0054") != 0)
      {
         .... do something here...    
      }

。。它将检测是否发生了锁定。YMMV,因为我只在Oracle 9i上使用过它。

我也有同样的问题。我不知道怎么解决它。当我在不运行sqldeveloper的情况下运行程序时,它运行得很好。我对这个问题的回答是:关闭从您的计算机连接到oracle的任何其他程序。对我来说一切顺利。

插入:

insert into student values('rahul',474,'mca','phase2');
删除:

delete from student where roll_no=472;
更新:

update student set address='phase7' where roll_no=474;

提交Oracle客户端中使用的任何查询,如Toad或SQL Developer

不允许并行使用OracleClientLike Toad或sSQL Developer and.net,如果要同时使用这两种并行方式,请在与.net一起使用之前在oracle客户端中使用commit


然后试着将它与.net一起使用-那会有用。

当你说放弃时,你是什么意思?你是得到了一个例外,还是只是挂起了。如果是例外,请发布完整的详细信息。此外,如果您发布更多的代码,可能会有所帮助。试着在创建SqlCommand对象和执行它的地方发布完整的例程。不,它只是持续执行了很长一段时间,或者看起来是这样。除了SQL注入风险之外,我看不出代码有任何明显的错误,并且不必要地捕获和抛出异常。你仔细检查了你的连接字符串是否正确了吗?是的,没问题,那段代码工作正常,连接正常。我可以检索数据,但没有其他功能。连接打开,它挂在cmd上。ExecuteOnQueryIt不是权限问题,我的意思是我确实有权在数据库中读写数据。是的,我知道,我读过这方面的内容,但我对oracle比较陌生,所以为了更快地做事情,我会即兴创作。这个问题有什么线索吗?只要你意识到这在多用户环境中是不正确的,因为不同的连接可以从maxid+1得到相同的结果。调试时它挂起在哪里?thnx,我将修复它,因此我将阅读更多关于oracle的信息。正如ai在挂起cmd.ExecuteNonQuery之前所说的那样;所以,这不是一个已知的情况…看看这篇文章