2017-02-02 61 views
1

您好腳本編程人員來自全國各地,我目前工作的一個VBScript來從一個Excel工作表拉查詢參數和SQL服務器(Sybase ASE的)上運行一個查詢的每一行在Excel表格中。運行從Excel工作表中多個查詢在VBScript

目前我有成功拉動參數並運行第一行的代碼,但是當我開始下一行時,由於「缺少對象」而導致查詢失敗,但我已經試圖保持打開ADO連接並且將查詢重新運行到記錄集中,以及爲Excel表中的每一行重新創建連接並運行記錄集。我的代碼當前如下:

Dim MyConnection, MyRecordSet, MyExcel, MyExcelBook, MyExcelSheet 
Dim ConnectionString, Parameter1, Parameter2, SQL, I 
ConnectionString = "Driver=ODBC Driver;UserID=Admin;Password=Pass;" 

Set MyExcel = CreateObject("Excel.Application") 
Set MyExcelBook = MyExcel.Workbooks.Open("C:/Test.xls") 
Set MyExcelSheet = MyExcelBook.WorkSheets(2) 
Set MyConnection = CreateObject("ADODB.Connection") 
Set MyRecordSet = CreateObject("ADODB.RecordSet") 
MyConnection.Open ConnectionString 
I = 2 

Do while MyExcelSheet.Cells(I,2).Value <> "" 
    Parameter1 = MyExcelSheet.Cells(I,6).Value 
    Parameter2 = MyExcelSheet.Cells(I,7).Value 
    SQL = "Select * From Table Where Type=" & Parameter1 & " AND Color=" & Parameter2 & ";" 
    MyRecordSet.Open SQL, MyConnection 
    'Save RecordSet to another Excel sheet' 
    MyRecordSet.Close 
    I = I + 1 
loop 

MyConnection.Close 
Set MyConnection = Nothing 

有什麼辦法沒有運行到所需

錯誤

對象運行在同一個連接到數據庫上的另一個查詢?


suggested changes之後編輯,仍然有相同的錯誤。

Dim MyConnection, MyExcel, MyExcelBook, MyExcelSheet 
Dim ConnectionString, Parameter1, Parameter2, SQL, I 
ConnectionString = "Driver=ODBC Driver;UserID=Admin;Password=Pass;" 

Set MyExcel = CreateObject("Excel.Application") 
Set MyExcelBook = MyExcel.Workbooks.Open("C:/Test.xls") 
Set MyExcelSheet = MyExcelBook.WorkSheets(2) 
Set MyConnection = CreateObject("ADODB.Connection") 
MyConnection.Open ConnectionString 
I = 2 

Do while MyExcelSheet.Cells(I,2).Value <> "" 
    Parameter1 = MyExcelSheet.Cells(I,6).Value 
    Parameter2 = MyExcelSheet.Cells(I,7).Value 
    SQL = "Select * From Table Where Type=" & Parameter1 & " AND Color=" & Parameter2 & ";" 
    Dim MyRecordSet 
    Set MyRecordSet = CreateObject("ADODB.RecordSet") 
    MyRecordSet.Open SQL, MyConnection 
    'Save RecordSet to another Excel sheet' 
    MyRecordSet.Close 
    I = I + 1 
loop 

MyConnection.Close 
Set MyConnection = Nothing 
+0

你是否檢查'SQL'變量包含在循環的連續迭代預期的查詢?使用'WScript.Echo SQL'即可查看每個查詢中包含,我大膽猜測的問題是從Excel傳遞的參數。 – Lankymart

+0

我都回蕩着SQL,並且他們都是在2次不同的迭代是正確的。我試圖在do ... while循環中重新連接ADODB.Connection,並發現錯誤也發生在那裏。所以我的推斷是它不一定是導致錯誤的Recordset,而是第二次迭代中的MyConnection。 – TheTinkerer

+0

好的,你正在使用的SQL Server版本呢?嘗試使用正確的SQL Server而不是一般的ODBC驅動程序,請參見http://connectionstrings.com/sqlserver/ – Lankymart

回答

1

所以經過對不同想法的大量測試之後,我終於得到了可以工作的代碼。當MyRecordSet被關閉時,問題就發生了。狀態回到0,當你試圖重新打開MyRecordSet時,它會失敗,並有一個破碎的對象。重新連接然後重新打開MyRecordSet導致相同的錯誤。所以這裏是完成的代碼編輯工作。

Dim MyConnection, MyRecordSet, MyExcel, MyExcelBook, MyExcelSheet 
Dim ConnectionString, Parameter1, Parameter2, SQL, I 
ConnectionString = "Driver=Adaptive Server Enterprise;UserID=Admin;Password=Pass;Pooling=False" 

Set MyExcel = CreateObject("Excel.Application") 
Set MyExcelBook = MyExcel.Workbooks.Open("C:/Test.xls") 
Set MyExcelSheet = MyExcelBook.WorkSheets(2) 
I = 2 

Do while MyExcelSheet.Cells(I,2).Value <> "" 
    Parameter1 = MyExcelSheet.Cells(I,6).Value 
    Parameter2 = MyExcelSheet.Cells(I,7).Value 
    SQL = "Select * From Table Where Type=" & Parameter1 & " AND Color=" & Parameter2 & ";" 
    Set MyConnection = CreateObject("ADODB.Connection") 
    MyConnection.Open ConnectionString 
    Set MyRecordSet = CreateObject("ADODB.RecordSet") 
    MyRecordSet.Open SQL, MyConnection 
    'Save RecordSet to another Excel sheet' 
    Set MyRecordSet = Nothing 
    Set MyConnection = Nothing 
    I = I + 1 
loop 

現在,如果你問我是否具體數據庫,我不知道。但是,這段代碼適用於使用Adaptive Server Enterprise驅動程序,並且我使用LankyMart的建議來關閉連接池。我明白,只有在不關閉連接的情況下設置'object = Nothing',首先會違背標準編碼實踐,但它可以工作。感謝那些幫助。

0

連接對象不需要爲每個查詢打開和關閉。試試吧:

Dim MyConnection, MyExcel, MyExcelBook, MyExcelSheet 
Dim ConnectionString, Parameter1, Parameter2, SQL, I 
ConnectionString = "Driver=ODBC Driver;UserID=Admin;Password=Pass;" 

Set MyExcel = CreateObject("Excel.Application") 
Set MyExcelBook = MyExcel.Workbooks.Open("C:/Test.xls") 
Set MyExcelSheet = MyExcelBook.WorkSheets(2) 
I = 2 

Set MyConnection = CreateObject("ADODB.Connection") 
MyConnection.Open ConnectionString 
Do while MyExcelSheet.Cells(I,2) <> "" 
    Parameter1 = MyExcelSheet.Cells(I,6).Value 
    Parameter2 = MyExcelSheet.Cells(I,7).Value 
    SQL = "Select * From Table Where Type=" & Parameter1 & " AND Color=" & Parameter2 & ";" 
    Dim MyRecordSet 
    Set MyRecordSet = CreateObject("ADODB.RecordSet") 
    MyRecordSet.Open SQL, MyConnection 
    'Save RecordSet to another Excel sheet' 
    MyRecordSet.Close 
    Set MyRecordSet = Nothing 
    I = I + 1 
Loop 
MyConnection.Close 
Set MyConnection = Nothing 
+0

我只是試圖運行,它仍然跑入「對象需要」運行時錯誤。連接仍處於打開狀態,但在重新創建記錄集對象時失敗 – TheTinkerer

+0

嘗試上述修訂,在此處我將Dim MyRecordSet放置在循環中。 – Rich

+0

然後我運行到'Object Redefined'編譯錯誤。我會在早些時候編輯我的評論以說明它在何時使用MyConnection.open而不是創建對象。 – TheTinkerer