dataset更新資料的問題
OracleConnection conn = new OracleConnection("data source=FFPD;user=wanli;password=wanli123;");
OracleDataAdapter adapter = new OracleDataAdapter("select * from test where pkey = 7 ",conn);
DataSet dataSet = new DataSet();
//下面這句加上就沒有問題,否則出錯
OracleCommandBuilder mybuilder = new OracleCommandBuilder(adapter);
adapter.Fill(dataSet, "test");
dataSet.Tables[0].Rows[0]["N"] = 12345;
adapter.Update(dataSet,"test");
adapter.Dispose();
問題原因及解決:
====================================================
1.SelectCommand使用的select命令中必須包含主鍵(primary key)!
2.填充資料集時,使用如下方法:
da.FillSchema(ds,SchemaType.Source, "TableName"); //載入表架構 注意
da.Fill(dsPubs,"TableName"); //載入表資料
3. DataAdapter 的 MissingSchemaAction 屬性設定為 AddWithKey
4.構造CommandBuilder物件時,將DataAdapter物件作為建構函式引數傳入:
SqlCommandBuilder objCommandBuilder = new SqlCommandBuilder(da);
5.增加行,修改行,刪除行;
6.呼叫DataAdapter的update方法更新資料來源!
7.更新資料來源成功,呼叫ds的Acceptchanges()方法,更新資料集!
DbDataAdapter呼叫 Update 方法時,DataAdapter 將分析已作出的更改並執行相應的命令(INSERT、UPDATE 或 DELETE)。當 DataAdapter 遇到對 DataRow 的更改時,它將使用 InsertCommand、UpdateCommand 或 DeleteCommand 來處理該更改。這樣,您就可以通過在設計時指定命令語法並在可能時通過使用儲存過程來儘量提高 ADO.NET 應用程式的效能。在呼叫 Update 之前,必須顯式設定這些命令。如果呼叫了 Update 但不存在用於特定更新的相應命令(例如,不存在用於已刪除行的 DeleteCommand),則將引發異常。
但是如果 DataTable 對映到單個數據庫表或從單個數據庫表生成,則可以利用 CommandBuilder 物件自動生成 DataAdapter 的 DeleteCommand、InsertCommand 和 UpdateCommand。為了自動生成命令,必須設定 SelectCommand 屬性,這是最低的要求。SelectCommand 所檢索的表架構確定自動生成的 INSERT、UPDATE 和 DELETE 語句的語法。如果在自動生成插入、更新或刪除命令後修改 SelectCommand 的 CommandText,則可能會發生異常。如果已修改的 SelectCommand.CommandText 所包含的架構資訊與自動生成插入、更新或刪除命令時所使用的 SelectCommand.CommandText 不一致,則以後對 DataAdapter.Update 方法的呼叫可能會試圖訪問 SelectCommand 引用的當前表中已不存在的列,並且會引發異常。可以通過呼叫 CommandBuilder 的 RefreshSchema 方法來重新整理 CommandBuilder 用來自動生成命令的架構資訊。
對於DbDataAdapter.Update 方法更新資料庫,每次在呼叫DbDataAdapter.Update(ds) 之後一定要ds.acceptchanges,否則會對後面用到的ds出現意想不到的錯誤。