ADODB 到查询表:运行-时间错误 1004

ADODB to querytable : Run-Time Error 1004

我目前正在尝试将查询 SQL 服务器的项目从 VBA 从 ODBC 移动到 ADODB。引用了 Active X 数据对象和 Recordset 2.8。

A​​DODB 连接正常,记录集得到填充。由于某种超出我理解的原因,recorset 和 querytable 似乎彼此不喜欢。我在连接对象上尝试了任何类型的 With。

我 运行 进入 运行 时间错误“1004”应用程序定义或对象定义的错误。

代码如下所示:

Dim cn As Object
Dim rs As Object

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

With cn
    .Open "Driver={SQL Server};Server=xxx;Database=xxx;UID=xxx;PWD=xxx;"
    .CommandTimeout = 0
    Set rs = .Execute("Select 1")
End With

Debug.Print rs(0)

Dim qtData As QueryTable
Set qtData = ActiveSheet.QueryTables.Add(rs, Destination:=Range("A1"))
With qtData
     .Name = "DTBase"
     .FieldNames = True
     .RowNumbers = False
     .FillAdjacentFormulas = False
     .PreserveFormatting = True
     .RefreshOnFileOpen = False
     .BackgroundQuery = False
     .RefreshStyle = xlOverwriteCells
     .SavePassword = False
     .SaveData = False
     .AdjustColumnWidth = True
     .RefreshPeriod = 0
     .PreserveColumnInfo = False
     .BackgroundQuery = False
     .EnableEditing = False
 End With

'ActiveSheet.ListObjects.Add(xlSrcQuery, rs, Destination:=Selection).QueryTable.Refresh

qtData.Refresh
qtData.Close
qtData.Delete

rs.Close
cn.Close

Set rs = Nothing
Set cn = Nothing

本质上,您在不同的方法上遇到了两个问题:

  • .Close:因为QueryTable对象没有.Close方法,干脆去掉调用。

  • .Debug.Print:当您调用 Debug.Print rs(0) 时,您显然消耗了记录集,因此不适用于 QueryTables.Add()这似乎需要一个未触及的记录集。

    要解决,请考虑将 Debug.Print 移动到 QueryTables.Add() 之后,并在查询 table 将光标推到之前调用 MoveFirst EOF = True 的结尾。

    Set qtData = ActiveSheet.QueryTables.Add(rs, Destination:=Range("A1"))
    
    With qtData
         .Name = "DTBase"
         .FieldNames = True
         .RowNumbers = False
         .FillAdjacentFormulas = False
         .PreserveFormatting = True
         .RefreshOnFileOpen = False
         .BackgroundQuery = False           ' REMOVED REPEATED LINE AFTER THIS ONE
         .RefreshStyle = xlOverwriteCells
         .SavePassword = False
         .SaveData = False
         .AdjustColumnWidth = True
         .RefreshPeriod = 0
         .PreserveColumnInfo = False
         .EnableEditing = False
         .Refresh                           ' MOVED TO INSIDE With BLOCK
         .Delete                            ' MOVED TO INSIDE With BLOCK
    End With
    
    rs.MoveFirst
    Debug.Print rs(0)
    

    注意:我确实在 Debug.Print 之后尝试 运行 MoveFirst 但无济于事。似乎 QueryTables.Add() 需要一个未触及的记录集,无论光标位置如何。这可能与 ODBC 驱动程序不同。

    Debug.Print rs(0)
    rs.MoveFirst
    
    Set qtData = ActiveSheet.QueryTables.Add(rs, Destination:=Range("A1"))
    
    With qtData
        ...
    
        .Refresh
        .Delete
    End With