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_sql
、to_csv
、to_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
)。
关于我要完成的事情的背景知识很少我正在编写一个 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_sql
、to_csv
、to_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
)。