Visual Basic.NET中使用ADO訪問數據庫

Visual Basic.NET中使用ADO訪問數據庫
[日期:2007-07-20] 來源:  作者: [字體:大 中 小] 


  .NET中以 ADO.NET取代以前的ADO。用慣ADO的程序員怎樣在.NET中怎樣應用ADO呢?本人經過不斷的摸索,發現在.NET中ADO一樣可以用,並且很好用。現在結合Visual Basic.NET強大的類開發功能,本人將ADO開發成組件使用,效果非常理想。我使用的方法如下:

  啓動Visual Studio.NET。在新建項目中選擇Visual Basic項目,在模板中選擇類庫,在名稱中輸入類庫名稱如DataAccess.確定後,則進入類庫開發環境中,把Class1換名爲ADOAccess。

  在項目菜單中加入引用,選擇COM頁,找到 Microsoft ActionX Data Object 20 Library 或更高版本。COM選項是Microsoft爲了區分現在的.NET,兼容以前的開發方式而設置的,凡是.NET之前的組件都可在COM頁中可找到。

  在類名上面寫上Imports ADODB.Connection; Imports ADODB.Recordset ;Imports ADODB.CursorLocationEnum; Imports System.DBNull 4條引用語句,這裏分別是引用ADO,ADO的宏定義,設置空值函數的來源。

  在類中定義一局部連接對象變量。 Private mCnnDB As New ADODB.Connection()
然後定義連接Access數據庫的過程. Access 數據庫用adUseClient指定,通過Microsoft.Jet.OLEDB數據訪問方式訪問數據庫,Microsoft.Jet.OLEDB又有多種版本,其中4.0是最高版本,它能訪問ACCESS 2000,所以這裏的數據提供者指定爲Microsoft.Jet.OLEDB.4.0。指定了本地數據庫和提供者後,就可打開一個數據庫了,用open方法實現。完整的代碼如下:

''作用: 連接Access數據庫
''參數: DBName 數據庫名
Public Sub ConnAccess(ByVal DBName As String)
Dim strDB As String
mCnnDB.CursorLocation = adUseClient
mCnnDB.Provider = "Microsoft.Jet.OLEDB.4.0"
mCnnDB.Open(DBName, "Admin")
End Sub

  在ODBC中設置DNS,在下面的ConnectionString中指定用戶名和密碼,最後用open方法打開。由於ODBC分有用戶名和無用戶名兩者,我們必須分別實現,藉助類的函數名重載功能,我們編寫兩個同名的過程,完整的代碼如下:

''作用: 連接ODBC數據庫(不需指定用戶和密碼 )
''參數:dsnName爲ODBC名
Public Sub ConnODBC(ByVal dsnName As String)
mCnnDB.Provider = "MSDASQL"
mCnnDB.ConnectionString = "Data Source=''" & dsnName & "''"
mCnnDB.Open()
End Sub

''作用: 連接ODBC數據庫(需指定用戶和密碼 )
''參數:dsnName ODBC名,UserID 用戶名,UserPwd 用戶密碼
Public Sub ConnODBC(ByVal dsnName As String, ByVal UserID As String, ByVal UserPwd As String) mCnnDB.Provider = "MSDASQL"
mCnnDB.ConnectionString = "Data Source=''" & dsnName & "''User ID=''" & UserID & "'';" & _
"Password=''" & UserPwd & "
mCnnDB.Open()
End Sub 


  SQL Server數據庫是Microsoft開發的一種廣泛使用的後臺數據庫。訪問SQL Server可以通過指明ODBC驅動程序爲SQL Server來實現,即在連接字符串中要有driver={SQL Server},由於它是後臺數據庫,所以必須指明SQL Server所在的計算機名,通常把它稱爲服務器,下面的ServerName就說明這點,然後指明是連接哪個數據庫。其它的類似上面的ODBC。SQL Server的用戶分爲WIN NT 和授權用戶,WIN NT用戶是不需要指定用戶名和密碼的超級用戶,否則要指明用戶名和密碼,這決定於SQL Server數據庫管理員,在此不作詳細說明,完整的代碼如下:


