启动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数据库
  '作用: 连接Access数据库  '参数: DBName 数据库名
  '参数: DBName 数据库名  Public Sub ConnAccess(ByVal DBName As String)
  Public Sub ConnAccess(ByVal DBName As String)  Dim strDB As String
  Dim strDB As String  mCnnDB.CursorLocation = adUseClient
  mCnnDB.CursorLocation = adUseClient  mCnnDB.Provider = "Microsoft.Jet.OLEDB.4.0"
  mCnnDB.Provider = "Microsoft.Jet.OLEDB.4.0"  mCnnDB.Open(DBName, "Admin")
  mCnnDB.Open(DBName, "Admin")  End Sub
  End Sub   ODBC是一种广泛使用的连接多种数据库的方法,有万能钥匙之功效,但它需要通过ODBC先建立一个DNS,这里不作详细说明.有了DNS就可访问所连接的数据库。访问ODBC时先指明提供者,提供者只能为Microsoft 命名的MSDASQL,然后通过连接字符串指定数据源,用户名和密码,在下面的ConnectionString中指定,最后用open打开。由于ODBC分有用户名和无用户名两者,我们必须分别实现,借助类的函数名重载功能,我们编写两个同名的过程,完整的代码如下: 
 '作用: 连接ODBC数据库(不需指定用户和密码 )
  '作用: 连接ODBC数据库(不需指定用户和密码 )  '参数:dsnName为ODBC名
  '参数:dsnName为ODBC名  Public Sub ConnODBC(ByVal dsnName As String)
  Public Sub ConnODBC(ByVal dsnName As String)  mCnnDB.Provider = "MSDASQL"
  mCnnDB.Provider = "MSDASQL"  mCnnDB.ConnectionString = "Data Source='" & dsnName & "'"
  mCnnDB.ConnectionString = "Data Source='" & dsnName & "'"  mCnnDB.Open()
  mCnnDB.Open()  End Sub
  End Sub 
 '作用: 连接ODBC数据库(需指定用户和密码 )
  '作用: 连接ODBC数据库(需指定用户和密码 )  '参数:dsnName ODBC名,UserID 用户名,UserPwd 用户密码
  '参数:dsnName ODBC名,UserID 用户名,UserPwd 用户密码  Public Sub ConnODBC(ByVal dsnName As String, ByVal UserID As String, ByVal UserPwd As String)  mCnnDB.Provider = "MSDASQL"
  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 & "';" & _
  mCnnDB.ConnectionString = "Data Source='" & dsnName & "'User ID='" & UserID & "';" & _  "Password='" & UserPwd & "
  "Password='" & UserPwd & "  mCnnDB.Open()
  mCnnDB.Open()  End Sub
  End Sub  '作用: 连接SQL Server数据库
  '作用: 连接SQL Server数据库  '参数:ServerName 服务器名,DBName 数据库名
  '参数:ServerName 服务器名,DBName 数据库名  Public Sub ConnSQLServer(ByVal ServerName As String, ByVal DBName As String)
  Public Sub ConnSQLServer(ByVal ServerName As String, ByVal DBName As String)  With mCnnDB
  With mCnnDB  .ConnectionString = "uid=;pwd= ;driver={SQL Server};" & _
  .ConnectionString = "uid=;pwd= ;driver={SQL Server};" & _  "server=" & ServerName & _
  "server=" & ServerName & _  ";database=" & DBName
  ";database=" & DBName  .Open()
  .Open()  End With
  End With  End Sub
  End Sub  '作用: 连接SQL Server数据库
  '作用: 连接SQL Server数据库  '参数:ServerName 服务器名,DBName 数据库名,UserID 用户名,UserPwd 用户密码
  '参数:ServerName 服务器名,DBName 数据库名,UserID 用户名,UserPwd 用户密码  Public Sub ConnSQLServer(ByVal ServerName As String, ByVal DBName As String,ByVal UserID As String,     ByVal UserPwd As String)
  Public Sub ConnSQLServer(ByVal ServerName As String, ByVal DBName As String,ByVal UserID As String,     ByVal UserPwd As String)  With mCnnDB
  With mCnnDB  .ConnectionString = "uid=’” & UserID & “’;pwd=’” & UserPwd &”’;driver={SQL Server};" & _
  .ConnectionString = "uid=’” & UserID & “’;pwd=’” & UserPwd &”’;driver={SQL Server};" & _  "server=" & ServerName & _
  "server=" & ServerName & _  ";database=" & DBName
  ";database=" & DBName  .Open()
  .Open()  End With
  End With  End Sub
  End Sub   Oracle数据库是目前最有影响的一种广泛使用的后台数据库。访问Oracle先指明其提供者MSDAORA。Oracle与Sql Server不同的是它不是通过数据库来管理的,所以它不需指明数据库,但它连接时必须指明用户,即使是超级用户也如此,这是它的安全性能高于Sql Server的理现之一,所以我们只须编写一个过程。其它类似。完整的代码如下: 
 '作用: 连接Oracle数据库
  '作用: 连接Oracle数据库  '参数:ServerName 服务器名,DBName 数据库名,UserID 用户名,UserPwd 用户密码
  '参数:ServerName 服务器名,DBName 数据库名,UserID 用户名,UserPwd 用户密码  Public Sub ConnOracle(ByVal ServerName As String, ByVal UserID As String, ByVal UserPwd As String)
  Public Sub ConnOracle(ByVal ServerName As String, ByVal UserID As String, ByVal UserPwd As String)  With mCnnDB
  With mCnnDB  .Provider = "MSDAORA"
  .Provider = "MSDAORA"  .ConnectionString = "User ID='" & UserID & "';" & _
  .ConnectionString = "User ID='" & UserID & "';" & _  "Password='" & UserPwd & "';" & _
  "Password='" & UserPwd & "';" & _  "Data Source='" & ServerName & "'"
  "Data Source='" & ServerName & "'"  .Open()
  .Open()  End With
  End With  End Sub
  End Sub 有了上面的连接数据库的方法,我们就直接可读写数据了。下面利用ADO扩充读写数据的函数。
