c#

位置:IT落伍者 >> c# >> 浏览文章

在Visual Basic.NET使用ADO访问数据库


发布日期:2021年02月22日
 
在Visual Basic.NET使用ADO访问数据库
NET中以 ADONET取代以前的ADO用惯ADO的程序员怎样在NET中怎样应用ADO呢?本人经过不断的摸索发现在NET中ADO一样可以用并且很好用现在结合Visual BasicNET强大的类开发功能本人将ADO开发成组件使用效果非常理想我使用的方法如下

启动Visual StudioNET在新建项目中选择Visual Basic项目在模板中选择类库在名称中输入类库名称如DataAccess确定后则进入类库开发环境中把Class换名为ADOAccess

在项目菜单中加入引用选择COM页找到 Microsoft ActionX Data Object Library 或更高版本COM选项是Microsoft为了区分现在的NET兼容以前的开发方式而设置的凡是NET之前的组件都可在COM页中可找到

在类名上面写上Imports ADODBConnection Imports ADODBRecordset Imports ADODBCursorLocationEnum Imports SystemDBNull 条引用语句这里分别是引用ADOADO的宏定义设置空值函数的来源

在类中定义一局部连接对象变量 Private mCnnDB As New ADODBConnection()然后定义连接Access数据库的过程 Access 数据库用adUseClient指定通过MicrosoftJetOLEDB数据访问方式访问数据库MicrosoftJetOLEDB又有多种版本其中是最高版本它能访问ACCESS 所以这里的数据提供者指定为MicrosoftJetOLEDB指定了本地数据库和提供者后就可打开一个数据库了用open方法实现完整的代码如下

作用: 连接Access数据库

参数: DBName 数据库名

Public Sub ConnAccess(ByVal DBName As String)

Dim strDB As String

mCnnDBCursorLocation = adUseClient

mCnnDBProvider = MicrosoftJetOLEDB

mCnnDBOpen(DBName Admin)

End Sub

在ODBC中设置DNS在下面的ConnectionString中指定用户名和密码最后用open方法打开由于ODBC分有用户名和无用户名两者我们必须分别实现借助类的函数名重载功能我们编写两个同名的过程完整的代码如下

作用: 连接ODBC数据库(不需指定用户和密码 )

参数dsnName为ODBC名

Public Sub ConnODBC(ByVal dsnName As String)

mCnnDBProvider = MSDASQL

mCnnDBConnectionString = Data Source= & dsnName &

mCnnDBOpen()

End Sub

作用: 连接ODBC数据库(需指定用户和密码 )

参数dsnName ODBC名UserID 用户名UserPwd 用户密码

Public Sub ConnODBC(ByVal dsnName As String ByVal UserID As String ByVal UserPwd As String) mCnnDBProvider = MSDASQL

mCnnDBConnectionString = Data Source= & dsnName & User ID= & UserID & ; & _

Password= & UserPwd &

mCnnDBOpen()

End Sub

SQL Server数据库是Microsoft开发的一种广泛使用的后台数据库访问SQL Server可以通过指明ODBC驱动程序为SQL Server来实现即在连接字符串中要有driver={SQL Server}由于它是后台数据库所以必须指明SQL Server所在的计算机名通常把它称为服务器下面的ServerName就说明这点然后指明是连接哪个数据库其它的类似上面的ODBCSQL 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 StringByVal 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先指明其提供者MSDAORAOracle与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锁为adLockOptimisticNET需指明其来源这是为什么开始要有 Imports ADODBCursorLocationEnum语句的原因有了这些就可通过执行查询语句来打开一个表打开表后我们判断表是否为空表不是则移动记录至尾后再现移至记录头(这是为了可以访问其中每条记录特别是用RecordCount求记录数时不至于返回的关键)最后返回一个记录集完整的代码如下

作用:连接表

参数TableName表名

返回记录集

Public Function OpenTable(ByVal TableName) As ADODBRecordset

Dim strSql As String

Dim rec As ADODBRecordset

rec = New ADODBRecordset()

recCursorType = ADODBCursorTypeEnumadOpenKeyset

recLockType = ADODBLockTypeEnumadLockOptimistic

strSql = SELECT * FROM & TableName

recOpen(strSql mCnnDB) 打开记录集

If Not recEOF Then

recMoveLast()

recMoveFirst()

End If

OpenTable = rec

End Function

下面是扩充上面函数的功能可以跟据条件访问单个表

Public Overloads Function OpenTable(ByVal TableName As String ByVal strWhere As String) As ADODBRecordset

Dim strSql As String

Dim rec As ADODBRecordset

rec = New ADODBRecordset()

recCursorType = ADODBCursorTypeEnumadOpenKeyset

