我在.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 ,但仍然无法停止执行。
答案 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();