2014-05-15 36 views
1

我想在CLR 4.5中使用ASP C#中的Oracle连接运行非查询。这里是我的代码:oracle ExecuteNonQuery在ASP.Net上冻结

string connectionString = ConfigurationManager.ConnectionStrings["OracleConnectionString1"].ConnectionString; 
    OracleConnection conn = new OracleConnection(connectionString); 
    conn.Open(); 
    OracleCommand cmd = new OracleCommand(); 
    cmd.Connection = conn; 
    cmd.CommandText = "update SALES_ADVENTUREWORKS2012.SALESORDERDETAIL set UNITPRICEDISCOUNT=0 where ROWGUID='4A399178-C0A0-447E-9973-6AB903B4AECD'"; 
    cmd.CommandType = CommandType.Text; 
    cmd.CommandTimeout = QUERY_TIMEOUT; 
    int row_affected = cmd.ExecuteNonQuery(); 
    HttpContext.Current.Response.Write("Rows affected:" + row_affected + "<br/>"); 
    conn.Close(); 

当我在oracle开发工具中运行查询时,它工作正常。 当我使用上面的asp代码时,它会在执行查询时冻结。即使我使用了5秒的超时时间,它仍会永久冻结。 我试过使用托管和非托管oracle库;两者表现相同。 请注意,使用填充或标量查询工作得很好,因此我的连接字符串没有任何问题。此外,Oracle开发人员可以执行此更新查询的事实证明,这不是权限问题。

任何想法?

回答

6

很有可能您的查询正在等待访问记录。您可能已在“oracle开发工具”中修改了该行,但未提交或回滚该事务。

只需在您的工具中提交/回滚或关闭打开的会话。 您可以在v $事务视图中检查打开的事务。

更多有关甲骨文自动锁: http://docs.oracle.com/cd/E11882_01/server.112/e41084/ap_locks001.htm

+0

你说得对。 Oracle开发工具保持连接打开并且超时不起作用导致此问题。谢谢 – max

+0

我在SQLDeveloper中有无交易的交易 - 委托他们为我工作。谢谢你的提示。 – ben

0

你确定你使用的是4.5库? 3.5 documentation指出CommandTimeout属性不起作用。

4.5 documentation暗示它应该起作用,但备注部分没有提及可能引起怀疑的更改。

否则,您发布的代码似乎并未显示您实际将QUERY_TIMEOUT的值设置为5秒的位置。如果QUERY_TIMEOUT的值为零,则任何其他提供者(例如SQLCommand)都将无限期地等待。正如vav建议的那样,来自其他来源的锁可能导致无限期的等待。

+0

是的,我已将超时设置为5.文档说明它是以秒为单位的,而缺省值是15秒。 Oracle bug! – max