最近幾天一直在圖書館裡面看《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")獲得這列屬性的資料類型。
例子:
Sub Main()
Dim conn As New SqlConnection("data source=localhost;initial catalog=StudentCourse;" & _
"User ID=;Password=;")
Dim cmd As SqlCommand
conn.Open()
cmd = conn.CreateCommand
cmd.CommandText = "Select * From Student"
Dim rdr As SqlDataReader
rdr = cmd.ExecuteReader
Dim schema As DataTable
schema = rdr.GetSchemaTable
Dim i As Integer
i = 0
Debug.WriteLine(schema.Rows(i)("ColumnName"))
Debug.WriteLine(schema.Rows(i)("DataType"))
Debug.WriteLine(schema.Rows(i)("ColumnSize"))
conn.Close()
End Sub