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.