2012-10-01 33 views
0

我需要在幾個不同的ADO.NET連接類型(Sql和Oracle)上運行查詢。如果尚未完成,我希望能夠在X秒後取消查詢。我想一個線程可能會接近一個很好的辦法,所以我可以殺了X秒後線程,如果它仍然活着:使用線程來超時ADO.NET查詢

var thread = new Thread((param) => 
{ 
    try 
    { 
     string connStr = "****"; 
     OracleConnection conn = new OracleConnection(connStr); 
     try 
     {      
      conn.Open(); 
      Debug.WriteLine("Connection Open: " + DateTime.Now.ToLongTimeString()); 
      OracleCommand cmd = new OracleCommand(param as string, conn); 
      Debug.WriteLine("Command Start: " + DateTime.Now.ToLongTimeString()); 
      OracleDataReader reader = cmd.ExecuteReader(); 
      Debug.WriteLine("Command End: " + DateTime.Now.ToLongTimeString()); 
      conn.Close(); 
      Debug.WriteLine("Connection Close: " + DateTime.Now.ToLongTimeString()); 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine("Exception: " + ex.Message); 
     } 
    } 
    catch (ThreadInterruptedException) 
    { 
     Debug.WriteLine("Cancel: " + DateTime.Now.ToLongTimeString()); 
    } 
}); 

Debug.WriteLine("Start: " + DateTime.Now.ToLongTimeString()); 

thread.Start("begin dbms_lock.sleep(10); end;"); 
DateTime start = DateTime.Now; 
while (thread.IsAlive) 
{ 
    if (DateTime.Now > start.AddSeconds(5)) 
    { 
     thread.Interrupt(); 
    } 
}     

Debug.WriteLine("End: " + DateTime.Now.ToLongTimeString()); 

但是,這不是與thread.Interrupt()像其他代碼我取消之前使用過。

我該如何解決這個問題?還是有更好的方法來解決這個問題?

+1

你必須首先殺死sql連接,在這裏它顯示瞭如何http://stackoverflow.com/questions/7837739/can-sql-server-queries-be-really-cancelled-killed –

+0

在我的情況下,我關心更少關於數據庫上的實際查詢,更多關於繼續我的過程。我也沒有必要的權限來終止查詢。 – Paul

+0

此代碼是否在asp.net或windows窗體中運行? –

回答

1

創建一個ASP.NET Web Api Controller封裝您的SQL查詢,在您的MVC控制器使用HttpWebRequest並指定您的請求到api超時。 Web API調用將返回包含查詢結果的JSON對象,您需要使用JavaScriptSerializer.Deserialize在控制器中反序列化它。

+0

這個類在.NET4中可用嗎?我似乎無法找到System.Web.Http DLL。 – Paul

+0

這是在mvc4這裏http://www.asp.net/web-api –

+0

啊,我正在使用MVC3。 – Paul