【问题标题】:Excel for Mac VBA - SQL Server INSERT statement for QueryTablesExcel for Mac VBA - QueryTables 的 SQL Server INSERT 语句
【发布时间】:2021-04-25 05:18:56
【问题描述】:

我一直在使用 Excel for Mac 开发一个程序,该程序在 VBA 中包含数万行代码,并且在 Windows 和 Mac 上都可以使用。我能够使用 QueryTables 对象成功地将信息导入程序,但无法执行 SQL INSERT 语句。有没有办法使用 QueryTables 插入,或者这是对数据库执行这样的命令的唯一方法?我已经下载了兼容的 SQL Server 实际 ODBC 驱动程序,但根本没有使用它们。

    If colInsertCustomers.Count > 0 Then
        sql = "INSERT INTO dbo.tblCustomersStage "
        sql = sql & cust.SQLFields
        sql = sql & " VALUES "
        For Each cust In colInsertCustomers
            sql = sql & cust.SQLValues & ","
        Next cust
        sql = Left(sql, Len(sql) - 1) ' Remove the last comma
        sql = sql & ";"
        qt.CommandText = sql
        qt.Refresh
    End If 

我已经测试了上述代码生成的 SQL 和它生成的 SQL 字符串 (sql),用于将数据放入数据库(使用 Azure Data Studio)。但是每次我到达 qt.Refresh 时,它都会因 INSERT 语句而失败。

澄清

qt 是一个有效初始化的 QueryTable,它与数据库有功能连接,并且能够对数据库执行多个 SELECT 语句。

SQLFields 将包含括号和括号的字段列表返回到 INSERT

SQLValues 返回与 SQLFields 对齐的值列表,包括逗号、相应的刻度线和括号

cust 是一个 CCustomer 对象,它有太多的属性和方法无法列出,但它也很实用。

编辑:这是 qt 的连接字符串和定义,其中明显的东西被混淆了。

Set qt = ws.ListObjects.Add(SourceType:=0, Source:= _
            "ODBC;DRIVER=SQL Server;" & _
            "SERVER=myserver.database.windows.net;" & _
            "Database=mydb;UID=$;", _
            Destination:=Range("$A$1")).QueryTable

编辑 2:作为旁注,Actual 驱动程序能够连接并通过 Microsoft Query(数据选项卡 -> 获取外部数据 -> SQL Server ODBC)毫无问题地执行这些语句。但是当我尝试在使用它时录制宏时,我什么也没记录。 Microsoft Query 创建的连接字符串是:

DRIVER=SQL Server;SERVER=myserver.database.windows.net;UID=myname;PWD=mypwd;APP=Microsoft Excel;WSID=my-computer;DATABASE=mydb;

【问题讨论】:

  • 除了是一个巨大的 SQL 注入问题(避免 Little Bobby Tables)之外,您的 insert statement 构造不正确。正常语法是insert schemaName.tableName (column_list) values (value_list),而您的语法缺少列名和要插入的值周围的括号。
  • 很抱歉我没有把我的 SQL 语句描述得足够清楚。当插入到 Azure Data Studio 等程序中时,它是正确的并且可以正常工作。这些函数调用(SQLFields 和 SQLValues)提供了括号和所有需要的东西,包括括号。你介意描述一下什么是“巨大的 SQL 注入问题”吗?
  • 感谢您对 SQL 注入的关注,此应用程序中的威胁非常低,但当我们将来获得更直接的用户输入时可能会变得更大。我真的很感激。

标签: sql-server excel vba database


【解决方案1】:

通过对这个问题的学习过程,我确定不可能通过 VBA 中的 QueryTable 对象推进插入语句。尽管 MSQuery 可以从 Excel Mac 中插入,但它没有公开的 VBA 对象来允许这种操作。我选择将开发转移到 Windows PC,我知道有通过两个独立的 ODBC 驱动程序与 SQL Server 交互的非免费解决方案,这是使用 Mac 的一座桥梁(尽管我很喜欢它)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多