上一篇
vb怎么做数据库查询
- 数据库
- 2025-08-11
- 5
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