如果SQL查询超过DB2

时间:2017-03-14 21:58:13

标签: c# .net db2 db2-luw

我在.NET中创建一个程序,它使用IBM DB2 .NET提供程序(IBM.Data.DB2)连接到DB2数据库(v9.7)并运行select查询。

如果提交的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 ,但仍然无法停止执行。

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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();