9

此代码段引发错误:

更新在adapter.Update(ds)上找不到TableMapping['Table'] 或DataTable 'Table'.); 线

为什么会抛出这种类型的错误?

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);
4

3 回答 3

11

利用

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来确定要更新的表,原因有两个:

  1. 这将是低效的,因为它需要循环所有表及其所有行以查找带有RowState!=的行Unchanged
  2. 可能需要更新多个表,因为它们包含更改的行。不支持通过DataAdapter. 因此DataAdapter.Update(DataSet)假定默认名称"Table"为 table-name。

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

所以一般来说,最好的做法是指定要更新的表的名称。

于 2013-10-07T15:24:16.913 回答
2

这是因为 .NET 不能假定DataSet/中的表名DataTable与数据库表相同。因此 .NET 会警告您。

要解决它,您需要将映射添加到DataAdapter

da.TableMappings.Add("TableNameInDb", "TableNameInTheDataSet");

但是,即使您在DataSet或 中指定了名称,DataSource它仍然不起作用,因为适配器似乎忘记了该名称。

我只能通过使用它来工作:

da.TableMappings.Add("Table", "TableNameInDb");
于 2015-08-26T19:44:48.783 回答
0

我同意 jgauffin 的观点,我只会用更多的文字来解释它。

首先,我必须解释它是如何TableMapping工作的。如果我们不指定TableMappingswith SqlDataAdapter(SqlDataAdapter这将填充我们的DataSet),那么默认情况下,第一个表将命名为“Table”,第二个将命名为“Table1”,第三个将命名为“Table2”,依此类推。

所以,当我们想要命名DataTablein 时DataSet,我们可以这样使用:

System.Data.DataSet myDataSet = new System.Data.DataSet();

using (System.Data.SqlClient.SqlDataAdapter dbAdapter = new System.Data.SqlClient.SqlDataAdapter(dbCommand))
{
    dbAdapter.TableMappings.Add("Table", "Cars");
    dbAdapter.TableMappings.Add("Table1", "Trucks");
        //...

    dbAdapter.Fill(myDataSet);
}

只有这样我们才能像这样修改它:

myDataSet.Tables["Cars"].Rows[0]["Brand"] = "Toyota";
myDataSet.Tables["Trucks"].Rows[0]["Brand"] = "MAN";
于 2018-02-28T15:36:01.307 回答