当前位置:首页 > 数据库 > 正文

vb怎么做数据库查询

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语句

vb怎么做数据库查询  第1张

' 简单查询示例
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.PageSizers.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
0