首先,用select語句查詢需要插入資料的表,用top 1查一行就夠了,這個是為了給sqldataadapter生成表的架構用的。
string
strsql ="
select * from tableneedtoupdate
";
2sqldataadapter da
=new
sqldataadapter(strsql, sqlconn);
3dataset ds
=new
dataset();
4da.fill(ds); 5//
設定主鍵
6ds.tables[
0].primarykey
=new
datacolumn ;
其次,用sqlcommandbuilder為sqldataadapter生成用於新增、刪除、更新的command。
sqlcommandbuilder cmdb
=new
sqlcommandbuilder(da);
2da.insertcommand
=cmdb.getinsertcommand();
3da.updatecommand
=cmdb.getupdatecommand();
4da.deletecommand
=cmdb.getdeletecommand();
然後,如果根據要插入的資料生成新行。
1foreach
(datarow dr
indtnew.rows) 2
最後,用da.update(ds),即可將資料一次性插入資料庫中。
對於一些特殊情況,比如新插入資料跟原表中資料主鍵衝突的情況,則要多費點周折。正常情況下,這種情況應該是用更新來處理,而不是用插入。但有的時候,更新比較麻煩的時候,也可以用先刪除,後插入的方式來處理。
舉個例子,也就是我這一次處理的情況。我需要定時從乙個系統讀取資料寫入另外乙個系統。資料來源的資料是不定時更新的,沒有更新標識,每次讀取的時候,根本不知道哪些資料是新增的或是修改過的(當然也可以通過主鍵來進行判斷,但是比較麻煩)。這個時候,不能直接將這些資料寫入目的資料庫,因為可能會有主鍵重複的問題,所以需要先刪除目的資料庫中的資料,然後將新資料一次性全部寫入資料庫。
這個流程說起來非常清楚,問題在於如何刪除目的資料庫舊資料。我之前採取的方法是用table.rows.clear()方法:
1ds.tables[
0].rows.clear();
2da.update(ds);
3ds.acceptchanges();
這樣操作之後,插入新資料,會出現「主鍵重複」的錯誤。而只能採用table.rows.delete()方法:
1for
(inti =
0; i
<
ds.tables[
0].rows.count; i++)
2
5da.update(ds);
6ds.acceptchanges();
究其原因,是跟sqldataadapter的處理機制有關係的。sqldataadapter.update()是根據dataset中datarow的狀態標記來處理的,比如我們用dataset.tables[0].rows.add(drnew)來新增一行時,drnew會有乙個狀態added,執行sqldataadapter.update()時,會根據這個狀態對資料行進行處理,對應的,更新的資料行會有updated狀態,刪除的資料行會有deleted狀態。
對於rows.clear()方法,是將資料從資料表中清除,它不會為被刪除的行新增標記,所以在執行sqldataadapter.update()時就不會首先將表中的資料刪除,從而導致主鍵重複的錯誤。而對於rows.delete(),它不會直接把資料行刪除,而是加上deleted標記,所以可以在update的時候正確的將資料刪除。
DataSet更新到資料庫總結
最近在工作中再次遇到了將dataset中的資料全部插入資料庫的情況。這種情況以前也處理過,很久沒用又忘記了,今天特別總結一下這種情況的處理方式。首先,用select語句查詢需要插入資料的表,用top 1查一行就夠了,這個是為了給sqldataadapter生成表的架構用的。1string strsq...
dataset 更新到資料庫的問題
string everyconn common.commonutility.geteveryconn empresource mpevery new empresource everyconn dataset dse mpevery.mpresourcelist datatable dte dse....
DataSet更新資料庫
思路是這樣的 先查詢,繫結資料集 要更新的資料集需要設定為當前模組的變數 等你在datagridview修改資料後繼續進行下面的操作 然後是再在其他的事件中提交修改 比如 你在某個窗體內定義 sqlconnection conn dataset ds new dataset sqlcommand c...