2013-10-07 45 views
1

這段代碼被拋出出錯:的DataAdapter:更新找不到TableMapping [「表」]或數據表「表」

Update unable to find TableMapping['Table'] or DataTable 'Table'.) on adapter.Update(ds); line

爲什麼它拋出這種類型的錯誤?

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

使用

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"作爲表名。

編輯:不過,也許有人可以解釋我爲什麼DataAdapter不使用DataSet.Tables[0].TableName來代替。

因此,一般來說,指定要更新的表的名稱似乎是最佳做法。

+0

謝謝添Schmelter。 –

+0

@ArifAnsari:不客氣。但考慮[接受](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)答案;) –

0

這是因爲.NET不能假定數據集/數據表中的表名與數據庫表相同。因此.NET會警告你。

爲了解決它,你需要一個映射添加到DataAdapter

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

但是,即使你在DataSet或它仍然不能正常工作的DataSource指定一個名字,因爲適配器似乎忘記名字。

我只得到它的工作使用:

da.TableMappings.Add("Table", "TableNameInDb"); 
0

我同意jgauffin,我只會有更多的文字解釋。

首先,我必須解釋TableMapping是如何工作的。如果我們沒有用SqlDataAdapter(SqlDataAdapter將填充我們的DataSet)指定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";