Visual Basic.NET訪問數據方法

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

 

  VB.NET作爲VB的升級語言,提供了比VB更加強大的功能。它是一種完全面向對象的編程語言。微軟對其進行了很大的改進。ADO在Visual Basic.NET中不再直接支持。訪問數據有了新的變化,比以前複雜多了。籤於大家比較熟悉ADO,且ADO的確簡單、方便、適用。固本人利用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頁中可找到。(Microsoft ActionX Data Object 20 Library是Microsoft提供的ADO組件。它極大地方便了數據庫的訪問,是開發數據庫有關軟件的最實用的工具之一)

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

  在類中定義一局部連接對象變量。 Private mCnnDB As New ADODB.Connection()
然後定義連接Access數據庫的過程. Access 數據庫是Microsoft開發的本地數據庫,用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是一種廣泛使用的連接多種數據庫的方法,有萬能鑰匙之功效,但它需要通過ODBC先建立一個DNS,這裏不作詳細說明.有了DNS就可訪問所連接的數據庫。訪問ODBC時先指明提供者,提供者只能爲Microsoft 命名的MSDASQL,然後通過連接字符串指定數據源,用戶名和密碼,在下面的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中的應用,連接幾種最實用的數據庫,且介紹了編寫組件的方法。利用該知識極大地方便了軟件開發者訪問數據的能力,提高了開發效率。 

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