此代码段引发错误:



为什么会引发此类错误?

SqlConnection con = new SqlConnection();
con.ConnectionString = connectionString();

DataSet ds = new DataSet();

string strQuery = "SELECT * FROM Cars";
SqlDataAdapter adapter = new SqlDataAdapter();

adapter.SelectCommand = new SqlCommand(strQuery, con);

SqlCommandBuilder builder = new SqlCommandBuilder(adapter);

adapter.Fill(ds, "Cars");

//Code to modify data in the DataSet
ds.Tables["Cars"].Rows[0]["Brand"] = "NewBrand";

adapter.UpdateCommand = builder.GetUpdateCommand();
adapter.Update(ds);

最佳答案


adapter.Update(ds, "Cars");

反而。

我已经测试过了没有同样的错误,如果指定表名也可以使用。但是,我必须承认我还不知道DataAdapter为什么需要知道表名,因为它具有所需的所有信息。如果我使用 ds.GetChanges ,我将获得正确的表名的一行。

更新我没有在MSDN上找到任何内容,但最终在源代码(ILSpy)中找到了它。这是DBDataAdapter.Update(DataSet)的实现:
public override int Update(DataSet dataSet)
{
    return this.Update(dataSet, "Table");
}

因此,如果您不指定表,则使用表名"Table",如果您指定了其他表名,则将收到此错误,这真是奇怪!

我认为这样做的原因是DataAdapter无法调用GetChanges来确定要更新的表,这有两个原因:
  • 效率低下,因为它需要循环所有表及其所有行以查找带有RowState的行!= Unchanged
  • 由于多个表包含已更改的行,因此可能需要更新多个表。 DataAdapter不支持该功能。因此,DataAdapter.Update(DataSet)假定默认名称"Table"为表名。

  • 编辑:但是,也许有人可以向我解释为什么DataAdapter不使用DataSet.Tables[0].TableName

    因此,通常,最好的做法是指定要更新的表的名称。

    10-05 19:56