使用 SELECT ADODB Excel 的子查询不工作 (VBA)

问题描述 投票:0回答:2

我正在尝试使用 ADODB Excel 中的子查询从其他表中选择数据。这是我的代码:

Sub CopyData()
    Dim cmd As String
    If OpenConnection() = True Then 'The connection function already created in my module
        cmd = "SELECT * FROM (SELECT [SheetName] FROM `Breakdown structure library$` WHERE [Name (Name *)]='WBS');"
        Rcdset.Open cmd, Con, adOpenStatic, adLockBatchOptimistic
        With shTemp
            .Cells.Delete
            .Range("A1").CopyFromRecordset Rcdset
        End With
        If Con.State Then Con.Close
    End If
End Sub

结果是错误的:

运行时错误“-2147217904”(80040e10):没有为一个或多个参数给出值

我知道发生了什么事。您必须在工作表名称末尾添加“$”才能在 ADODB Excel 中执行查询,例如:

SELECT * FROM `MyTable` '(not working in ADODB Excel, but working in Access database)
SELECT * FROM `MyTable$` '(working in ADODB Excel)

我不知道如何让sql子查询自动识别表,我们要在其中选择数据。

sql excel vba adodb
2个回答
0
投票

不能使用子select来确定select的表名,使用2个查询。

    Dim sTableName As String, SQL As String, rcdset As New ADODB.Recordset
    If OpenConnection() = True Then 'The connection function already created in my module
      
        SQL = " SELECT [SheetName] " & _
              " FROM `Breakdown structure library$` " & _
              " WHERE [Name (Name *)]='WBS';"
        sTableName = con.Execute(SQL)(0)

        SQL = " SELECT * FROM [" & sTableName & "$]"
        rcdset.Open SQL, con, adOpenStatic, adLockBatchOptimistic
        With shTemp
            .Cells.Delete
            .Range("A1").CopyFromRecordset rcdset
        End With
        If con.State Then con.Close
     
     End If

0
投票

我在从包含一些子查询的 VBA 执行查询时遇到问题。

我通过将查询(带有子查询)放入存储过程中解决了这个问题。

我还必须在连接字符串中向用户授予对该存储过程的仅执行权限。这是因为我用于连接字符串的 UID 具有数据库的只读权限,因为我与其他用户共享我创建的这些 XLSM 文件,而我不希望这些用户能够更新、删除、控制等。数据库中的任何内容。

© www.soinside.com 2019 - 2024. All rights reserved.