C# DataAdapter:更新无法找到TableMapping[';Table';]或DataTable';表';
此代码段引发错误: 更新在适配器上找不到TableMapping['Table']或DataTable'Table'。更新(ds);线 为什么会抛出这种类型的错误C# DataAdapter:更新无法找到TableMapping[';Table';]或DataTable';表';,c#,sql-server,ado.net,dataadapter,C#,Sql Server,Ado.net,Dataadapter,此代码段引发错误: 更新在适配器上找不到TableMapping['Table']或DataTable'Table'。更新(ds);线 为什么会抛出这种类型的错误 SqlConnection con = new SqlConnection(); con.ConnectionString = connectionString(); DataSet ds = new DataSet(); string strQuery = "SELECT * FROM Cars"; SqlDataAdapter
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);
使用
相反
我已经测试过了。我得到了相同的错误,如果我指定了tablename,它就会工作。但是,我必须承认,我还不知道为什么DataAdapter
需要知道表名,因为它有它需要的所有信息。如果使用,则得到一行具有正确的表名
更新我在上没有找到任何内容,但最终在源代码(ILSpy)中找到了它。以下是DBDataAdapter.Update(数据集)
的实现:
因此,如果不指定表,则使用表名“table”
,如果指定了表名以外的其他表名,则会出现此错误,这真是奇怪
我假设这是因为DataAdapter
无法调用GetChanges
来确定要更新的表,原因有两个:
RowState
!=<代码>未更改DataAdapter
不支持此操作。因此,DataAdapter.Update(DataSet)
假定默认名称“Table”
为表名DataAdapter
不使用DataSet.Tables[0]。TableName
因此,通常最好指定要更新的表的名称。这是因为.NET不能假定
数据集中的表名与数据库表相同。因此.NET警告您这一点
要解决此问题,您需要向数据适配器添加映射:
da.TableMappings.Add("TableNameInDb", "TableNameInTheDataSet");
但是,即使您在数据集
或数据源
中指定了名称,它仍然不起作用,因为适配器似乎忘记了名称
我仅通过使用以下方法使其工作:
da.TableMappings.Add("Table", "TableNameInDb");
我同意jgauffin的观点,我只会用更多的文字来解释
首先,我必须解释TableMapping
是如何工作的。如果我们没有使用SqlDataAdapter
(SqlDataAdapter
)指定TableMappings
,它将填充数据集,那么默认情况下,第一个表将命名为“table”,第二个表将命名为“Table1”,第三个表将命名为“Table2”等等
因此,当我们想在DataSet
中命名DataTable
时,我们使用它如下:
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";
只有这样,我们才能这样修改它:
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";
谢谢蒂姆·施梅尔特。@ArifAnsari:不客气。但考虑一下答案;