首页 > 解决方案 > 通过 ODBC 而不是 ADODB 访问 Excel VBA 数据库

问题描述

我正在处理一个连接到 SQL 数据库的 Excel 文件,以根据对零件质量数据的分析更新生产机器上的参数。该文件已经在生产环境中工作了一段时间,但最近对我公司的黑客攻击导致我们审查了我们所有系统的安全性。

旧文件版本使用带有硬编码用户名的 ADODB 和具有严格定义的数据库权限的密码。这意味着任何质量或工程员工都可以运行 Excel 实用程序,而无需明确授予服务器/数据库访问权限。通过我们新的安全审查,我想将文件切换为使用 Windows 身份验证,但我遇到了一些问题。似乎通过 ADODB 使用 Windows 身份验证不仅需要数据库用户,自动化团队有权创建,还需要映射到只有 IT 管理员才能创建的数据库用户的服务器登录。我也担心添加大量服务器级用户不是一个好主意。

实际的生产设备使用带有窗口身份验证的系统级 ODBC 连接。此连接适用于没有服务器登录的数据库用户。因为 ODBC 似乎不需要服务器登录,它会使 Excel 文件用户的管理更加简单,并且允许负责设备及其数据库的团队在没有 IT 的情况下处理它。

不幸的是,我一直无法弄清楚如何使用 ODBC 连接在 VBA 中执行查询并获得结果。我已经尝试过 Workbook.Connections("ODBCName").CommandText 与存储在工作簿中的 ODBC 连接,但我没有看到直接获取结果的方法。我能看到的唯一选择是将查询映射到隐藏表中的单元格并在 VBA 中读取它们,但这似乎很骇人听闻。此外,我不确定这对于 SELECT 以外的查询结果(如 INSERT 或 UPDATE)如何工作。

任何帮助将不胜感激。我的旧代码示例在这里,有更多的例程可以进行类似的查询:

    
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    
    cn.Open strCon
    
    strSQL = "SELECT * FROM Table.dbo.PART_INSPECTION_LOG WHERE PART_NUM = 'PartNo' AND DATA_TIME = " & dataTime
    rs.Open strSQL, cn

    If (rs.BOF And rs.EOF) = True Then
        linear_err = (Sheets("Adjustment").Range("E24").Value)
        rotational_err = (Sheets("Adjustment").Range("N24").Value)
        
        strSQL = "INSERT INTO Table.dbo.PART_INSPECTION_LOG (PART_NUM, TOOL_ID, USER_NAME, DATA_TIME, LINEAR_ERROR, ROTATIONAL_ERROR) VALUES ('PartNum', 'ToolNum', "
        strSQL = strSQL & "'" & Application.UserName & "', "
        strSQL = strSQL & dataTime & ", "
        strSQL = strSQL & linear_err & ", "
        strSQL = strSQL & rotational_err & ")"
    
        cn.Execute strSQL
    End If
    
    cn.Close

标签: sqlexcelvbaodbc

解决方案


推荐阅读