【问题标题】:Scriptcontrol object returns recordset objectScriptcontrol 对象返回记录集对象
【发布时间】:2017-07-28 18:52:53
【问题描述】:

我正在使用 vbscript 创建一个库,并使用 scriptcontrol 对象从 vba 调用这些例程。我正在尝试使用给定的 sql 作为参数创建一个记录集作为例程,如下所示

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 中创建了连接和记录集。
我需要这方面的帮助。

【问题讨论】:

    标签: vbscript scriptcontrol


    【解决方案1】:

    您的脚本存在很多问题。我不打算逐个介绍,但请注意,记录集打开调用有更多参数。它们不是必需的,但对于光标类型的默认值是 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 连接。您通常会打开连接,运行所有必需的查询并在关闭连接之前处理它们。为对同一个数据库的不同查询多次创建到同一个数据库的新连接是没有意义的。它只会增加不必要的开销。我会留给你改进代码供你使用。

    【讨论】:

    • 感谢您的回复。这只是一个示例,而不是优化的代码。我正在做一些研发以查看 scriptcontrol 对象是否将记录集从 vbscript 返回到调用 vba 中的应用程序。这就是我面临的问题。 ScriptControl 对象不将记录集返回给调用应用程序
    • 实际返回的是记录集对象的内存地址,所以不,你不能返回它。当 VBS 终止时,内存将被释放。 VBS 唯一可以返回的是退出代码。您可以在 VBA 中使用相同的代码,所以我不知道您为什么要调用 VBS 脚本来完成相同的工作。您需要做的就是添加对 Microsoft ActiveX 数据对象的引用以在 VBA 中使用它,在模块中使用 Option Explicit,并声明变量的类型。您的 Dim 将 Dim objRecordSet as ADODB.Recordset 和 Dim objADOConnection as ADODB.Connection。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 2018-07-11
    • 2021-06-30
    • 1970-01-01
    相关资源
    最近更新 更多