文章原始碼: msaccess_sp2.zip
介紹 歡迎來到MS Access預存程序的第二部分討論。第一部分詳細地描述了如何使用ADO.NET和Visual Basic.NET在Access中建立預存程序. 第二部分將會示範如何通過資料庫訪問層訪問在第一部分已經建立的預存程序,你可以模仿它並且用在自己的應用程式裡。這篇文章會詳細地描述如何使用Visual Basic.NET實現資料庫的訪問層。
資料庫層的主要目的是通過類別模組提供一個訪問資料庫的網關。這個類別模組將充當資料庫和應用程式之間的粘合劑。利用資料庫訪問層來訪問資料庫有2個優點:你可以有改變你的後台資料庫技術(從Access改到SQL Server)而不影響應用系統的能力。你還能夠通過在應用程式和資料庫訪問層之間增加一個控制層,來保證傳過去的資料是“純淨”的。在.NET裡,資料庫訪問層通常會包括一個遵循物件導向規範的類別模組,而Visual Basic 的較早的版本會使用一個標準模組來處理。
資料庫訪問層 - 代碼 現在該是我們捲起袖子來看一些代碼的時候了。在添加一個空類以後的第一件事情,就是列出這裡需要使用的.NET類庫,如下所示:
Imports System
Imports System.Data
Imports System.Data.OleDb
System 庫 對大多數程式來說是標準的, 但是我把它作為一個習慣,在所有的代碼中都包含這個類庫。而
System.Data 庫則是一個對於大多數資料庫訪問程式都需要的庫。
System.Data.OleDb 將用在訪問Access所需要的OLE DB Provider。如果我們需要使用SQL Server,則我們最好使用定製的SQL Provider
System.Data.SqlClient.
下一行開始了類的定義
Public Class DBTier
這裡我們定義類名為 DBTier, 並且給他
Public 修飾符, 因此它將可以被其他代碼模組訪問。在類定義以後,將聲明所有要用到的屬性。
Shared connectionString As String = _
"PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Program " _
& "Files\Microsoft Office\Office10\Samples\Northwind.mdb"
這裡只聲明了一個String屬性,connectionString. 這個變數儲存了 Northwind Access資料庫的連接字串。聲明這個變數為Shared,說明它是一個“類變數(Class Variable)”,一個class variable是和類關聯的,二不是和這個類產生的每個對象相關聯。(譯者:VB.Net的Shared 修飾符相當於C++或C#的Static修飾符)
在連接字串的定義之後,你可以看到這裡有3個過程和1個函數。函數返回了一個包含所有產品列表的dataset。它調用了在第一部分已經建立的預存程序 procProductsList.
然後你可以看到3個過程。他們對應於每個預存程序,用於增加、刪除、修改產品;它們都有類似的結構; 每個使用了一個command,並聲明了連線物件和必須的參數。 作為一個例子, 我們來分開討論ProductsDeleteItem過程。理解了這個過程,其他2個就很容易消化了.
一開始,這個過程使用了一個參數, ProductID, 表示需要刪除的產品的ID。
Sub ProductsDeleteItem(ByVal ProductID As Integer)
接著,聲明了所有的變數. 分別用於預存程序將要使用的connection,command和parameter. 這個參數就是需要刪除的那格產品ID.
Dim con As OleDbConnection
Dim cmd As OleDbCommand = New OleDbCommand()
Dim paramProductID As New OleDbParameter()
Command和connection的初始化:
con = New OleDbConnection(connectionString)
cmd.Connection = con
確認了paramProductID 參數的屬性,然後這個參數被添加到Command對象. 在這個例子中,要用到預存程序裡的參數名字是inProductID, 它是一個整型變數,並用函數的參數進行賦值。
With paramProductID
.ParameterName = "inProductID"
.OleDbType = OleDbType.Integer
.Size = 4
.Value = ProductID
End With
cmd.Parameters.Add(paramProductID)
最後一步是真正調用預存程序.
cmd.CommandText = "EXECUTE procProductsDeleteItem"
con.Open()
cmd.ExecuteNonQuery()
con.Close()
注意connection對象這裡只在需要執行預存程序的時候保留,然後就馬上關閉了。這將減少可能有的資源佔用。
雖然這個例子中使用的DBTier類已經清楚的介紹了如何使用Access預存程序, 它的功能仍然需要更多的增強來達到產品級的水平。因為沒有錯誤處理。他仍然需要更多的強化。
本文的原始碼包括了DBTier.vb,這個檔案同時包含了一些簡單的Form來測試類別的實現。
總而言之,我希望您至少通過這些文章獲得了2個資訊:一個是在Microsoft Access中預存程序是存在的並且是不錯的, 雖然有不足。第二個你需要同時理解需要把應用程式的資料庫訪問分解到獨立的類、函數、過程裡面,這將使軟體的維護和升級變得更加容易。
完整的DBTier.vb:
Imports System
Imports System.Data
Imports System.Data.OleDb
' Functions and subroutines for executing Stored Procedures in Access.
Public Class DBTier
' Change Data Source to the location of Northwind.mdb on your local
' system.
Shared connectionString As String = _
"PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Program " _
& "Files\Microsoft Office\Office10\Samples\Northwind.mdb"
' This function returns a dataset containing all records in
' the Products Table.
Function ProductsList() As DataSet
Dim con As OleDbConnection
Dim da As OleDbDataAdapter
Dim ds As DataSet
Dim sSQL As String
sSQL = "EXECUTE procProductsList"
con = New OleDbConnection(connectionString)
da = New OleDbDataAdapter(sSQL, con)
ds = New DataSet()
da.Fill(ds, "Products")
Return ds
End Function
' This Function adds one record to the Products table.
Sub ProductsAddItem(ByVal ProductName As String, _
ByVal SupplierID As Integer, ByVal CategoryID As Integer)
Dim con As OleDbConnection
Dim cmd As OleDbCommand = New OleDbCommand()
Dim paramProductName As New OleDbParameter()
Dim paramSupplierID As New OleDbParameter()
Dim paramCategoryID As New OleDbParameter()
con = New OleDbConnection(connectionString)
cmd.Connection = con
With paramProductName
.ParameterName = "inProductName"
.OleDbType = OleDbType.VarChar
.Size = 40
.Value = ProductName
End With
cmd.Parameters.Add(paramProductName)
With paramSupplierID
.ParameterName = "inSupplierID"
.OleDbType = OleDbType.Integer
.Size = 4
.Value = SupplierID
End With
cmd.Parameters.Add(paramSupplierID)
With paramCategoryID
.ParameterName = "inCategoryID"
.OleDbType = OleDbType.Integer
.Size = 4
.Value = CategoryID
End With
cmd.Parameters.Add(paramCategoryID)
' This function Updates a specific JobTitle Record with new data.
Sub ProductsUpdateItem(ByVal ProductID As Integer, _
ByVal ProductName As String)
Dim con As OleDbConnection
Dim cmd As OleDbCommand = New OleDbCommand()
Dim paramProductName As New OleDbParameter()
Dim paramProductID As New OleDbParameter()
con = New OleDbConnection(connectionString)
cmd.Connection = con
With paramProductID
.ParameterName = "inProductID"
.OleDbType = OleDbType.Integer
.Size = 4
.Value = ProductID
End With
cmd.Parameters.Add(paramProductID)
With paramProductName
.ParameterName = "inProductName"
.OleDbType = OleDbType.VarChar
.Size = 40
.Value = ProductName
End With
cmd.Parameters.Add(paramProductName)
' This function deletes one record from the Products table.
Sub ProductsDeleteItem(ByVal ProductID As Integer)
Dim con As OleDbConnection
Dim cmd As OleDbCommand = New OleDbCommand()
Dim paramProductID As New OleDbParameter()
con = New OleDbConnection(connectionString)
cmd.Connection = con
With paramProductID
.ParameterName = "inProductID"
.OleDbType = OleDbType.Integer
.Size = 4
.Value = ProductID
End With
cmd.Parameters.Add(paramProductID)