'作用: 连接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数据库(不需指定用户和密码 ) '参数: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数据库 '参数: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 |
'作用:用记录集的数据填充网格 '参数: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中的应用,连接几种最实用的数据库,且介绍了编写组件的方法。