2017-07-28 3 views
0

私はvbscriptを使用してライブラリを作成していますが、scriptcontrolオブジェクトを使用してこれらのルーチンをvbaから呼び出すことができます。私は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 

以下のようにパラメータとして与えられたSQLを使用したルーチンとしてレコードセットを作成しようと何として

  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にある呼び出しアプリケーションにレコードセットを返すかどうかを調べるためにいくつかのR&Dを行っています。それが私が直面している問題です。呼び出し元のアプリケーションにレコードセットを返さないScriptControlオブジェクト –

+0

実際に返されるのは、レコードセットオブジェクトのメモリアドレスであるため、返すことはできません。メモリは、VBSが終了すると解放されます。 VBSが返すことができるのは、終了コードだけです。 VBAでこの同じコードを使用することができますので、VBSスクリプトを呼び出して同じ作業を行う理由がわかりません。 VBAで使用するためにMicrosoft ActiveX Data Objectsへの参照を追加し、モジュールでOption Explicitを使用し、変数の型を宣言するだけです。あなたのDimはADODB.RecordsetとしてDim objRecordSetになり、ADODB.ConnectionとしてDim objADOConnectionになります。 – thx1138v2

関連する問題