ADO在访问表时要指明其光标类型和锁类型,且指定不同其权限就不同,权限分为读写二种,这里我们编写的是有读写权限的通用的函数,所以我们指定光标CursorType为adOpenKeyset,锁为开锁adLockOptimistic,.net需指明其来源,这是为什么开始要有 “Imports ADODB.CursorLocationEnum”语句的原因。有了这些,就可通过执行查询语句来打开一个表。打开表后,我们判断表是否为空表,不是则移动记录至尾后再现移至记录头(这是为了可以访问其中每条记录,特别是用RecordCount求记录数时不至有时返回-1的关键),最后返回一个记录集,完整的代码如下:
 '作用:连接表
  '作用:连接表  '参数:TableName表名
  '参数:TableName表名  '返回:记录集
  '返回:记录集  Public Function OpenTable(ByVal TableName) As ADODB.Recordset
  Public Function OpenTable(ByVal TableName) As ADODB.Recordset  Dim strSql As String
  Dim strSql As String  Dim rec As ADODB.Recordset
  Dim rec As ADODB.Recordset  rec = New ADODB.Recordset()
  rec = New ADODB.Recordset()  rec.CursorType = ADODB.CursorTypeEnum.adOpenKeyset
  rec.CursorType = ADODB.CursorTypeEnum.adOpenKeyset  rec.LockType = ADODB.LockTypeEnum.adLockOptimistic
  rec.LockType = ADODB.LockTypeEnum.adLockOptimistic  strSql = "SELECT * FROM " & TableName
  strSql = "SELECT * FROM " & TableName  rec.Open(strSql, mCnnDB) '打开记录集
  rec.Open(strSql, mCnnDB) '打开记录集  If Not rec.EOF Then
  If Not rec.EOF Then  rec.MoveLast()
  rec.MoveLast()  rec.MoveFirst()
  rec.MoveFirst()  End If
  End If  OpenTable = rec
  OpenTable = rec  End Function
  End Function   下面是扩充上面函数的功能,可以跟据条件访问单个表。 
 Public Overloads Function OpenTable(ByVal TableName As String, ByVal strWhere As String) As    ADODB.Recordset
  Public Overloads Function OpenTable(ByVal TableName As String, ByVal strWhere As String) As    ADODB.Recordset  Dim strSql As String
  Dim strSql As String  Dim rec As ADODB.Recordset
  Dim rec As ADODB.Recordset  rec = New ADODB.Recordset()
  rec = New ADODB.Recordset()  rec.CursorType = ADODB.CursorTypeEnum.adOpenKeyset
  rec.CursorType = ADODB.CursorTypeEnum.adOpenKeyset  rec.LockType = ADODB.LockTypeEnum.adLockOptimistic
  rec.LockType = ADODB.LockTypeEnum.adLockOptimistic  strSql = "SELECT * FROM " & TableName & " where " & strWhere
  strSql = "SELECT * FROM " & TableName & " where " & strWhere  rec.Open(strSql, mCnnDB) '打开记录集
  rec.Open(strSql, mCnnDB) '打开记录集  If Not rec.EOF Then
  If Not rec.EOF Then  rec.MoveLast()
  rec.MoveLast()  rec.MoveFirst()
  rec.MoveFirst()  End If
  End If  Return rec
  Return rec  End Function
  End Function   我们继续扩充访问表的功能。有时要打开多个表,读写其中的数据,我们可以通过建立查询视图实现,其它类似上面的OpenTable,完整的代码如下: 
 '作用:连接多表
  '作用:连接多表  '参数:strSQL
  '参数:strSQL  '返回:记录集
  '返回:记录集  Public Function ExecuteSQL(ByVal strSql As String) As ADODB.Recordset
  Public Function ExecuteSQL(ByVal strSql As String) As ADODB.Recordset  Dim rec As New ADODB.Recordset()
  Dim rec As New ADODB.Recordset()  rec.CursorType = ADODB.CursorTypeEnum.adOpenKeyset
  rec.CursorType = ADODB.CursorTypeEnum.adOpenKeyset  rec.LockType = ADODB.LockTypeEnum.adLockOptimistic
  rec.LockType = ADODB.LockTypeEnum.adLockOptimistic  rec.Open(strSql, mCnnDB) '打开记录集
  rec.Open(strSql, mCnnDB) '打开记录集  ExecuteSQL = rec
  ExecuteSQL = rec  End Function
  End Function   下面编写了一个用记录集填充AxMSFlexGrid网格的过程。其中函数RecordCount是我自己编写的求记录集中记录数据的函数。这里不能直接用ADO的RecordCount求得。如果记录集是空,则退出过程。否则求出记录集的记录数和字段数据用来确定AxMSFlexGrid网格的行列数据,然后读出记录集的数据直接填充到AxMSFlexGrid网格。要说明的是读出记录集的数据时要先判断是否为空值,由函数IsDBNull实现(函数IsDBNull来源于System.DBNull).最后记录集应该返回到记录首位,否则影响了原有的记录集,完整的代码如下:
 
 '作用:用记录集的数据填充网格
