ADO.NET是.Net FrameWork SDK中用以操作資料庫的類庫的總稱。它提供了一些核心的對象實現對資料庫的操作,這些核心對象在前篇部落格中已經大致引述了一下,該篇部落客要對主要對象進行說明。
一、Connection對象
Connection對象是資料庫連接對象,主要負責對資料來源的串連,所有Connection對象的基類都是DbConnection類。
Connection對象有兩個重要的屬性:
ConnectionString:儲存開啟資料庫的字串;
State:表示Connection的狀態,有Closed和Open兩種狀態。
Connection對象有兩個重要的方法:
Open方法:用於開啟資料庫;
Close方法:用於關閉資料庫;
Using sqlCon As New SqlConnection("Server=longan-pc\mssqlserver2008;Database=Student;uid=sa;pwd=long") sqlCon.Open() Console.WriteLine(sqlCon.State.ToString)End Using
在使用Connection對象串連資料庫時我們常在Using語句中定義該對象,在使用完該對象後即關閉和釋放對象,減少記憶體佔用。如果不使用Using語句的話應在使用完該對象後調用Close方法關閉資料庫,並在隨後使用Dispose方法釋放對象。
串連到資料庫可以用下面的方式:
(1)如果要串連的資料庫伺服器與開發人員的機器在同一個區域網路裡,可以使用區域網路IP地址或者區域網路中的電腦主機名稱;
(2)如果要串連的資料庫伺服器與開發人員的機器不在同一個區域網路內,那麼就要求資料庫伺服器必須有一個公網IP,我們可以使用公網IP來串連,如果資料庫伺服器還有互連網網域名稱,那麼用互連網網域名稱也是可以的。
(3)如果要串連的資料庫伺服器與開發人員所使用的機器是同一台機器,那麼可以使用以下幾種方式之一:”(local)”或者”.”或者”127.0.0.1”。需要注意的是,如果在一台機器上運行著同一種資料庫的不同版本,比如說在”xxxxx”這台主機上同時運行著SQL 2000、SQL 2005和SQL Express三種版本,並且它們所使用的Windows服務名分別為”SQL2000”、”SQL2005”和”SQLExpress”,那麼我們要串連到SQL 2000這個資料庫上所使用的伺服器名就應該填寫”xxxxx\SQL2000”這種“主機名稱\執行個體名”的方式或者“主機IP\執行個體名”,這種情況在同時安裝了Visual
Studio 和SQL 的朋友那裡很常見,因為SQL Express是針對學生的功能有限的免費版本,這個版本的資料庫在安裝Visual Studio 時預設是一同安裝的。
二、Command對象
Command對象也稱為資料庫命令對象,Command對象主要執行對資料庫進行增刪改查操作的命令。用於執行預存程序時需要將Command對象的CommandType 屬性設定為CommandType.StoredProcedure,預設情況下CommandType 屬性為CommandType.Text,表示執行的是普通SQL語句。
Command對象常用屬性:
Connection:定義連線物件,如果使用該對象需要與資料庫的連線物件綁定否則不能對資料庫進行操作;
Parameters:主要用於儲存對資料庫進行參數化查詢時所需的參數;
CommandType:用於設定作業命令的類型;
CommandText:儲存對資料庫的操作命令語句。
Public Sub CreateCommand(ByVal queryString As String,ByVal connectionString As String) Using connection As New SqlConnection(connectionString) Dim command As New SqlCommand() command.Connection = connection command.CommandTimeout = 15 command.CommandType = CommandType.Text command.CommandText = queryString connection.Open() Dim reader As SqlDataReader = command.ExecuteReader() While reader.Read() Console.WriteLine(String.Format("{0}, {1}",reader(0), reader(1))) End While End Using End Sub
Command對象的主要方法:
ExecuteNonQuery():執行一個非查詢形式的SQL語句,返回受影響的行數,主要用於執行對資料庫的增加、更新、刪除操作,查詢的時候不能調用該方法。
Using sqlCon As New SqlConnection("Server=longan-pc\mssqlserver2008;Database=Student;uid=sa;pwd=long") sqlCon.Open() Console.WriteLine(sqlCon.State.ToString) Dim sqlCom As New SqlCommand Dim strSQL As String = "insert into Student_info values(12,'女','小張',78,86,98)" sqlCom.CommandText = strSQL sqlCom.Connection = sqlCon sqlCom.ExecuteNonQuery()End Using
ExecuteReader():執行一個查詢語句,返回一個DataReader對象。
Using sqlCon As New SqlConnection("Server=longan-pc\mssqlserver2008;Database=Student;uid=sa;pwd=long") Dim Username As String = "張晨" Dim i As Integer Console.WriteLine(sqlCon.State.ToString) Dim sqlCom As New SqlCommand Dim strQry As String = "select * from tblOnWork where on_username=@username" sqlCom.Parameters.Add(New SqlParameter("@username", Username)) sqlCom.CommandText = strQry sqlCom.Connection = sqlCon sqlCon.Open() Dim sqlReader As SqlDataReader = sqlCom.ExecuteReader While (sqlReader.Read()) Console.WriteLine(sqlReader.GetString(i)) i = ++i End While End Using
ExecuteScalar ():從資料庫檢索單個值。該方法主要用於統計操作,針對SQL語句執行的結果是一行或一列的結果集,該方法只返回查詢結果集的第一行第一列。
Using sqlCon As New SqlConnection("Server=longan-pc\mssqlserver2008;Database=Student;uid=sa;pwd=long") Console.WriteLine(sqlCon.State.ToString) Dim sqlCom As New SqlCommand Dim strQry As String = "select * from student_info" sqlCom.CommandText = strQry sqlCom.Connection = sqlCon sqlCon.Open() TextBox1.Text = sqlCom.ExecuteScalar(2) End Using三、DataReader對象
DataReader對象是一個讀取行的唯讀流的方式,它只能對資料庫進行讀取不能變更。
DataReader在使用時不能直接進行執行個體化,必須藉助與之相關的Command對象來建立執行個體,例如用SqlCommand的執行個體的ExecuteReader()方法可以建立SqlDataReader執行個體。因為DataReader對象讀取資料時需要與資料庫保持串連,所以在使用完DataReader對象讀取完資料之後應該先調用它的Close()方法關閉,然後才能關閉與之相關Connection對象。
DataReader對象讀取資料的三種方法:
一種是按查詢的時候列的索引用指定的方式來讀取列值,無需做相應轉換,如GetString(int i)就是讀取第i列的值並且轉換成String類型的值。第這種方法的優點是指定列後直接將該列的直接讀取出來了,無需再轉換,缺點是一旦指定的列不能按照指定的方式轉換時就會拋出異常,比如資料庫裡欄位的類型是Double類型或者該欄位的值為空白時按照GetString(i)這種方式讀取會拋出異常。
第二種方式就是按照列索引的方式讀取,在讀取的時候並不進行值轉換,如:reader[5]就是讀取第5列的值(這裡reader是一個Reader對象的執行個體),這樣得到的值是一個object類型的值,這也很好理解,因為在資料庫可能儲存各種類型的值,而object是所有類的基類,所以這個方法不會拋出異常。如果要得到它的正確類型,還需要根據資料庫裡的欄位進行進行相應轉換。
最後一種是按照列名的方式去讀,並且在讀的時候也不進行相應轉換,得到的是object類型的值。
綜合前面三種方式各有特點,第一種方式最直接,但是有可能拋出異常,第二種方式比第一種稍微靈活一些,我們可以根據讀取到值為空白(在.net裡用DBNull類來表示,可以表示資料庫中任意資料類型的空值),我們就不進行相應的類型轉換,避免出現異常。第三種方式按照列的名字來讀取資料,也需要按照第二種方式進行一定的轉換。就效能來說第一種最高,第二種稍低,第三種最低(這很好理解,假設要在一個旅館裡找人直通過房間號找肯定比通過名字找快),就靈活性來說第三種最靈活,第二種次之,第一種最不靈活(假如在後來編寫SQL語句中更改了列的索引,第一種和第二種都可能出現問題)。實際開發中根據實際情況選擇合適的方式。
使用 DataReader 檢索資料的步驟:
1、建立 Command 對象
2、調用 ExecuteReader() 建立 DataReader 對象
3、使用 DataReader 的 Read() 方法逐行讀取資料
4、讀取某列的資料,(type)dataReader[ ]
5、關閉 DataReader 對象
Using sqlCon As New SqlConnection("Server=longan-pc\mssqlserver2008;Database=Student;uid=sa;pwd=long") Dim Username As String = "張晨" Dim i As Integer Console.WriteLine(sqlCon.State.ToString) Dim sqlCom As New SqlCommand Dim strQry As String = "select * from tblOnWork where on_username=@username" sqlCom.Parameters.Add(New SqlParameter("@username", Username)) sqlCom.CommandText = strQry sqlCom.Connection = sqlCon sqlCon.Open() Dim sqlReader As SqlDataReader = sqlCom.ExecuteReader While (sqlReader.Read()) Console.WriteLine(sqlReader.GetString(i)) i = ++i End While End Using四、DataAdapter對象
Dataadapter對象也稱為資料配接器對象,它主要是協調作用,在資料庫和記憶體中的資料集間架設起了橋樑,將資料集中經過編輯後的資料送回資料來源,或者使用資料庫命令對象(Command)規定的操作從資料來源中檢索出資料送往資料集對象(DataSet)。
資料配接器將資料填入資料集時調用方法Fill(),語句如下:
'直接填充表 dataAdapter1.Fill (dataTable) 或者 '填充dataSet11資料集中的"Student"表 dataAdapter1.Fill (dataSet11, "Student")
當dataAdapter1調用Fill() 方法時將使用與之相關聯的命令組件所指定的 SELECT 語句從資料來源中檢索行。然後將行中的資料添加到 DataSet 中的DataTable 對象中或者直接填充到DataTable的執行個體中,如果 DataTable 對象不存在,則自動建立該對象。 當執行上述SELECT語句時,與資料庫的串連必須有效,但不需要用語句將連線物件開啟。如果調用Fill()方法之前與資料庫的串連已經關閉,則將自動開啟它以檢索資料,執行完畢後再自動將其關閉。如果調用Fill()方法之前連線物件已經開啟,則檢索後繼續保持開啟狀態。
注意:一個資料集中可以放置多張資料表。但是每個資料配接器只能夠對應於一張資料表。
DataAdapter常用屬性:
SelectCommand :擷取或設定一個 SQL 陳述式或預存程序,用於在資料來源中選擇記錄;
InsertCommand :擷取或設定一個 SQL 陳述式或預存程序,以在資料來源中插入新記錄;
UpdateCommand :擷取或設定一個 SQL 陳述式或預存程序,用於更新資料來源中的記錄。
DataAdapter對象常用方法:
Fill:想Dataset中填充資料;
Update:將對資料集的操作反應到資料庫中。
注意:DbDataAdapter 具有四個用於從資料來源檢索資料和更新資料來源中資料的屬性: SelectCommand 屬性返回資料來源中的資料; InsertCommand、 UpdateCommand 和 DeleteCommand 屬性用於管理資料來源中的更改。 調用 DataAdapter 的 Fill 方法之前必須設定 SelectCommand 屬性。 在調用 DataAdapter 的 Update 方法之前必須設定
InsertCommand、UpdateCommand 或 DeleteCommand 屬性,具體取決於對 DataTable 中的資料做了哪些更改。 例如,如果已添加行,在調用 Update 之前必須設定 InsertCommand。 當 Update 正在處理已插入、已更新或已刪除的行時,DataAdapter 將使用相應的 Command 屬性來處理該操作。 有關已修改行的當前資訊將通過 Parameters 集合傳遞到 Command 對象。
Public Function CreateSqlDataAdapter(ByVal connection As SqlConnection) As SqlDataAdapter Dim adapter As SqlDataAdapter = New SqlDataAdapter adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey ' 建立執行命令語句 adapter.SelectCommand = New SqlCommand( "SELECT CustomerID, CompanyName FROM CUSTOMERS", connection) adapter.InsertCommand = New SqlCommand( "INSERT INTO Customers (CustomerID, CompanyName) " & _ "VALUES (@CustomerID, @CompanyName)", connection) adapter.UpdateCommand = New SqlCommand( "UPDATE Customers SET CustomerID = @CustomerID, CompanyName = " & _ "@CompanyName WHERE CustomerID = @oldCustomerID", connection) adapter.DeleteCommand = New SqlCommand( "DELETE FROM Customers WHERE CustomerID = @CustomerID", connection) '增加屬性 adapter.InsertCommand.Parameters.Add("@CustomerID", _ SqlDbType.Char, 5, "CustomerID") adapter.InsertCommand.Parameters.Add("@CompanyName", _ SqlDbType.VarChar, 40, "CompanyName") adapter.UpdateCommand.Parameters.Add("@CustomerID", _ SqlDbType.Char, 5, "CustomerID") adapter.UpdateCommand.Parameters.Add("@CompanyName", _ SqlDbType.VarChar, 40, "CompanyName") adapter.UpdateCommand.Parameters.Add("@oldCustomerID", _ SqlDbType.Char, 5, "CustomerID").SourceVersion = _ DataRowVersion.Original adapter.DeleteCommand.Parameters.Add("@CustomerID", _ SqlDbType.Char, 5, "CustomerID").SourceVersion = _ DataRowVersion.Original Return adapter End Function 五、DataSet對象
DataSet對象也稱為資料集對象,DataSet對象用於表示那些儲存在記憶體中的資料,它相當於一個記憶體中的資料庫。它可以包括多個DataTable對象及DataView對象。DataSet主要用於管理儲存在記憶體中的資料以及對資料的斷開操作。 由於DataSet對象提供了一個離線的資料來源,這樣減輕了資料庫以及網路的負擔,在設計程式的時候可以將DataSet對象作為程式的資料來源。
Using sqlCon As New SqlConnection("Server=longan-pc\mssqlserver2008;Database=Student;uid=sa;pwd=long") Console.WriteLine(sqlCon.State.ToString) Dim sqlCom As New SqlCommand Dim strQry As String = "select * from student_info" sqlCom.CommandText = strQry sqlCom.Connection = sqlCon sqlCon.Open() Dim sqlAdapater As New SqlDataAdapter sqlAdapater.SelectCommand = sqlCom Dim da As New DataSet sqlAdapater.Fill(da, "student_info") Dim scb As SqlCommandBuilder = New SqlCommandBuilder(sqlAdapater) Dim dr As DataRow = da.Tables("student_info").NewRow dr(0) = 100 dr(1) = "張冉" dr(2) = "女" dr(3) = Format(Now, "short date") da.Tables("student_info").Rows.Add(dr) sqlAdapater.Update(da, "student_info") End Using