次の方法で共有


コマンドを使用したストアド プロシージャの呼び出し

コマンドを使用してストアド プロシージャを呼び出すことができます。 このトピックの最後にあるコード サンプルは、次のように定義されている CustOrdersOrders と呼ばれる Northwind サンプル データベースのストアド プロシージャを参照します。

CREATE PROCEDURE CustOrdersOrders @CustomerID nchar(5) AS  
SELECT OrderID, OrderDate, RequiredDate, ShippedDate  
FROM Orders  
WHERE CustomerID = @CustomerID  
ORDER BY OrderID  

ストアド プロシージャを定義して呼び出す方法の詳細については、SQL Server のドキュメントを参照してください。

このストアド プロシージャは、コマンド オブジェクト パラメーターで使用されるコマンドに似ています。 顧客 ID パラメーターを受け取り、その顧客の注文に関する情報を返します。 次のコード サンプルでは、ADO Recordsetのソースとしてこのストアド プロシージャを使用します。

ストアド プロシージャを使用すると、ADO の別の機能である Parameters コレクション Refresh メソッドにアクセスできます。 このメソッドを使用すると、実行時にコマンドに必要なパラメーターに関するすべての情報を ADO で自動的に入力できます。 ADO ではパラメーターに関する情報をデータ ソースに照会する必要があるため、この手法を使用するとパフォーマンスが低下します。

次のコード サンプルと、パラメーターが手動で入力された コマンド オブジェクト パラメーターのコードには、その他の重要な違いがあります。 最初に、このコードでは、sql Server ストアド プロシージャであり、定義によってプリコンパイルされるため、準備済み プロパティを true に設定しません。 次に、Command オブジェクトの CommandType プロパティが、コマンドがストアド プロシージャであることを ADO に通知するために、2 番目の例で adCmdStoredProc に変更されました。

最後に、2 番目の例では、デザイン時にパラメーターの名前がわからない可能性があるため、値を設定するときに、パラメーターをインデックスで参照する必要があります。 パラメーターの名前がわかっている場合は、Command オブジェクトの新しい NamedParameters プロパティを True に設定し、プロパティの名前を参照できます。 ストアド プロシージャ (@CustomerID) で説明されている最初のパラメーターの位置が 0 (objCmd(1) = "ALFKI") ではなく 1 である理由が気になる場合があります。 これは、パラメーター 0 に SQL Server ストアド プロシージャからの戻り値が含まれているためです。

'BeginAutoParamCmd  
    On Error GoTo ErrHandler:  
  
    Dim objConn As New ADODB.Connection  
    Dim objCmd As New ADODB.Command  
    Dim objParm1 As New ADODB.Parameter  
    Dim objRs As New ADODB.Recordset  
  
    ' Set CommandText equal to the stored procedure name.  
    objCmd.CommandText = "CustOrdersOrders"  
    objCmd.CommandType = adCmdStoredProc  
  
    ' Connect to the data source.  
    Set objConn = GetNewConnection  
    objCmd.ActiveConnection = objConn  
  
    ' Automatically fill in parameter info from stored procedure.  
    objCmd.Parameters.Refresh  
  
    ' Set the param value.  
    objCmd(1) = "ALFKI"  
  
    ' Execute once and display...  
    Set objRs = objCmd.Execute  
  
    Debug.Print objParm1.Value  
    Do While Not objRs.EOF  
        Debug.Print vbTab & objRs(0) & vbTab & objRs(1) & vbTab & _  
                    objRs(2) & vbTab & objRs(3)  
        objRs.MoveNext  
    Loop  
  
    ' ...then set new param value, re-execute command, and display.  
    objCmd(1) = "CACTU"  
    Set objRs = objCmd.Execute  
  
    Debug.Print objParm1.Value  
    Do While Not objRs.EOF  
        Debug.Print vbTab & objRs(0) & vbTab & objRs(1) & vbTab & _  
                    objRs(2) & vbTab & objRs(3)  
        objRs.MoveNext  
    Loop  
  
    'clean up  
    objRs.Close  
    objConn.Close  
    Set objRs = Nothing  
    Set objConn = Nothing  
    Set objCmd = Nothing  
    Set objParm1 = Nothing  
    Exit Sub  
  
ErrHandler:  
    'clean up  
    If objRs.State = adStateOpen Then  
        objRs.Close  
    End If  
  
    If objConn.State = adStateOpen Then  
        objConn.Close  
    End If  
  
    Set objRs = Nothing  
    Set objConn = Nothing  
    Set objCmd = Nothing  
    Set objParm1 = Nothing  
  
    If Err <> 0 Then  
        MsgBox Err.Source & "-->" & Err.Description, , "Error"  
    End If  
'EndAutoParamCmd  
  
'BeginNewConnection  
Private Function GetNewConnection() As ADODB.Connection  
    Dim oCn As New ADODB.Connection  
    Dim sCnStr As String  
  
    sCnStr = "Provider='SQLOLEDB';Data Source='MySqlServer';" & _  
             "Integrated Security='SSPI';Initial Catalog='Northwind';"  
    oCn.Open sCnStr  
  
    If oCn.State = adStateOpen Then  
        Set GetNewConnection = oCn  
    End If  
  
End Function  
'EndNewConnection  

関連項目

ナレッジベースの記事 117500