2017-03-14 14 views
2

私は、IBM DB2 .NETプロバイダ(IBM.Data.DB2)を使用してDB2データベース(v9.7)に接続するプログラムを.NETで作成しています。 selectクエリを実行します。DB2で割り当て時間を超過するとSQLクエリの実行が終了する

送信された選択クエリがデータを返すために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:私はまた、5にcmd.CommandTimeoutを設定しようとしました、それはまだ実行を停止しません。

+0

_cmd.CommandTimeout = 5; _?を設定するとどうなりますか? – Steve

+0

@スティーブ、それはまだ20秒間実行されます。 – nJoshi

+1

どのように20秒を測定しますか?あなたのケースでは、カーソルからフェッチしているので、各CLI呼び出しは別々のタイムアウトの対象になると仮定しているので、 'ExecuteReader'(おそらくカーソルを開くだけです)または' Read'(カーソルからフェッチする可能性があります)タイムアウトがキックインするために5秒を超える。 – mustaccio

答えて

0
上記の例に問題がのExecuteReader()は、データをプルデータベースにカーソルを作成することである

ときに読み出し、これクエリがタイムアウトすることはありません。

しかし、DataAdapterをデータセットに使用すると、データを1回で取得できます。したがって、以下は実行を殺すようです。

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私はあなたの意見を得るのか分からない。私の制限は、データを返すために5秒以上かかるSQLが実行されないようなシステムを作成することでした。私はquerytimeoutとcommandTimeoutを使用していました。これは、データベースからデータを取得するためにリーダーを使用していたため、探しているものが得られませんでした。 – nJoshi

0

IBM WebサイトのDB2Command.CommandTimeoutプロパティー・チュートリアルをお読みください。これがあなたの問題を解決することを願っています。 C#のコード例は以下である:

[C#の]

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

私はすでにこれを試しましたが、問題はカーソルを開いている実行リーダーを実行していたことでした。だから、カーソルを呼び出すたびにDBに接続し、時間切れにならない小さなデータを引き出していました。 – nJoshi

関連する問題