我正在尝试使用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开发可以执行此更新查询的事实证明这不是权限问题。
有什么想法吗?
答案 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所说,来自其他来源的锁定可能导致无限期等待。