简体   繁体   中英

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

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

Below is the CSV and ODBC DRIVER approach:

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:

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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