VBA ADO 引用用户定义错误

VBA ADO reference User-Defined error

关于我要完成的事情的背景知识很少我正在编写一个 vba 脚本,该脚本在我的 Python 代码中执行以查询 SQL。我一直在研究这个 ADO.Recordset,它一直给我一个 'User-defined error' 我已经将所有必需的引用(据我所知)添加到 GUID 调用的代码中。

请看下面的代码。

import pyodbc
import os
import win32com.client as win32
import comtypes, comtypes.client

xl = win32.gencache.EnsureDispatch('Excel.Application')
xl.Visible = True
ss = xl.Workbooks.Add()
sh = ss.ActiveSheet

xlmodule = ss.VBProject.VBComponents.Add(1)

sCode = '''Sub Download_Standard_BOM()
'Initializes variables
Set cn = CurrentProject.Connection
Set rst = New ADODB.Recordset
Dim cn As Object: Set cn = CreateObject("ADODB.Connection")
Dim rst As New ADODB.Recordset
Dim ConnectionString As String
Dim StrQuery As String


    ConnectionString = "Provider=SQLOLEDB; Network Library=dbmssocn;Password=******;User ID=******;Initial Catalog=*****;Data Source=************;"

    cnn.Open ConnectionString

    ThisWorkbook.VBProject.References.AddFromGuid "{2A75196C-D9EB-4129-B803-931327F72D5C}", 2, 3

    ThisWorkbook.VBProject.References.AddFromGuid "{000204EF-0000-0000-C000-000000000046}", 2, 3

    ThisWorkbook.VBProject.References.AddFromGuid "{00020813-0000-0000-C000-000000000046}", 2, 3

    ThisWorkbook.VBProject.References.AddFromGuid "{00020430-0000-0000-C000-000000000046}", 2, 3

    ThisWorkbook.VBProject.References.AddFromGuid "{00000600-0000-0010-8000-00AA006D2EA4}", 2, 3

    ThisWorkbook.VBProject.References.AddFromGuid "{00025E01-0000-0000-C000-000000000046}", 2, 3

    ThisWorkbook.VBProject.References.AddFromGuid "{00000300-0000-0010-8000-00AA006D2EA4}", 2, 3

    cnn.CommandTimeout = 900

    StrQuery = "SELECT * FROM car_search WHERE search_id = 9999999"

    rst.Open StrQuery, cnn

    Sheets(1).Range("A2").CopyFromRecordset rst
End Sub'''

xlmodule.CodeModule.AddFromString(sCode)
xl.Run ('Download_Standard_BOM')

非常感谢你们提供的所有帮助!

如果您使用后期绑定,则无需添加任何引用:

sCode = '''Sub Download_Standard_BOM()
'Initializes variables


Dim cnn As Object: Set cnn = CreateObject("ADODB.Connection")
Dim rst As Object: Set rst = CreateObject("ADODB.Recordset")

Dim ConnectionString As String
Dim StrQuery As String


    ConnectionString = "Provider=SQLOLEDB; Network Library=dbmssocn;Password=******;" & _
      "User ID=******;Initial Catalog=*****;Data Source=************;"

    cnn.Open ConnectionString
    cnn.CommandTimeout = 900

    StrQuery = "SELECT * FROM car_search WHERE search_id = 9999999"

    rst.Open StrQuery, cnn

    Sheets(1).Range("A2").CopyFromRecordset rst
End Sub'''

或者,您可以直接使用Python连接到SQL服务器(无COM接口)并将数据输出为csv或Excel格式(后者使用pandas, Python的数据分析包):

下面是 CSV 和 ODBC 驱动程序的方法:

import pyodbc
import csv

constr = 'DRIVER={SQL Server};SERVER=servername;DATABASE=database;' \
         'Trusted_Connection=yes;UID=username;PWD=password'
conn = pyodbc.connect(constr)

cur = conn.cursor()
cur.execute("SELECT * FROM car_search WHERE search_id = 9999999")

with open('Output.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow([i[0] for i in cur.description])   # COLUMNS
    for row in cur.fetchall():        
        writer.writerow(row)                           # DATA ROWS

cur.close()
conn.close()

下面是 pandas(使用 read_sqlto_csvto_excel)和 OLEDB PROVIDER 方法:

import adodbapi
import pandas as pd

constr = 'PROVIDER=SQLOLEDB.1;Data Source=servername;Initial Catalog=database;' \
         'Integrated Security=SSPI;Trusted_Connection=yes;' \ 
         'User ID=username;Password=password'    
conn = adodbapi.connect(constr)

df = pd.read_sql("SELECT * FROM car_search WHERE search_id = 9999999", conn)
df.to_csv('Output.csv', index=False)
df.to_excel('Output.xlsx', index=False)

conn.close()

当然,ODBC/OLEDB 可以交换,与相应的模块对齐(pyodbc/pypyodbc vs adodbapi)。