2016-07-14 5 views
0

Немного фона на том, что я пытаюсь выполнить Я пишу скрипт vba, который выполняется в моем коде Python для запроса SQL. Я застрял и занимаюсь исследованиями этого ADO.Recordset, который продолжает давать мне «пользовательскую ошибку». Я добавил все необходимые ссылки (насколько мне известно) на код, вызываемый GUID.Ссылка VBA ADO Определенная пользователем ошибка

См. Код ниже.

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

Я ценю всю помощь, которую вы, ребята, обеспечиваете!

+2

«CurrentProject.Connection» - это вещь Access: она не существует в Excel VBA. Не ясно, что там делает, поскольку вы устанавливаете 'cn' на это (но перед объявлением), а затем позже устанавливаете' cn' снова ... –

+0

Ах, спасибо Тим Я удалил это из программы, но, к сожалению, получил ошибку, относящуюся к ADODB.Recordset – phtnm28

+0

Несвязанный, но вы должны добавить ссылки на проекты, если их нет, в специальном процедура, * до * вы открываете соединение (чтобы подключение открывалось только до тех пор, пока оно вам нужно) - это говорит о том, что вы являетесь поздним связыванием ADODB, так что же это за идентификаторы GUID? –

ответ

1

В качестве альтернативы, вы можете использовать Python непосредственно для подключения к SQL Server (не COM интерфейс) и выходных данных в формате CSV или Excel формат (последний с использованием pandas, анализа данных пакета в Python):

Ниже 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() 

Ниже панды (С использованием read_sql, to_csv, to_excel) и поставщик OLEDB подход:

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 против adodbapi).

+0

Это маршрут, который я отправил, теперь очень благодарен вам за Par подробно за этот подробный ответ! – phtnm28

0

Вам не нужно добавлять какие-либо ссылки, если вы используете позднего связывания:

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