''作用: 連接SQL Server數據庫
''參數:ServerName 服務器名,DBName 數據庫名
Public Sub ConnSQLServer(ByVal ServerName As String, ByVal DBName As String)
With mCnnDB
.ConnectionString = "uid=;pwd= ;driver={SQL Server};" & _
"server=" & ServerName & _
";database=" & DBName
.Open()
End With
End Sub
''作用: 連接SQL Server數據庫
''參數:ServerName 服務器名,DBName 數據庫名,UserID 用戶名,UserPwd 用戶密碼
Public Sub ConnSQLServer(ByVal ServerName As String, ByVal DBName As String,ByVal UserID As String, ByVal UserPwd As String)
With mCnnDB
.ConnectionString = "uid=''" & UserID & "'';pwd=''" & UserPwd &"'';driver={SQL Server};" & _
"server=" & ServerName & _
";database=" & DBName
.Open()
End With
End Sub
 

  Oracle數據庫是目前最有影響的一種廣泛使用的後臺數據庫。訪問Oracle先指明其提供者MSDAORA。Oracle與Sql Server不同的是它不是通過數據庫來管理的,所以它不需指明數據庫,但它連接時必須指明用戶,即使是超級用戶也如此,這是它的安全性能高於Sql Server的理現之一,所以我們只須編寫一個過程。其它類似。完整的代碼如下:


''作用: 連接Oracle數據庫
''參數:ServerName 服務器名,DBName 數據庫名,UserID 用戶名,UserPwd 用戶密碼
Public Sub ConnOracle(ByVal ServerName As String, ByVal UserID As String, ByVal UserPwd As String)
With mCnnDB
.Provider = "MSDAORA"
.ConnectionString = "User ID=''" & UserID & "'';" & _
"Password=''" & UserPwd & "'';" & _
"Data Source=''" & ServerName & "''"
.Open()
End With
End Sub

  連結數據庫後,就可以利用ADO擴充讀寫數據的函數。

  ADO在訪問表時要指明其光標類型和鎖類型,且指定其讀寫權限,這裏我們編寫的是有讀寫權限的通用的函數,所以我們指定光標CursorType爲adOpenKeyset,鎖爲adLockOptimistic,.NET需指明其來源,這是爲什麼開始要有 "Imports ADODB.CursorLocationEnum"語句的原因。有了這些,就可通過執行查詢語句來打開一個表。打開表後,我們判斷表是否爲空表,不是則移動記錄至尾後再現移至記錄頭(這是爲了可以訪問其中每條記錄,特別是用RecordCount求記錄數時不至於返回-1的關鍵),最後返回一個記錄集,完整的代碼如下:


''作用:連接表
''參數:TableName表名
''返回:記錄集
Public Function OpenTable(ByVal TableName) As ADODB.Recordset
Dim strSql As String
Dim rec As ADODB.Recordset
rec = New ADODB.Recordset()
rec.CursorType = ADODB.CursorTypeEnum.adOpenKeyset
rec.LockType = ADODB.LockTypeEnum.adLockOptimistic
strSql = "SELECT * FROM " & TableName
rec.Open(strSql, mCnnDB) ''打開記錄集
If Not rec.EOF Then
rec.MoveLast()
rec.MoveFirst()
End If
OpenTable = rec
End Function

  下面是擴充上面函數的功能,可以跟據條件訪問單個表。


Public Overloads Function OpenTable(ByVal TableName As String, ByVal strWhere As String) As ADODB.Recordset
Dim strSql As String
Dim rec As ADODB.Recordset
rec = New ADODB.Recordset()
rec.CursorType = ADODB.CursorTypeEnum.adOpenKeyset
rec.LockType = ADODB.LockTypeEnum.adLockOptimistic
strSql = "SELECT * FROM " & TableName & " where " & strWhere
rec.Open(strSql, mCnnDB) ''打開記錄集
If Not rec.EOF Then
rec.MoveLast()
rec.MoveFirst()
End If
Return rec
End Function

  繼續擴充訪問表的功能。有時要打開多個表,讀寫其中的數據,我們可以通過建立查詢視圖實現,其它類似上面的OpenTable,完整的代碼如下:


