2017-03-14 147 views
2

我在使用IBM DB2 .NET提供程序(IBM.Data.DB2)連接到DB2數據庫(v9.7)的.NET中創建程序並運行選擇查詢。如果SQL查詢執行超過DB2中分配的時間,則執行SQL查詢執行

如果提交的select查詢花費超過5秒鐘的時間返回數據,程序應該終止SQL執行。

要按照IBM's documentation執行此操作,我可以在連接中使用QueryTimeout參數。

string connStr = "Server=server:12345;Database=db;UID=user;PWD=pass; QueryTimeout = 5;"; 

      DB2Connection conn = null; 
      DB2Command cmd = null; 

      conn = new DB2Connection(connStr); 
      conn.Open(); 
      Console.WriteLine("IBM DB2: " + conn.IsOpen); 
      if (conn.IsOpen) 
      { 
       Console.WriteLine(conn.ConnectionTimeout); 
       cmd = conn.CreateCommand(); 
       cmd.CommandText = "select * from user.orders";      
       DB2DataReader reader = cmd.ExecuteReader(); 
       int counter = 0; 
       while (reader.Read()) 
       { 
        counter += 1; 
        Console.WriteLine(reader.GetDB2Int64(0)); 
       }      
       reader.Close();      
      } 
      conn.Close(); 

當我在winSQL中運行查詢時,查詢花了大約20秒來執行。但是當我在這個程序中執行它時,它花了我20秒。根據文檔,查詢應該在5秒內終止。

爲什麼執行沒有停止?

PS:我也試過cmd.CommandTimeout設置爲5,它仍然不會停止執行。

+0

如果將_cmd.CommandTimeout設置爲5,會發生什麼?_? – Steve

+0

@Steve,它仍然運行20秒。 – nJoshi

+1

你如何衡量你的20秒?在你的情況下,由於你從遊標中獲取數據,我認爲每個CLI調用都受到單獨的超時限制,所以'ExecuteReader'(可能只是打開一個遊標)或者任何'Read'(可能是從遊標中獲取)在超時時間超過5秒後纔會啓動。 – mustaccio

回答

0

與上面的例子的問題是的ExecuteReader()創建一個光標移到拉動數據作爲數據庫時其讀取,所以查詢永遠不會超時。

但是使用一個DataAdapter到一個數據集,一次性提取數據。所以下面似乎殺死了執行。

string connStr = "Server=server:12345;Database=db;UID=user;PWD=pass;"; 
conn = new DB2Connection(connStr); 
conn.Open(); 

if (conn.IsOpen) 
{ 
    Console.WriteLine(conn.ConnectionTimeout); 
    cmd = conn.CreateCommand(); 
    cmd.CommandText = "select * from orders"; 
    cmd.CommandTimeout = 5; 

    DB2DataAdapter adp = new DB2DataAdapter(cmd); 
    DataSet ds = new DataSet(); 
    adp.Fill(ds); 
    foreach (DataRow row in ds.Tables[0].Rows){ 
     Console.WriteLine(row[0]); 
    } 
} 
conn.Close(); 
+0

根據文檔,「DB2DataAdapter」不會自動生成協調對與數據庫關聯的DataSet所做更改所需的SQL語句。 – fabfas

+0

@fabfas我不確定我是否明白你的觀點。我的限制是我創建了一個系統,它不會讓SQL運行超過5秒鐘來返回數據。我使用的是querytimeout和commandTimeout,它沒有產生我在找的東西,因爲我使用讀取器從數據庫中提取數據。 – nJoshi

0

在IBM網站上閱讀DB2Command.CommandTimeout財產教程。我希望這會解決你的問題。 C#示例代碼如下:

[C#]

public void CreateMyDB2Command() 
{ 
    string mySelectQuery = "SELECT * FROM EMPLOYEE ORDER BY EMPNO"; 
    DB2Command myCommand = new DB2Command(mySelectQuery); 
    myCommand.CommandTimeout = 20; 
} 
+0

我已經試過這個,但問題是我正在執行一個執行閱讀器,那是打開一個遊標。所以每次對光標的調用都會連接到數據庫,並拉出永不超時的小塊數據。 – nJoshi