连接管理
本文档详细介绍 cDataBase 类的数据库连接管理功能,包括连接、断开、连接池等。
? 目录
数据库连接
Connect 方法
Connect 方法用于建立数据库连接。
语法
vb
Function Connect( _
ByVal DbType As enumDbType, _
Optional ByVal DbAddress As String = "127.0.0.1,1433", _
Optional ByVal username As String = "sa", _
Optional ByVal password As String = "Sa123456", _
Optional ByVal DefaultDataBase As String = "master") As Boolean参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
DbType | enumDbType | 数据库类型(必需) |
DbAddress | String | 数据库地址(可选,默认 "127.0.0.1,1433") |
username | String | 用户名(可选,默认 "sa") |
password | String | 密码(可选,默认 "Sa123456") |
DefaultDataBase | String | 默认数据库(可选,默认 "master") |
返回值
True- 连接成功(或已经连接,不会重复连接)False- 连接失败(可通过LastErr查看错误信息)
重要行为
- 已连接时直接返回 True:如果
IsConnect = True,Connect 不会重复连接,直接返回 True - 失败时抛出异常:连接失败会通过
ERR.Raise抛出 VB 错误,建议使用On Error处理 - Custom 类型:
DbAddress参数直接作为完整连接字符串,后续参数被忽略
示例
vb
Dim db As New VBMAN.cDataBase
' SQL Server 连接
On Error GoTo ErrHandler
If db.Connect(VBMAN.enumDbType_MsSql, "127.0.0.1,1433", "sa", "password", "mydb") Then
Debug.Print "连接成功"
Else
Debug.Print "连接失败: " & db.LastErr
End If
' Custom 类型连接(传入完整 DSN)
If db.Connect(VBMAN.enumDbType_Custom, _
"DRIVER={MySQL ODBC 8.0 ANSI Driver};SERVER=localhost;DATABASE=testdb;UID=root;PWD=root") Then
Debug.Print "自定义连接成功"
End If
Exit Sub
ErrHandler:
Debug.Print "连接异常: " & Err.Description支持的数据库类型
enumDbType 枚举
vb
Public Enum enumDbType
Access = 1 ' Microsoft Access
Mysql = 2 ' MySQL
MsSql = 3 ' Microsoft SQL Server
Csv = 4 ' CSV 文件
Custom = 5 ' 自定义连接字符串(DbAddress 参数直接传入完整 DSN)
End EnumSQL Server 连接
vb
' 基本连接
db.Connect VBMAN.enumDbType_MsSql, "127.0.0.1,1433", "sa", "password", "master"
' 使用命名实例
db.Connect VBMAN.enumDbType_MsSql, "SERVER\INSTANCE,1433", "sa", "password", "mydb"
' 使用 Windows 身份验证(需要修改连接字符串)
' 注意:需要在类内部修改连接字符串以支持 Windows 身份验证MySQL 连接
vb
' 基本连接(默认端口 3306)
db.Connect VBMAN.enumDbType_Mysql, "localhost:3306", "root", "password", "testdb"
' 指定端口
db.Connect VBMAN.enumDbType_Mysql, "192.168.1.100:3306", "user", "pwd", "mydb"
' 使用中文逗号(自动转换)
db.Connect VBMAN.enumDbType_Mysql, "localhost,3306", "root", "pwd", "testdb"Access 连接
vb
' 连接 Access 数据库文件
db.Connect VBMAN.enumDbType_Access, "C:\data\mydb.mdb"
' 使用相对路径(自动转换为绝对路径)
db.Connect VBMAN.enumDbType_Access, "data\mydb.mdb"CSV 连接
vb
' 连接 CSV 文件目录
db.Connect VBMAN.enumDbType_Csv, "C:\data\csvfiles"
' CSV 文件会被当作表来查询
db.Sql("SELECT * FROM data.csv").QueryCustom 连接(自定义连接字符串)
vb
' 使用自定义 DSN/连接字符串
' DbAddress 参数直接传入完整的连接字符串,username/password/DefaultDataBase 参数不需要
db.Connect VBMAN.enumDbType_Custom, _
"DRIVER={MySQL ODBC 8.0 ANSI Driver};SERVER=10.0.0.252;DATABASE=mysql;UID=root;PWD=root"
' 使用 OLEDB 连接字符串
db.Connect VBMAN.enumDbType_Custom, _
"Provider=SQLOLEDB;Data Source=127.0.0.1;Initial Catalog=mydb;User ID=sa;Password=pwd"
' 注意:Custom 类型时,DbAddress 参数即为完整的连接字符串
' 后面的 username、password、DefaultDataBase 参数会被忽略连接字符串配置
自动生成的连接字符串
类库会根据数据库类型自动生成连接字符串:
SQL Server
Driver={SQL Server};Server=127.0.0.1,1433;Uid=sa;pwd=password;Database=mydb;MySQL
Driver={MySQL ODBC 5.1 Driver};Server=localhost:3306;Uid=root;pwd=password;Database=testdb;Access
Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\data\mydb.mdb;CSV
Driver={Microsoft Text Driver (*.txt; *.csv)};DefaultDir=C:\data\csvfilesCustom
Custom 类型直接使用 DbAddress 参数作为完整的连接字符串,不再自动拼接。
自定义连接字符串
推荐使用 enumDbType_Custom 类型传入自定义连接字符串:
vb
' 方式 1:使用 Custom 类型(推荐)
db.Connect VBMAN.enumDbType_Custom, "Provider=SQLOLEDB;Data Source=...;..."
' 方式 2:直接设置 ADO Connection 对象
Set db.Conn = New ADODB.Connection
db.Conn.ConnectionString = "Provider=SQLOLEDB;Data Source=...;..."
db.Conn.Open
db.IsConnect = True
db.DatabaseType = VBMAN.enumDbType_MsSql ' 需要手动设置,影响 LastInsertId 等方法连接状态管理
IsConnect 属性
IsConnect 属性表示当前连接状态(公共属性,可直接读写)。
vb
' 检查连接状态
If db.IsConnect Then
Debug.Print "已连接"
Else
Debug.Print "未连接"
End IfDatabaseType 属性
DatabaseType 属性存储当前数据库类型(公共属性),连接后自动设置。
vb
' 查看当前数据库类型
Debug.Print "当前类型: " & db.DatabaseType ' 输出如 3 (MsSql)
' 用于判断数据库类型以编写兼容代码
If db.DatabaseType = VBMAN.enumDbType_MsSql Then
' SQL Server 特定操作
End IfIsCloneInstance 属性
IsCloneInstance 属性标记是否为连接池克隆实例(公共属性)。克隆实例断开连接时不会关闭共享的 Connection 对象。
vb
' 检查是否为克隆实例
If db.IsCloneInstance Then
Debug.Print "这是连接池克隆实例,断开时不会关闭共享连接"
End IfCheckConnection 方法
CheckConnection 方法检查连接状态并尝试重连。
vb
' 检查并重连
If Not db.CheckConnection Then
Debug.Print "连接已断开,尝试重连..."
db.Connect VBMAN.enumDbType_MsSql, "127.0.0.1,1433", "sa", "pwd", "mydb"
End If连接状态检查
在执行操作前检查连接状态:
vb
If Not db.IsConnect Then
Debug.Print "数据库未连接"
Exit Sub
End If
' 执行查询
db.Sql("SELECT * FROM users").Query连接池管理
ConnInst 方法
ConnInst 方法创建或获取连接池中的数据库实例。
语法
vb
Function ConnInst(ByVal InstName As String, Optional ByVal IsCloneMasterConnection As Boolean = True) As cDataBase参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
InstName | String | 实例名称(必需) |
IsCloneMasterConnection | Boolean | 是否克隆主连接(可选,默认 True) |
示例
vb
Dim db As New VBMAN.cDataBase
' 主连接
db.Connect VBMAN.enumDbType_MsSql, "127.0.0.1,1433", "sa", "pwd", "mydb"
' 创建连接实例 1(克隆主连接)
Dim db1 As VBMAN.cDataBase
Set db1 = db.ConnInst("db1", True)
db1.Sql("SELECT * FROM table1").Query
' 创建连接实例 2(独立连接)
Dim db2 As VBMAN.cDataBase
Set db2 = db.ConnInst("db2", False)
db2.Connect VBMAN.enumDbType_Mysql, "localhost:3306", "root", "pwd", "testdb"
db2.Sql("SELECT * FROM table2").Query
' 获取已存在的实例
Set db1 = db.ConnInst("db1")ConnInstRemove 方法
ConnInstRemove 方法移除连接池中的实例。
语法
vb
Sub ConnInstRemove(Optional ByVal InstName As String)示例
vb
' 移除指定实例
db.ConnInstRemove "db1"
' 移除所有实例
db.ConnInstRemove ""连接池使用场景
场景 1:多数据库操作
vb
Dim db As New VBMAN.cDataBase
' 主数据库
db.Connect VBMAN.enumDbType_MsSql, "127.0.0.1,1433", "sa", "pwd", "mydb"
' 日志数据库
Dim dbLog As VBMAN.cDataBase
Set dbLog = db.ConnInst("log", False)
dbLog.Connect VBMAN.enumDbType_Mysql, "192.168.1.100:3306", "loguser", "pwd", "logdb"
' 使用不同的数据库
db.Sql("SELECT * FROM users").Query
dbLog.Sql("INSERT INTO logs (msg) VALUES ('test')").Exec场景 2:动态数据库切换
vb
Dim db As New VBMAN.cDataBase
' 根据配置动态创建连接
Function GetDatabase(sConfigName As String) As VBMAN.cDataBase
Dim dbInst As VBMAN.cDataBase
Set dbInst = db.ConnInst(sConfigName, False)
' 根据配置连接不同的数据库
Select Case sConfigName
Case "main"
dbInst.Connect VBMAN.enumDbType_MsSql, "127.0.0.1,1433", "sa", "pwd", "maindb"
Case "backup"
dbInst.Connect VBMAN.enumDbType_Mysql, "192.168.1.100:3306", "user", "pwd", "backupdb"
End Select
Set GetDatabase = dbInst
End Function
' 使用
Dim dbMain As VBMAN.cDataBase
Set dbMain = GetDatabase("main")
dbMain.Sql("SELECT * FROM users").Query断开连接
DisConnect 方法
DisConnect 方法断开数据库连接。
语法
vb
Function DisConnect() As Boolean功能
- 关闭数据库连接
- 关闭记录集
- 释放资源
- 自动回滚未完成的事务
- 克隆实例只清空本地引用,不关闭共享连接
示例
vb
' 断开连接
If db.DisConnect Then
Debug.Print "已断开连接"
End If自动断开
类在销毁时会自动断开连接:
vb
Private Sub Form_Unload(Cancel As Integer)
' 不需要手动调用 DisConnect,类会自动处理
Set db = Nothing
End Sub错误处理
错误属性
| 属性 | 类型 | 说明 |
|---|---|---|
LastErr | String | 最后错误信息(完整描述) |
LastErrNumber | Long | 最后错误代码 |
LastErrDescription | String | 最后错误描述 |
错误处理示例
vb
' 连接错误处理
If Not db.Connect(VBMAN.enumDbType_MsSql, "127.0.0.1,1433", "sa", "pwd", "mydb") Then
Debug.Print "连接失败"
Debug.Print "错误代码: " & db.LastErrNumber
Debug.Print "错误描述: " & db.LastErrDescription
Debug.Print "完整信息: " & db.LastErr
Exit Sub
End If
' 查询错误处理
If Not db.Sql("SELECT * FROM users").Query Then
Debug.Print "查询失败: " & db.LastErr
Exit Sub
End If常见连接错误
错误 1:无法连接到服务器
错误代码: -2147467259
错误描述: [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server 不存在或访问被拒绝解决方案:
- 检查数据库服务是否启动
- 验证服务器地址和端口
- 检查防火墙设置
错误 2:登录失败
错误代码: -2147467259
错误描述: [Microsoft][ODBC SQL Server Driver][SQL Server]用户 'sa' 登录失败解决方案:
- 验证用户名和密码
- 检查 SQL Server 身份验证模式
- 确认用户权限
错误 3:数据库不存在
错误代码: -2147467259
错误描述: [Microsoft][ODBC SQL Server Driver][SQL Server]无法打开登录所请求的数据库解决方案:
- 验证数据库名称
- 检查数据库是否存在
- 确认用户有访问权限
最佳实践
1. 连接管理
vb
' ? 推荐:在需要时连接,使用完毕后断开
Private Sub ProcessData()
Dim db As New VBMAN.cDataBase
If db.Connect(VBMAN.enumDbType_MsSql, "127.0.0.1,1433", "sa", "pwd", "mydb") Then
' 执行操作
db.Sql("SELECT * FROM users").Query
End If
db.DisConnect
Set db = Nothing
End Sub2. 连接复用
vb
' ? 推荐:对于频繁操作,保持连接
Private m_DB As VBMAN.cDataBase
Private Sub Form_Load()
Set m_DB = New VBMAN.cDataBase
m_DB.Connect VBMAN.enumDbType_MsSql, "127.0.0.1,1433", "sa", "pwd", "mydb"
End Sub
Private Sub Form_Unload(Cancel As Integer)
If Not m_DB Is Nothing Then
m_DB.DisConnect
Set m_DB = Nothing
End If
End Sub3. 错误处理
vb
' ? 推荐:始终检查返回值并处理错误
If Not db.Connect(...) Then
MsgBox "连接失败: " & db.LastErr, vbCritical
Exit Sub
End If最后更新: 2026-01-21