Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataAdapter:更新无法找到TableMapping[';Table';]或DataTable';表';_C#_Sql Server_Ado.net_Dataadapter - Fatal编程技术网

C# DataAdapter:更新无法找到TableMapping[';Table';]或DataTable';表';

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

此代码段引发错误:

更新在适配器上找不到TableMapping['Table']或DataTable'Table'。更新(ds);线

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

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:不客气。但考虑一下答案;