ADO.NET學習筆記(一)
2024-07-10 12:59:13
供稿:網友
最近幾天一直在圖書館里面看《ado.net實用指南》,發現真是一本好書。讀書自然就有心得,本人就根據書的線索,把自己的學習體會主要以代碼的形式記錄下來。(書上對應代碼在http://www.adoguy.com/book里)
1、連接
ado.net最大的特色就在于支持在斷開連接的情況下對數據庫里的內容進行操作,這樣可以大大的節約過多連接帶來的消耗,前面的那一篇文章中已經給了一個具體的例子說明ado.net的這種特性。我們可以在從數據庫里獲得數據的時候打開連接,在得到數據之后就斷開連接,對dataset里面的數據進行操作,然后在把dataset里的內容更新到數據庫里面的時候再打開連接。對于datareader則必須一直保持連接。
使用這種特性的時候有幾點要注意一下:
(1)更改連接屬性的時候必須斷開連接
(2)切換數據庫的時候選擇conn.changedatabase(dbname),減少斷開連接與新建連接往返帶來的消耗
ado.net同時支持數據庫自帶連接池。在一個連接關閉之后,連接會在池中保持一段時間,然后才實際的關閉,如果在超時之前,有人請求建立相同的連接,就將打開的連接分配給請求者,這對于經常進行打開和斷開的連接可以減少很多的消耗。不過在sql server 2000中采用集成安全性的連接無法入池。
連接涉及到的事件有dispose,infomessage,statechange,在msdn可以查到,不再贅述。
模板代碼:
dim conn as sqlconnection
conn=new sqlconnection("……") '里面為連接字符串
conn.open()
'進行相應的操作
conn.close()
2、command對象
ado.net允許以三種不同的方式獲取數據庫里面的數據command,dataset,datareader,command是最基本的方法,通過執行sql命令的形式獲得數據。
(1)創建 可以用兩種方式創建
a、創建新的command對象
dim cmd as new sqlcommand
cmd.connection=conn
cmd.commandtext="select * from customer"
b、獲得對conn中command對象的引用
dim cmd as sqlcommand
cmd=conn.createcommand();
cmd.commandtext="select * from customer"
推薦第二種方法
(2)執行 四種執行方式
executenonquery() 返回受命令影響的行數
executescalar() 返回第一行第一列(使用與集函數)
executereader() 返回一個datareader對象
executexmlreader()返回一個xmlreader對象
(3)參數 主要是用在存儲過程中,有復雜和精簡兩種形式
復雜方法:
dim param as new sqlparameter("@return",sqldbtype.int)
param.direction=parameterdirection.returnvalue
cmd.parameters.add(param)
精簡方法
cmd.parameters.add("@return_value",dbtype.int32).direction=parameterdirection.returnvalue
建議:如果需要處理輸出值時的時候使用參數,只處理輸入值的時候就不用使用參數了。
(4)事務
用sql語句:
begin tran
sql操作
if @@error <>0
begin
rollback tran
return @@error
end
commit tran
return 0
在ado.net中編寫事務
cmd.transaction = conn.begintransaction()
try
{
cmd.commandtext="..."
cmd.executenonquery()
cmd.transaction.commit()
}
catch(exception ex)
cmd.transaction.rollback()
end try
如果希望將數據庫事務處理與一些外部系統結合起來(比如在數據庫更新時同時進行了web更新,如果web更新失敗希望回滾事務時),選擇客戶端編寫事務處理(用ado.net編寫)
僅僅做數據庫事務處理的話就直接在服務端寫事務語句(在sql server2000 中寫事務)
在事務中可以創建savepoint來實現部分事務回滾
cmd.transaction.save("new customer")
cmd.transaction.rollback("new customer")
(5)批處理查詢 如果有多條sql語句并且可以一起執行的話,就可以進行批處理查詢。在datareader中支持批處理查詢獲得的數據集。
cmd.commandtext="select * from customer;select * from inovince;"
dim rdr as sqldatareader
rdr=cmd.executereader()
rdr中即包含兩個sql語句執行的結果
3、datareader對象
datareader對象只能對查詢獲得的數據集進行自上而下的訪問,但效率很高。如果僅僅是訪問數據的話,可以使用datareader。但datareader要求一直連接,所以將結果的一小部分先放在內存中,讀完后再從數據庫中讀取一部分,相當于一個緩存機制。這對于查詢結果百萬級的情況來說,帶來的好處是顯而易見的。
模板代碼:
do while rdr.read()
console.writeline(rdr(0)) '也可輸出rdr("customerid")
loop
如果要進行類型限制的話可以輸出(string)rdr(0)或rdr.getstring(0)
從datareader里讀出數據的時候要注意屬性是否為空,如果屬性可以為空,則讀出數據時應進行判斷
if not rdr.isdbnull(0)
console.writeline(...)
用datareader讀取記錄時,數據庫默認上鎖,可以通過更改datareader的默認屬性改變。
如果datareader里面的數據是批處理語句執行得到的話,可以通過nextresult訪問
模板代碼:
do
do while rdr.read()
console.writeline(rdr(0))
loop
loop while rdr.nextresult()
處理元數據(顯示每個屬性的情況)
dim schema as datatable
schema=rdr.getschematable() '得到元數據表,表里的每列對應每個屬性的特性集合
對于每一列屬性對應的row,通過row("datatype")獲得這列屬性的數據類型。