简体   繁体   English

VBA ADO参考用户定义的错误

[英]VBA ADO reference User-Defined error

little background on what I'm trying to accomplish I'm writing a vba script that executes within my Python code to query SQL. 关于我要完成的工作的背景知识很少,我正在编写一个vba脚本,该脚本在我的Python代码中执行以查询SQL。 I've been stuck and doing research on this ADO.Recordset that keeps giving me a 'User-defined error' I've added all of the required references(to my knowledge)to the code being called out by GUID. 我一直被困在这个ADO.Recordset上,并且一直给我一个“用户定义的错误”,对此我进行了研究。我已经将所有必需的引用(据我所知)添加到GUID调用的代码中。

Please see code below. 请参见下面的代码。

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')

I appreciate all of the help you guys provide! 感谢您提供的所有帮助!

Alternatively, you can use Python directly to connect to SQL Server (no COM interface) and output data into csv or Excel format (the latter using pandas , Python's data analysis package): 或者,您可以直接使用Python连接到SQL Server(无COM接口),并将数据输出为csv或Excel格式(后者使用pandas ,Python的数据分析包):

Below is the CSV and ODBC DRIVER approach: 以下是CSV和ODBC DRIVER方法:

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()

Below is the pandas (using read_sql , to_csv , to_excel ) and OLEDB PROVIDER approach: 下面是熊猫(使用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()

Of course, ODBC/OLEDB can be swapped for either, aligning to corresponding module ( pyodbc / pypyodbc vs adodbapi ). 当然,可以将ODBC / OLEDB交换为任意一种,以对齐相应的模块( pyodbc / pypyodbcadodbapi )。

You don't need to add any references if you use late binding: 如果使用后期绑定,则无需添加任何引用:

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'''

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM