2017-07-28 126 views
0

我正在使用vbscript創建一個庫,並使用scriptcontrol對象從vba調用這些例程。我試圖與給定的SQL作爲參數創建一個記錄作爲日常如下Scriptcontrol對象返回記錄集對象

sub GetData(sql, byref retrst) 

stADO = "Provider=SQLOLEDB.1;Persist Security Info=False;Initial 
     Catalog=CCMSProd;Data Source=sv-hfi-ccms;UID=vc;PWD=dw;" 

cnconn as adoconnection 
Set cnconn = CreateObject("ADODB.Connection") 

cnconn.Open stADO 

msgbox cnconn.ConnectionString 
msgbox cnconn.state 

    With cnconn 
     .CommandTimeout = 0 
     Set retrst = .Execute(sql) 
     msgbox retrst.recordcount 
    End With 
cnconn.close 
end sub 

並調用這個程序如下

  scr.Run "GetConnection", tempload, rst 

但我的記錄回報如無沉綿連接,並記錄在vbscript中創建。
我需要幫助。

回答

0

你的腳本有很多問題。我不打算進入每一個,但要知道,記錄集公開呼叫有更多的參數。它們不是必需的,但缺省值是adForwardOnly,而adLockReadOnly是鎖定的。使用默認值將不會使您從記錄集中獲取記錄計數,因此我提供的代碼僅顯示記錄集中第一條記錄的值,以指示檢索到數據。

https://support.microsoft.com/en-us/help/272067/how-to-get-a-record-count-from-a-sql-server-ce-recordset

以下作品中的代碼,但是你需要修改它爲您的使用。 批處理文件來運行該腳本:

GetRecordset.bat

cscript.exe /nologo GetRecordset.vbs 
pause 

腳本來運行:

GetRecordset.vbs

Dim objADORecordset 
Dim strDBTableName 

On Error Resume Next 

'*****Modify below to a table name in your database***** 
strDBTableName = "SomeDBTableName" 

Set objADORecordset = CreateObject("ADODB.Recordset") 
If Err.Number = 0 Then 
    GetRecordset "SELECT * FROM " & strDBTableName, objADORecordset 
    With objADORecordset 
     If Not .BOF Then 
      .MoveFirst 
      WScript.Echo "Field 0: " & .Fields(0).Value 
     Else 
      WScript.Echo "No records in recordset" 
     End If 
    End With 
Else 
    WScript.Echo "Unable to create ADO Recordset" 
End If 
set objADORecordset = Nothing 

WScript.Quit 

'********************************************* 
Sub GetRecordset(astrSQLQuery, aobjRecordset) 
    Dim strOLEConnect 
    Dim strUserID 
    Dim strUserPW 
    Dim objADOConnection 

    On Error Resume Next 

    WScript.Echo "SQLQuery: " & astrSQLQuery 

    strOLEConnect = "Provider=SQLOLEDB.1;Persist Security Info=False;Initial Catalog=CCMSProd;Data Source=sv-hfi-ccms;UID=vc;PWD=dw;" 
    strUserID = "vc" 
    strUserPW = "dw" 

    Set objADOConnection = CreateObject("ADODB.Connection") 
    If Err.Number = 0 Then 
     objADOConnection.Open strOLEConnect, strUserID, strUserPW 
     If Err.Number = 0 Then 
      aobjRecordset.Open astrSQLQuery, objADOConnection 
      If Err.Number <> 0 Then 
       WScript.Echo "Recordset open failed ERROR=" & Err.Number 
      End If 
     Else 
      WScript.Echo "Connection open failed ERROR=" & Err.Number 
     End If 
    Else 
     WScript.Echo "ADO connection failed ERROR=" & Err.Number 
    End If 
    Set objADOConnection = Nothing 
End Sub 

我離開它類似於你的代碼,這樣就可以理解它,但它應該真正創建並在ADORecordset之前打開ADO連接。您通常會打開連接,運行所有必需的查詢並在關閉連接之前處理它們。對同一個數據庫的不同查詢多次創建到同一個數據庫的新連接是沒有意義的。這隻會增加不必要的開銷。我會留給你,以改善你的使用代碼。

+0

感謝您的回覆。這只是一個例子,但不是優化的代碼。我正在做一些研發,看看scriptcontrol對象是否將vbscript的記錄集返回到vba中的調用應用程序。那是我面臨的問題。 ScriptControl對象不會將記錄集返回給調用應用程序 –

+0

實際返回的內容是記錄集對象的內存地址,因此不能返回該記錄集對象的內存地址。內存將在VBS終止時釋放。 VBS可以返回的唯一東西就是退出代碼。你可以在VBA中使用相同的代碼,所以我不知道你爲什麼要調用VBS腳本來完成同樣的工作。您只需添加一個對Microsoft ActiveX Data Objects的引用以在VBA中使用它,在模塊中使用Option Explicit並聲明變量的類型。你的Dim的Dim objRecordSet爲ADODB.Recordset,Dim objADOConnection爲ADODB.Connection。 – thx1138v2