国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

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")獲得這列屬性的數據類型。






發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 井陉县| 德格县| 中宁县| 静安区| 文登市| 义乌市| 六盘水市| 信丰县| 枣强县| 红安县| 许昌市| 桂平市| 宁河县| 秀山| 云林县| 绍兴县| 鹤岗市| 桃园县| 威信县| 阳新县| 昆明市| 舞钢市| 灵石县| 郎溪县| 日土县| 乌审旗| 高唐县| 夏河县| 阳高县| 都兰县| 丽江市| 富宁县| 红原县| 永顺县| 蓬溪县| 平南县| 建昌县| 平邑县| 胶南市| 儋州市| 东源县|