Command を使用してストアド プロシージャを呼び出す
コマンドを使用してストアド プロシージャを呼び出すことができます。 このトピックの最後にあるコード サンプルは、次のように定義されている CustOrdersOrders と呼ばれる Northwind サンプル データベースのストアド プロシージャを参照します。
CREATE PROCEDURE CustOrdersOrders @CustomerID nchar(5) AS
SELECT OrderID, OrderDate, RequiredDate, ShippedDate
FROM Orders
WHERE CustomerID = @CustomerID
ORDER BY OrderID
ストアド プロシージャを定義して呼び出す方法の詳細については、SQL Server ドキュメントを参照してください。
このストアド プロシージャは、Command オブジェクト パラメーターで使用されるコマンドに似ています。 顧客 ID パラメーターを受け取り、その顧客の注文に関する情報を返します。 次のコード サンプルでは ADO Recordset のソースとして、このストアド プロシージャを使用します。
ストアド プロシージャを使用すると、ADO の別の機能である Parameters コレクションの Refresh メソッドにアクセスできます。 このメソッドを使用すると、ADO では実行時にコマンドで必要なパラメーターに関するすべての情報を自動的に入力できます。 ADO ではパラメーターに関する情報をデータ ソースに照会する必要があるため、この手法を使用するとパフォーマンスが低下します。
次のコード サンプルと、パラメーターが手動で入力された Command オブジェクト パラメーターのコードには、その他の重要な違いがあります。 まず、このコードでは、Prepared プロパティを True に設定しません。これは、SQL Server ストアド プロシージャであり、定義によってプリコンパイルされるためです。 次に、Command オブジェクトの CommandType プロパティが 2 番目の例の adCmdStoredProc に変更され、コマンドがストアド プロシージャであることが ADO に通知されます。
最後に、2 番目の例では、デザイン時にパラメーターの名前がわからない可能性があるため、値を設定するときに、パラメーターをインデックスで参照する必要があります。 パラメーターの名前がわかっている場合は、Command オブジェクトの新しい NamedParameters プロパティを True に設定し、プロパティの名前を参照できます。 ストアド プロシージャ (@CustomerID) で説明されている最初のパラメーターの位置が 0 ではなく 1 (objCmd(1) = "ALFKI"
) である理由を疑問に思うかもしれません。 これは、パラメーター 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