'作用:用记录集的数据填充网格  '参数:MSGrid 网格对象,rec 记录集对象
'参数:MSGrid 网格对象,rec 记录集对象  Public Sub FillMsGrid(ByVal MSGrid As AxMSFlexGridLib.AxMSFlexGrid, ByVal rec As  ADODB.Recordset)
  Public Sub FillMsGrid(ByVal MSGrid As AxMSFlexGridLib.AxMSFlexGrid, ByVal rec As  ADODB.Recordset)  Dim i, j, RecordNum As Integer
  Dim i, j, RecordNum As Integer  If rec.EOF Then Exit Sub
  If rec.EOF Then Exit Sub  RecordNum = RecordCount(rec)
  RecordNum = RecordCount(rec)  MSGrid.Rows = RecordNum + 1
  MSGrid.Rows = RecordNum + 1  MSGrid.Cols = rec.Fields.Count + 1
  MSGrid.Cols = rec.Fields.Count + 1  For i = 0 To RecordNum - 1
  For i = 0 To RecordNum - 1  For j = 0 To rec.Fields.Count - 1
  For j = 0 To rec.Fields.Count - 1  If IsDBNull(rec(j).value) Then
  If IsDBNull(rec(j).value) Then  MSGrid.set_TextMatrix(i + 1, j + 1, "")
  MSGrid.set_TextMatrix(i + 1, j + 1, "")  Else
  Else  MSGrid.set_TextMatrix(i + 1, j + 1, rec(j).value)
  MSGrid.set_TextMatrix(i + 1, j + 1, rec(j).value)  End If
  End If  Next
  Next  MSGrid.set_TextMatrix(i + 1, 0, i)
  MSGrid.set_TextMatrix(i + 1, 0, i)  rec.MoveNext()
  rec.MoveNext()  Next
  Next  rec.MoveFrist()
  rec.MoveFrist()  End Sub
  End Sub  '作用:取记录集的记录数
  '作用:取记录集的记录数  '参数:rec 记录集对象
  '参数:rec 记录集对象  '返回:记录集的记录数
  '返回:记录集的记录数  Public Function RecordCount(ByVal rec As ADODB.Recordset) As Integer
  Public Function RecordCount(ByVal rec As ADODB.Recordset) As Integer  Dim i As Integer
  Dim i As Integer  If rec.EOF Then
  If rec.EOF Then  RecordCount = 0
  RecordCount = 0  Exit Function
  Exit Function  End If
  End If  With rec
  With rec  .MoveFirst()
  .MoveFirst()  Do While Not .EOF
  Do While Not .EOF  i += 1
  i += 1  .MoveNext()
  .MoveNext()  Loop
  Loop  .MoveFirst()
  .MoveFirst()  End With
  End With  RecordCount = i
  RecordCount = i  End Function
  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
  Public Class Form1  Inherits System.Windows.Forms.Form
  Inherits System.Windows.Forms.Form  Dim DB As New ADOAccess()
  Dim DB As New ADOAccess()  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles   MyBase.Load
  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles   MyBase.Load  Dim rec As New ADODB.Recordset()
  Dim rec As New ADODB.Recordset()  'DB.ConnAccess("e:\test.mdb")
  'DB.ConnAccess("e:\test.mdb")  'DB.ConnSQLServer("wj-1058", "test")
  'DB.ConnSQLServer("wj-1058", "test")  ‘DB.ConnODBC("testODBC")
  ‘DB.ConnODBC("testODBC")  'DB.ConnOracle("wj-1059", "system", "manager")
  'DB.ConnOracle("wj-1059", "system", "manager")  'rec = DB.OpenTable("DEMO.customer")
  'rec = DB.OpenTable("DEMO.customer")  rec = DB.OpenTable("doc_file")
  rec = DB.OpenTable("doc_file")  DB.FillMsGrid(MSGrid1, rec)
  DB.FillMsGrid(MSGrid1, rec)  End Sub
  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中的应用,连接几种最实用的数据库,且介绍了编写组件的方法。利用该知识极大地方便了软件开发者访问数据的能力,提高了开发效率。 
 
                    
                     
                    
                 
                    
                 
        
 
   
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号