這段時間一直在學習c#winform中的數據庫編程,一直沒有搞清楚怎么樣進行數據庫的更新操作,只是知道簡單的查看數據庫,哎,旁邊沒有人學.net的好痛苦呀,什么事情都只能自己弄,連一個人討論的都沒有,還好在網上認識一個兄弟,有什么問題還可以問他。現在弄清楚了其中一種最簡單的數據庫的添加與更新方法。
今天終于弄清楚了怎么樣用dataset對數據庫進行更新了,總結如下:
要操作dataset進行數據庫的添加,更新和刪除,必須弄清楚幾個類:sqldataadapter類,sqlcommandbuilder類等等。
*sqldataadapter類:表示用于填充 dataset 和更新 sql server 數據庫的一組數據命令和一個數據庫連接。dataset 和 sql server 之間的橋接器,用于檢索和保存數據。sqldataadapter 通過對數據源使用適當的 transact-sql 語句映射 fill(它可更改 dataset 中的數據以匹配數據源中的數據)和 update(它可更改數據源中的數據以匹配 dataset 中的數據)來提供這一橋接。其實通俗點來講,這個類的作用就是將數據庫中的數據捆綁到dataset中,然后對dataset進行操作。而dataset可以看成是數據庫中找出的幾個表在內存中臨時存放的地方。它不需要一直和數據庫建立連接,這樣可以保證服務器不會受很大的負擔,因為sqldataadapter類中的fill方法有很好的特性:如果沒有使用conn.open(),那么fill()語句執行時會打開conn,然后使用完了以后關閉conn,如果我使用了conn.open()那么,fill()語句執行以后也不會關閉連接,因為可能有其他的語句需要在連接的情況下執行,此時需要手工關閉連接.對dataset中表的修改也就是對數據庫中表的修改,但是還是要有特定的命令sqlcommandbuilder。
*sqlcommandbuilder類:自動生成具有以下用途的單表命令:使對 dataset 所做的更改與關聯的 sql server 數據庫相協調。sqldataadapter 不會自動生成實現 dataset 的更改與關聯的 sql server 實例之間的協調所需的 transact-sql 語句。但是,如果設置了 sqldataadapter 的 selectcommand 屬性,則可以創建一個 sqlcommandbuilder 對象來自動生成用于單表更新的 transact-sql 語句。然后,sqlcommandbuilder 將生成其他任何未設置的 transact-sql 語句。一旦設置 dataadapter 屬性,sqlcommandbuilder 就將其自身注冊為 rowupdating 事件的偵聽器。一次只能將一個 sqldataadapter 與一個 sqlcommandbuilder 對象(或相反)互相關聯。為了生成 insert、update 或 delete 語句,sqlcommandbuilder 會自動使用 selectcommand 屬性來檢索所需的元數據集。如果在檢索元數據后(例如在第一次更新后)更改 selectcommand,則應調用 refreshschema 方法來更新元數據。sqlcommandbuilder 還使用由 selectcommand 引用的 connection、commandtimeout 和 transaction 屬性。如果修改了任何這些屬性或者替換了 selectcommand 本身,用戶則應調用 refreshschema。否則,insertcommand、updatecommand 和 deletecommand 屬性將保留它們以前的值。如果調用 dispose,則會解除 sqlcommandbuilder 與 sqldataadapter 的關聯,并且不再使用所生成的命令。使用sqlcommandbuilder這個類的時候一定要注意,必須保證所操作的數據庫表中一定要存在主鍵,否則不會自動生成命令,而且會產生異常。
實例代碼:
string str="server=localhost;uid=sa;pwd=;database=test";
sqlconnection conn=new sqlconnection(str);
sqldataadapter adapter=new sqldataadapter("select * from stores",conn);
//adapter.selectcommand=new sqlcommand("select * from stores",conn);
sqlcommandbuilder scb=new sqlcommandbuilder(adapter);//自動產生各種命令
conn.open();
dataset ds=new dataset();
adapter.fill(ds,"stores");
conn.close();
//console.writeline(ds.tables["stores"].rows[0][0].tostring());
//ds.tables["stores"].rows[0][0]="1234";
datatable dt=ds.tables["stores"];
//datarow myrow=dt.newrow();//在表中添加新的行,一定是這樣的。
myrow["stor_id"]=8345;
myrow["stor_name"]="king";
myrow["stor_address"]="hazu";
myrow["city"]="wuhan";
myrow["state"]="ab";
myrow["zip"]="12345";
dt.rows.add(myrow); //ds.tables["stores"].rows.add(myrow);//這樣也可以
//dt.rows.add(new object[]{"0101","sha","hazu","wuhan","bc","1532"}); //或者是直接用這句話來添加一行,上面的屬性列的付直可以不用。
adapter.update(ds,"stores");
console.writeline("修改成功");
console.read();
以上是添加一行的代碼,對于其他的,如:修改其中的一行,刪除等等,都可以這樣,只要存在sqlcommandbuilder就會自動生成相應的command命令的。
還有一種修改數據庫中信息的方法,那就是過程存儲,明天開始研究,呵呵,好累,現在準備考研究生沒有什么時間學c#好郁悶。但是還是不舍得完全的放棄,還是有節制的學吧。
新聞熱點
疑難解答