2014-05-15 64 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