recLockType = ADODBLockTypeEnumadLockOptimistic

strSql = SELECT * FROM & TableName & where & strWhere

recOpen(strSql mCnnDB) 打开记录集

If Not recEOF Then

recMoveLast()

recMoveFirst()

End If

Return rec

End Function

继续扩充访问表的功能有时要打开多个表读写其中的数据我们可以通过建立查询视图实现其它类似上面的OpenTable完整的代码如下

作用:连接多表

参数strSQL

返回记录集

Public Function ExecuteSQL(ByVal strSql As String) As ADODBRecordset

Dim rec As New ADODBRecordset()

recCursorType = ADODBCursorTypeEnumadOpenKeyset

recLockType = ADODBLockTypeEnumadLockOptimistic

recOpen(strSql mCnnDB) 打开记录集

ExecuteSQL = rec

End Function

下面编写了一个用记录集填充AxMSFlexGrid网格的过程其中函数RecordCount是我自己编写的求记录集中记录的函数这里不能直接用ADO的RecordCount求得如果记录集是空则退出过程否则求出记录集的记录数和字段来确定AxMSFlexGrid网格的行列数据然后读出记录集的数据直接填充到AxMSFlexGrid网格要说明的是读出记录集的数据时要先判断是否为空值由函数IsDBNull实现(函数IsDBNull来源于SystemDBNull)最后记录集应该返回到记录首位否则影响了原有的记录集完整的代码如下

作用用记录集的数据填充网格

参数MSGrid 网格对象rec 记录集对象

Public Sub FillMsGrid(ByVal MSGrid As AxMSFlexGridLibAxMSFlexGrid ByVal rec As ADODBRecordset)

Dim i j RecordNum As Integer

If recEOF Then Exit Sub

RecordNum = RecordCount(rec)

MSGridRows = RecordNum +

MSGridCols = recFieldsCount +

For i = To RecordNum

For j = To recFieldsCount

If IsDBNull(rec(j)Value) Then

MSGridset_TextMatrix(i + j + )

Else

MSGridset_TextMatrix(i + j + rec(j)Value)

End If

Next

MSGridset_TextMatrix(i + i)

recMoveNext()

Next

recMoveFrist()

End Sub

作用取记录集的记录数

参数rec 记录集对象

返回记录集的记录数

Public Function RecordCount(ByVal rec As ADODBRecordset) As Integer

Dim i As Integer

If recEOF Then

RecordCount =

Exit Function

End If

With rec

MoveFirst()

Do While Not EOF

i +=

MoveNext()

Loop

MoveFirst()

End With

RecordCount = i

End Function

以上代码编好后放在所定义的类中下面的省略号代表上面的函数和过程可直接生成为DLL组件方法是在NET编辑环境下选择生成菜单中按生成就生成了DLL文件然后你可以直接调用该组件了

Imports ADODBConnection

Imports ADODBRecordset

Imports ADODBCursorLocationEnum

Imports SystemDBNull 函数IsDBNull的来源

Class ADOAccess

Private mCnnDB As New ADODBConnection()

End Class

调用上面生成的组件方法如下在Visual BasicNET中建立一项目在窗口Form中加入一AxMSFlexGrid网格命名为MsGrid布置如下

然后引用刚建立的Dll方法是选择项目菜单的添加引用选择项目页按浏览找到其DLL文件确定后引用完成在Form中定义一ADOAccess对象在Load事件中编写调用代码分别测试其功能代码如下

Public Class Form

Inherits SystemWindowsFormsForm

Dim DB As New ADOAccess()

Private Sub Form_Load(ByVal sender As SystemObject ByVal e As SystemEventArgs) Handles MyBaseLoad

Dim rec As New ADODBRecordset()

DBConnAccess(e:\testmdb)

DBConnSQLServer(wj test)

DBConnODBC(testODBC)

DBConnOracle(wj system manager)

rec = DBOpenTable(DEMOcustomer)

rec = DBOpenTable(doc_file)

DBFillMsGrid(MSGrid rec)

End Sub

说明

你的机上要有Access数据库文件(e:\testmdb)MS Server数据库中有数据库testdoc_file 为test中的表Oracle数据库中有表DEMOcustomer

wj为MS Server服务器名wj为Oracle服务器名system manager分别为用户名及口令

一次仅连接一种数据库

以上程序在Visual StudioNET中调试通过

总结上面方法介绍了刚面世不久的Visual BasicNET中有关数据库的开发ADO在Visual BasicNET中的应用连接几种最实用的数据库且介绍了编写组件的方法

上一篇:Visual C#.Net 网络程序开发Socket篇

下一篇:快速学习.net制作水晶报表