''作用:連接多表
''參數:strSQL
''返回:記錄集
Public Function ExecuteSQL(ByVal strSql As String) As ADODB.Recordset
Dim rec As New ADODB.Recordset()
rec.CursorType = ADODB.CursorTypeEnum.adOpenKeyset
rec.LockType = ADODB.LockTypeEnum.adLockOptimistic
rec.Open(strSql, mCnnDB) ''打開記錄集
ExecuteSQL = rec
End Function


  下面編寫了一個用記錄集填充AxMSFlexGrid網格的過程。其中函數RecordCount是我自己編寫的求記錄集中記錄的函數。這裏不能直接用ADO的RecordCount求得。如果記錄集是空,則退出過程。否則求出記錄集的記錄數和字段來確定AxMSFlexGrid網格的行列數據,然後讀出記錄集的數據直接填充到AxMSFlexGrid網格。要說明的是讀出記錄集的數據時要先判斷是否爲空值,由函數IsDBNull實現(函數IsDBNull來源於System.DBNull).最後記錄集應該返回到記錄首位,否則影響了原有的記錄集,完整的代碼如下:


''作用:用記錄集的數據填充網格
''參數:MSGrid 網格對象,rec 記錄集對象
Public Sub FillMsGrid(ByVal MSGrid As AxMSFlexGridLib.AxMSFlexGrid, ByVal rec As ADODB.Recordset)
Dim i, j, RecordNum As Integer
If rec.EOF Then Exit Sub
RecordNum = RecordCount(rec)
MSGrid.Rows = RecordNum + 1
MSGrid.Cols = rec.Fields.Count + 1
For i = 0 To RecordNum - 1
For j = 0 To rec.Fields.Count - 1
If IsDBNull(rec(j).Value) Then
MSGrid.set_TextMatrix(i + 1, j + 1, "")
Else
MSGrid.set_TextMatrix(i + 1, j + 1, rec(j).Value)
End If
Next
MSGrid.set_TextMatrix(i + 1, 0, i)
rec.MoveNext()
Next
rec.MoveFrist()
End Sub
''作用:取記錄集的記錄數
''參數:rec 記錄集對象
''返回:記錄集的記錄數

Public Function RecordCount(ByVal rec As ADODB.Recordset) As Integer
Dim i As Integer
If rec.EOF Then
RecordCount = 0
Exit Function
End If
With rec
.MoveFirst()
Do While Not .EOF
i += 1
.MoveNext()
Loop
.MoveFirst()
End With
RecordCount = i
End Function
 

  以上代碼編好後放在所定義的類中.下面的省略號代表上面的函數和過程。可直接生成爲DLL組件。方法是在.NET編輯環境下選擇生成菜單中按生成就生成了DLL文件。然後,你可以直接調用該組件了。


Imports ADODB.Connection
Imports ADODB.Recordset
Imports ADODB.CursorLocationEnum
Imports System.DBNull ''函數IsDBNull的來源
Class ADOAccess
Private mCnnDB As New ADODB.Connection()

End Class 

  調用上面生成的組件方法如下:在Visual Basic.NET中建立一項目,在窗口Form1中加入一AxMSFlexGrid網格命名爲MsGrid1,佈置如下

  然後引用剛建立的Dll。方法是選擇項目菜單的添加引用,選擇項目頁,按瀏覽找到其DLL文件確定後引用完成。在Form1中定義一ADOAccess對象,在Load事件中編寫調用代碼,分別測試其功能,代碼如下:


Public Class Form1
Inherits System.Windows.Forms.Form
Dim DB As New ADOAccess()
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim rec As New ADODB.Recordset()
''DB.ConnAccess("e:/test.mdb")
''DB.ConnSQLServer("wj-1058", "test")
''DB.ConnODBC("testODBC")
''DB.ConnOracle("wj-1059", "system", "manager")
''rec = DB.OpenTable("DEMO.customer")
rec = DB.OpenTable("doc_file")
DB.FillMsGrid(MSGrid1, rec)
End Sub

  說明:

  1.你的機上要有Access數據庫文件(e:/test.mdb),MS Server數據庫中有數據庫test,doc_file 爲test中的表,Oracle數據庫中有表DEMO.customer

  2. wj-1058爲MS Server服務器名,wj-1059爲Oracle服務器名,"system", "manager"分別爲用戶名及口令。

  3. 一次僅連接一種數據庫。

  以上程序在Visual Studio.NET中調試通過。 

  總結:上面方法介紹了剛面世不久的Visual Basic.NET中有關數據庫的開發,ADO在Visual Basic.NET中的應用,連接幾種最實用的數據庫,且介紹了編寫組件的方法。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章