第15章 ADO.NET的資料庫存取 15-1 ADO.NET的基礎 15-2 建立SQL Server資料庫連接 15-3 Command與DataReader物件 15-4 DataAdapter與DataSet物件
15-1 ADO.NET的基礎 15-1-1 認識ADO.NET 15-1-2 Windows Form的資料存取模型
15-1-1 認識ADO.NET-說明 資料存取(Data Access)是應用程式非常重要的觀念,Visual Basic應用程式可以使用ADO.NET元件,在.NET Framework平台存取資料庫儲存的記錄資料。 ADO.NET(ActiveX Data Objects.NET)是一種微軟的資料存取技術,可以使用一致的物件模型以.NET資料提供者(Data Provider)來存取資料來源的資料,也就是提供一致的資料處理方式,至於資料來源可以是資料庫、試算表、XML或文字檔案等,幾乎任何資料都可以。
15-1-1 認識ADO.NET-架構 ADO.NET在架構上主要分為兩大元件:DataSet和.NET資料提供者(Data Provider),如右圖所示:
15-1-1 認識ADO.NET-物件說明 物件 說明 Connection 建立與資料來源之間的連接 Command 針對資料來源下達指令,以資料庫來說,就是執行SQL指令敘述 DataReader 從資料來源使用Command物件執行指令,可以取得唯讀(Read-Only)和只能向前(Forward-Only)的串流資料,每一次只能從資料來源讀取一列資料(即一筆)儲存到記憶體,所以執行效率很高 DataSet DataSet物件是由DataTable物件組成的集合物件,簡單的說,DataSet物件就是儲存在記憶體中的資料庫 DataTable 在記憶體儲存一個資料表的記錄資料 DataRelation 在DataTable之間指定關聯性(Relationship)的物件 DataAdapter DataSet和Connection物件資料連接之間的橋樑,可以將資料表的記錄資料填入DataSet物件
15-1-1 認識ADO.NET-命名空間 命名空間 說明 System.Data 提供DataSet、DataTable、DataRow、DataView、DataColumn和DataRelation類別,可以將資料庫的記錄資料儲存到記憶體 System.Data.Common .NET資料提供者的共用類別庫,例如:DbConnection、DbCommand等,這些類別是特定資料提供者的父類別 System.Data.OleDb OLE DB的.NET資料提供者類別,提供類別來處理OLE DB資料來源的資料庫,例如:Access資料庫 System.Data.SqlClient SQL Server的.NET資料提供者,提供類別來處理微軟Microsoft SQL Server 7.0以上版本的資料庫 System.Data.Odbc ODBC的.NET資料提供者,提供類別來處理ODBC資料來源的資料庫 System.Data.OracleClient Oracle的.NET資料提供者,提供類別來處理甲骨文的Oracle資料庫 System.Data.SqlTypes SQL Server資料庫內建資料型別對應的.NET類別或結構
15-1-2 Windows Form的資料存取模型-說明 對於Visual Basic建立的視窗應用程式來說,我們使用ADO.NET元件的目的就是將取得的記錄資料顯示在表單的Windows Form控制項物件。ADO.NET針對Windows Form的資料存取模型,如下圖所示:
15-1-2 Windows Form的資料存取模型- 資料命令模型 資料命令模型是使用Connection物件建立與資料來源的資料連接後,使用Command物件執行指令來取得資料來源的資料,以SQL Server資料庫來說,就是執行T-SQL指令。 在取得資料來源的資料後,使用DataReader物件讀取資料,然後在Windows Form控制項顯示記錄資料。
15-1-2 Windows Form的資料存取模型- 資料集模型 資料集模型是在建立資料庫連接和取得資料來源的資料後,使用DataAdapter物件填入DataSet物件,最後以資料繫結技術,在Windows Form控制項顯示記錄資料。 因為資料集模型需要建立儲存在記憶體中的資料庫,即DataSet物件,所以可以同時處理多個資料表、建立關聯性和進行資料交換,當然也會比資料命令模型佔用較多的系統資源。
15-2 建立SQL Server資料庫連接- 說明 在Visual Basic程式碼使用ADO.NET物件時,我們可以在專案屬性頁勾選、或在類別與模組使用Imports關鍵字匯入SQL Server .NET資料提供者的命名空間,如下所示: Imports System.Data.SqlClient 在匯入後,就可以建立Connection物件來建立資料庫連接,其步驟如下所示: 步驟一:建立資料庫連接物件 步驟二:開啟資料庫連接 步驟三:顯示資料庫連接資訊 步驟四:關閉資料庫連接
15-2 建立SQL Server資料庫連接- 步驟一 在Visual Basic程式首先需要建立Connection物件來連接資料庫,如下所示: Dim objCon As SqlConnection objCon = New SqlConnection(strDbCon) 上述程式碼是使用New運算子建立名為objCon的SqlConnection物件,建構子參數是SQL Server Express資料庫連接字串,如下所示: strDbCon = "Data Source=(LocalDB)\MSSQLLocalDB;" & "AttachDbFilename=” & "|DataDirectory|\選課系統.mdf;" & ";Integrated Security=True"
15-2 建立SQL Server資料庫連接- 步驟二 在建立Connection物件後,就可以使用Open()方法開啟資料庫連接,如下所示; objCon.Open()
15-2 建立SQL Server資料庫連接- 步驟三 在開啟資料庫連接後,即可存取Connection物件的屬性來顯示連接資訊,如下所示; out = "連接字串: " & objCon.ConnectionString & vbNewLine out &= "連接狀態: " & objCon.State & vbNewLine out &= "資料庫: " & objCon.Database & vbNewLine out &= "伺服器版本: " & objCon.ServerVersion & vbNewLine 上述程式碼可以傳回連接的資料庫名稱和目前的連接狀態。
15-2 建立SQL Server資料庫連接- 步驟四 最後需要關閉Connection物件,使用的是Close()方法,如下所示: objCon.Close()
15-2 建立SQL Server資料庫連接- Visual Basic專案 Visual Basic專案:Ch15-2 在Windows應用程式測試連接SQL Server Express資料庫,可以顯示成功建立連接SQL Server資料庫檔案【選課系統.mdf】的連接資訊,如下圖所示:
15-3 Command與DataReader物件 15-3-1 使用Command物件執行SQL指令 15-3-2 執行SQL指令取得單一值 15-3-3 使用DataReader物件讀取記錄資料
15-3-1 使用Command物件執行SQL指令- 步驟一 步驟一:建立與開啟資料庫連接物件 在Visual Basic程式首先需要建立Connection物件來開啟資料庫連接,如下所示: Dim objCon As SqlConnection objCon = New SqlConnection(strDbCon) objCon.Open() 上述程式碼的建構子參數strDbCon是資料庫連接字串,然後使用Open()方法開啟資料庫連接。
15-3-1 使用Command物件執行SQL指令- 步驟二 Dim objCmd As SqlCommand objCmd = New SqlCommand(strSQL, objCon) 上述程式碼使用New運算子建立Command物件objCmd,其建構子參數分別是SQL指令字串和Connection物件objCon。
15-3-1 使用Command物件執行SQL指令- 步驟三 在建立Command物件後,就可以使用ExecuteNonQuery()方法執行建構子參數的SQL指令,如下所示; intRowsAffected = objCmd.ExecuteNonQuery() 上述程式碼可以執行SQL操作指令,傳回值是影響的記錄數。
15-3-1 使用Command物件執行SQL指令- 步驟四 步驟四:關閉資料庫連接 最後使用Close()方法關閉Connection物件,如下所示: objCon.Close()
15-3-1 使用Command物件執行SQL指令- Visual Basic專案 Visual Basic專案:Ch15-3-1 在Windows應用程式連接【選課系統.mdf】的SQL Server資料庫後,在【教授】資料表新增、更新和刪除記錄資料,如下圖所示:
15-3-2 執行SQL指令取得單一值-說明 ADO.NET的Command物件可以使用ExecuteScalar()方法取得單一欄位值,通常是使用在聚合函數的SQL查詢指令,可以取得查詢結果的COUNT()、SUM()、MAX()和MIN()等統計資料,如下所示: lblOutput.Text = objCmd.ExecuteScalar() 上述程式碼執行Command物件objCmd的SQL指令,如果傳回的值不只一筆記錄,取得的就是第一筆記錄的第一個欄位。
15-3-2 執行SQL指令取得單一值- Visual Basic專案 Visual Basic專案:Ch15-3-2 在Windows應用程式連接【選課系統.mdf】的SQL Server資料庫後,只需在文字方塊控制項輸入SQL查詢指令,就可以在下方標籤控制項顯示查詢結果的單一值,如下圖所示:
15-3-3 使用DataReader物件讀取記錄資料- 步驟一 步驟一:建立與開啟資料庫連接物件 在Visual Basic程式首先需要建立Connection物件來開啟資料庫連接,如下所示: Dim objCon As SqlConnection objCon = New SqlConnection(strDbCon) objCon.Open() 上述程式碼的建構子參數strDbCon是資料庫連接字串,使用Open()方法開啟資料庫連接。
15-3-3 使用DataReader物件讀取記錄資料- 步驟二 步驟二:建立Command物件 在開啟資料庫連接後,就可以建立Command物件,其建構子參數分別是SQL指令字串和Connection物件objCon,如下所示; Dim objCmd As SqlCommand objCmd = New SqlCommand(strSQL, objCon)
15-3-3 使用DataReader物件讀取記錄資料- 步驟三 在建立Command物件後,就可以使用ExecuteReader()方法執行SQL指令來取得DataReader物件,如下所示: Dim objDataReader As SqlDataReader objDataReader = objCmd.ExecuteReader() 上述程式碼取得DataReader物件objDataReader。
15-3-3 使用DataReader物件讀取記錄資料- 步驟四 步驟四:取出查詢結果的資料表記錄資料 在取得DataReader物件後,我們可以視為是開啟唯讀的DataReader檔案,只需配合Do While/Loop迴圈就可以讀取記錄資料,新增為ListBox控制項的項目,如下所示: If objDataReader.HasRows Then Do While objDataReader.Read() lstStudents.Items.Add( objDataReader.Item(0) & " - " & objDataReader.Item("姓名")) Loop End If
15-3-3 使用DataReader物件讀取記錄資料- 步驟五 最後使用Close()方法關閉DataReader和Connection物件,如下所示: objDataReader.Close() objCon.Close()
15-3-3 使用DataReader物件讀取記錄資料-Visual Basic專案 Visual Basic專案:Ch15-3-3 在Windows應用程式使用【學生】資料表的欄位新增成ListBox和ComboBox控制項的項目後,當選取項目,即可在下方顯示選擇的項目名稱,如下圖所示:
15-4 DataAdapter與DataSet物件- 步驟一 步驟一:建立與開啟Connection物件 首先使用Connection物件建立資料庫連接物件objCon後,使用Open()方法開啟資料庫連接,如下所示: Dim objCon As SqlConnection objCon = New SqlConnection(strDbCon) objCon.Open()
15-4 DataAdapter與DataSet物件- 步驟二 DataSet物件是使用DataAdapter物件來取得記錄資料,此物件是DataSet與資料來源間的橋樑,可以呼叫方法將記錄資料填入DataSet物件,如下所示: strSQL = "SELECT * FROM 教授" Dim objDataAdapter As SqlDataAdapter objDataAdapter = New SqlDataAdapter(strSQL, objCon)
15-4 DataAdapter與DataSet物件- 步驟三 接著建立DataSet物件,將取得的記錄資料填入DataSet物件,如下所示: Dim objDataSet As DataSet = New DataSet() objDataAdapter.Fill(objDataSet, "教授") 上述程式碼建立DataSet物件後,使用DataAdpater物件的Fill()方法將SQL指令的查詢結果填入第1個參數的DataSet物件。更正確的說,就是新增DataTable物件,第2個參數是DataTable物件的名稱。
15-4 DataAdapter與DataSet物件- 步驟四 步驟四:顯示DataTable物件的所有記錄 在使用DataAdapter物件將資料表的記錄填入DataSet後,就可以使用For Each/Next迴圈從DataTable的DataRowCollection集合物件,取出每一個DataRow物件的記錄,如下所示: For Each objDataRow In objDataSet.Tables("教授").Rows out &= objDataRow("教授編號") & " - " out &= objDataRow("教授姓名") & " - " out &= objDataRow("職稱") & " - " out &= objDataRow("科系") & vbNewLine Next
15-4 DataAdapter與DataSet物件- 步驟五 步驟五:關閉資料庫連接 最後使用Close()方法關閉資料連接,此例的Connection物件為objCon,如下所示: objCon.Close()
15-4 DataAdapter與DataSet物件- Visual Basic專案 Visual Basic專案:Ch15-4 在Windows應用程式建立DataSet物件,並且填入【教授】資料表的記錄資料後,就可以使用按鈕來瀏覽DataSet物件的記錄資料,如下圖所示:
End