简体   繁体   English

当我使用SELECT查询实例化DataAdapter时,如何为DataAdapter.Update设置命令超时?

[英]How do I set the command timeout for DataAdapter.Update when I instantiate the DataAdapter using a SELECT query?

I have code that looks like this: 我的代码看起来像这样:

var ds = new DataSet();
var fooIDToFoo = new Dictionary<string, Foo> {{"Foo1", foo1}, {"Food2", foo2}};
var sql = "SELECT * FROM Foo WHERE FooID IN ('Foo1', 'Foo2')";
var da = new SqlDataAdapter(sql, dbConnection);
da.SelectCommand.CommandTimeout = 60;
// Can't set da.InsertCommand.CommandTimeout because db.InsertCommand is null.
// Can't set da.UpdateCommand.CommandTimeout because db.UpdateCommand is null.
var cb = new SqlCommandBuilder(da);
var fooTable = "Foo";
da.Fill(ds, fooTable);
var fooTable = ds.Tables[fooTable];
var existingFooIDSet = new Set<string>(); // Modify any Foo that's in DB.
foreach (DataRow r in fooTable.Rows)
{
  var fooID = r["ID"];
  var foo = fooIDToFoo[fooID]
  r["ID"] = foo.ID;
  r["Bar"] = foo.Bar;
  existingFooIDSet.Add(fooID);
}
foreach (var foo in fooIDToFoo.Values) // Add any Foo that's not in DB.
{
  if (!existingFooIDSet.Contains(foo.FooID))
  {
    var foo = fooIDToFoo[fooID]
    var r = fooTable.NewRow();
    r["ID"] = fooID;
    r["Bar"] = foo.Bar;
    fooTable.Rows.Add(r);
  }
}
da.Update(ds, "Steve"); // Times out!

The last statement times out, so I want to increase the timeout, but, as the code comments indicate, I can't set da.InsertCommand.CommandTimeout because db.InsertCommand is null, and I can't set da.UpdateCommand.CommandTimeout because db.UpdateCommand is null. 最后一个语句超时,所以我想增加超时,但是,正如代码注释所示,我无法设置da.InsertCommand.CommandTimeout,因为db.InsertCommand为null,我无法设置da.UpdateCommand.CommandTimeout因为db.UpdateCommand为null。

The solution is to explicitly get the insert and update commands using the DbCommandBuilder, set their timeouts, then assign them to the DbDataAdapter's InsertCommand and UpdateCommand properties: 解决方案是使用DbCommandBuilder显式获取insert和update命令,设置它们的超时,然后将它们分配给DbDataAdapter的InsertCommand和UpdateCommand属性:

da.InsertCommand = cb.GetInsertCommand();
da.InsertCommand.CommandTimeout = timeout;
da.UpdateCommand = cb.GetUpdateCommand();
da.UpdateCommand.CommandTimeout = timeout;

This shouldn't occur until immediately before the da.Update(db, "Steve"). 直到da.Update(db,“Steve”)之前不应该发生这种情况。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM