這是我讀《ADO.NET實用指南》的筆記。
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