共用方式為


使用命令呼叫預存程序

您可以使用命令來呼叫預存程序。 本主題結尾處的程式碼範例是指 Northwind 範例資料庫中稱為 CustOrdersOrders 的預存程序,其定義如下。

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

如需如何定義和呼叫預存程序的詳細資訊,請參閱您的 SQL Server 文件。

此預存程序與 Command 物件參數中使用的命令相似。 系統會使用客戶識別碼參數,並傳回該客戶訂單的相關資訊。 下列程式碼範例會使用此預存程序作為 ADO Recordset 的來源。

使用預存程序可讓您存取 ADO 的其他功能:Parameters 集合 Refresh 方法。 使用此方法,ADO 即可在執行階段自動填入命令所需的所有參數相關資訊。 ADO 必須查詢資料來源以取得參數的相關資訊,因此使用這項技術會降低效能。

下列程式碼範例與 Command 物件參數中的程式碼之間有其他重要差異,後者的參數為手動輸入。 首先,此程式碼不會將 Prepared 屬性設定為 True,因為它是 SQL Server 預存程序,且已根據定義預先編譯。 其次,Command 物件的 CommandType 屬性會在第二個範例中變更為 adCmdStoredProc,以通知 ADO 該命令為預存程序。

最後,在第二個範例中,由於您可能不知道設計階段的參數名稱,因此設定值時,索引必須參考參數。 如果您知道參數的名稱,您可以將 Command 物件的新 NamedParameters 屬性設定為 True,並參考屬性的名稱。 您或許會想知道為什麼預存程序中提及的第一個參數位置 (@CustomerID) 為 1,而不是 0 (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  

另請參閱

知識庫文章 117500