oracle ExecuteNonQuery在ASP.Net上冻结

时间:2014-05-15 20:00:34

标签: asp.net oracle executenonquery

我正在尝试使用ASP C#和CLR 4.5中的Oracle连接运行非查询。这是我的代码:

    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开发可以执行此更新查询的事实证明这不是权限问题。

有什么想法吗?

2 个答案:

答案 0 :(得分:8)

您的查询很可能正在等待访问记录。您可能已经在&#34; oracle开发工具&#34;中修改了该行。并且没有提交或回滚该交易。

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

有关Oracle自动锁定的更多信息: http://docs.oracle.com/cd/E11882_01/server.112/e41084/ap_locks001.htm

答案 1 :(得分:0)

您确定使用的是4.5库吗? 3.5 documentation表示CommandTimeout属性无效。

4.5 documentation表明它应该有效,但备注部分没有提到这种值得怀疑的变化。

否则,您发布的代码似乎没有显示您实际将QUERY_TIMEOUT的值设置为5秒的位置。如果QUERY_TIMEOUT的值为零,则任何其他提供程序(例如,SQLCommand)将无限期地等待。正如vav所说,来自其他来源的锁定可能导致无限期等待。