InPowerS.Net

 找回密碼
 註冊
搜索
查看: 2282|回復: 0

[轉貼]Visual Basic.NET中訪問資料的方法

[複製鏈接]
發表於 2008-12-25 22:26:26 | 顯示全部樓層 |閱讀模式
Visual Basic.NET是微軟對Visual Basic語言進行的升級版本。它是一種完全物件導向的程式設計語言。微軟對其進行了很大的改進。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("wj1058", "test")
‘DB.ConnODBC("testODBC")
注釋:DB.ConnOracle("wj1059", "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. wj1058為MS Server伺服器名,wj1059為Oracle伺服器名,"system", "manager"分別為用戶名及口令。
3. 一次僅連接一種資料庫。以上程式在Visual Studio.NET中調試通過。
總結:上面方法介紹了剛面世不久的Visual Basic.NET中有關資料庫的開發,ADO在Visual Basic.NET中的應用,連接幾種最實用的資料庫,且介紹了編寫元件的方法。利用該知識極大地方便了軟體發展者訪問資料的能力,提高了開發效率。
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

小黑屋|Archiver|手機版|InPowerS.Net

GMT+8, 2018-8-22 08:20

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表