使用命令调用存储过程

可以使用命令来调用存储过程。 本主题结尾处的代码示例是 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 对象参数中使用的命令。 它采用客户 ID 参数并返回有关该客户订单的信息。 下面的代码示例使用此存储过程作为 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