上一篇
vb怎么做数据库查询
- 数据库
- 2025-08-11
- 43
VB可通过ADODB控件连接数据库,使用Connection对象执行SQL语句实现
前期准备
1 必要组件引入
| 功能需求 | 对应操作路径 |
|---|---|
| 启用数据库访问能力 | 【项目】→【引用】→勾选 “Microsoft ActiveX Data Objects X.X Library”(X.X为版本号) |
| 创建窗体界面 | 拖拽 TextBox/ListView/DataGridView 等控件至窗体 |
| 添加命令按钮 | 用于触发查询操作 |
2 常见数据库适配方案
| 数据库类型 | 典型连接字符串示例 | 驱动要求 |
|---|---|---|
| Microsoft Access | Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:mydb.mdb;Persist Security Info=False |
Jet Engine |
| SQL Server | Provider=SQLOLEDB;Server=localhost;Database=mydb;UID=sa;PWD=password; |
SQL Native Client |
| MySQL | Provider=MSDASQL;DSN=MyDSN;UID=root;PWD=password; |
需配置ODBC数据源 |
| Excel | Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:data.xls;Extended Properties="Excel 8.0";HDR=YES; |
Excel驱动程序 |
核心实现步骤
1 声明数据库对象
Dim conn As New ADODB.Connection ' 数据库连接对象 Dim cmd As New ADODB.Command ' SQL命令对象 Dim rs As New ADODB.Recordset ' 结果集对象
2 建立数据库连接
' 示例:连接Access数据库
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:test.mdb"
conn.Open ' 打开连接(自动抛出错误若失败)
' 增强版错误处理
On Error GoTo ErrorHandler
conn.Open
Exit Sub
ErrorHandler:
MsgBox "连接失败: " & Err.Description, vbCritical
Exit Sub
3 执行SQL查询
方式1:直接执行SQL语句

' 简单查询示例
Dim strSQL As String
strSQL = "SELECT FROM Employees WHERE Department='IT'"
Set rs = conn.Execute(strSQL) ' 返回Recordset对象
' 带参数的查询(防SQL注入)
cmd.ActiveConnection = conn
cmd.CommandText = "SELECT FROM Products WHERE Price > ?"
cmd.Parameters.Append cmd.CreateParameter("param1", adDouble, adParamInput, , 100)
Set rs = cmd.Execute()
方式2:通过存储过程执行
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "sp_GetEmployeeByDept"
cmd.Parameters.Append cmd.CreateParameter("@DeptID", adInteger, adParamInput, , 5)
Set rs = cmd.Execute()
4 处理查询结果
| 操作目标 | 实现代码示例 | 说明 |
|---|---|---|
| 逐行读取数据 | While Not rs.EOF: <br>Debug.Print rs!FieldName.Value <br>rs.MoveNext Wend |
EOF标记判断结束 |
| 获取字段数量 | For i = 0 To rs.Fields.Count 1: List1.AddItem rs.Fields(i).Name Next |
动态获取列信息 |
| 批量填充列表框 | List1.ColumnHeads = True: Set List1.DataSource = rs |
快速绑定可视化控件 |
| 统计记录总数 | Label1.Caption = "共 " & rs.RecordCount & " 条记录" |
RecordCount属性计数 |
5 高级数据处理技巧
- 分页显示:通过设置
rs.PageSize和rs.AbsolutePage实现 - 排序控制:在SQL语句末尾添加
ORDER BY FieldName DESC/ASC - 模糊查询:使用
LIKE '%keyword%'配合通配符 - 联合查询:
SELECT FROM Table1 UNION ALL SELECT FROM Table2
6 资源清理
' 正确关闭顺序(反向操作) If Not rs Is Nothing Then rs.Close: Set rs = Nothing If Not cmd Is Nothing Then Set cmd = Nothing If Not conn Is Nothing Then conn.Close: Set conn = Nothing
完整应用示例
Private Sub btnQuery_Click()
On Error GoTo ErrorHandler
' 初始化连接
Dim conn As New ADODB.Connection
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:employees.mdb"
conn.Open
' 构建动态查询条件
Dim whereClause As String
If Trim(txtName.Text) <> "" Then
whereClause = "WHERE Name LIKE '%" & Replace(txtName.Text, "'", "''") & "%'"
End If
' 执行查询
Dim strSQL As String
strSQL = "SELECT ID, Name, Salary FROM Staff " & whereClause & " ORDER BY Salary DESC"
Dim rs As New ADODB.Recordset
Set rs = conn.Execute(strSQL)
' 清空现有数据
lvResults.ListItems.Clear
' 填充列表视图
Do While Not rs.EOF
Dim li As ListItem
Set li = lvResults.ListItems.Add(, , rs!ID)
li.SubItems(1) = rs!Name
li.SubItems(2) = Format(rs!Salary, "#,##0")
rs.MoveNext
Loop
' 显示统计信息
lblCount.Caption = "找到 " & rs.RecordCount & " 条记录"
Cleanup:
If Not rs Is Nothing Then rs.Close: Set rs = Nothing
If Not conn Is Nothing Then conn.Close: Set conn = Nothing
Exit Sub
ErrorHandler:
MsgBox "发生错误: " & Err.Description, vbExclamation
Resume Cleanup
End Sub
常见问题解答(FAQs)
Q1: 运行时提示「未找到可用的数据库提供程序」怎么办?
A: 此错误通常由以下原因导致:① 连接字符串中的Provider名称错误;② 未安装对应的数据库驱动,解决方案:① 核对Provider名称是否与数据库类型匹配(如SQL Server应使用SQLOLEDB);② 安装缺失的MDAC组件(Microsoft Data Access Components);③ 对于64位系统,需确保使用的DLL版本与应用程序位数一致。

Q2: 如何防止SQL注入攻击?
A: 推荐采用参数化查询方式:① 使用Command对象的Parameters集合添加参数;② 对用户输入进行严格校验(如过滤特殊字符);③ 限制数据库用户的权限(仅授予必要权限),示例代码:

cmd.CommandText = "SELECT FROM Users WHERE UserName = ? AND PassWord = ?"
cmd.Parameters.Append cmd.CreateParameter("p1", adVarChar, adParamInput, 20, txtUser)
cmd.Parameters.Append cmd.CreateParameter("p2", adVarChar, adParamInput, 20, txtPwd)
Set rs = cmd
