Visual Basic.NET中访问数据的方法(zz)
?????? 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("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中的應用,連接幾種最實用的數據庫,且介紹了編寫組件的方法。利用該知識極大地方便了軟件開發者訪問數據的能力,提高了開發效率。?
轉載于:https://www.cnblogs.com/penboy/archive/2005/03/22/123183.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Visual Basic.NET中访问数据的方法(zz)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三周大事记
- 下一篇: 贫血的Domain Model之说