使用命令调用存储过程

可以使用命令调用存储过程。 本主题末尾的代码示例引用了 Northwind 示例数据库中的一个存储过程,称为 CustOrdersOrders,其定义如下。

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 必须查询数据源以获取有关参数的信息。

以下代码示例与 命令对象参数中的代码之间存在其他重要差异,其中手动输入了参数。 首先,此代码不会将 Prepared 属性设置为 True,因为它是 SQL Server 存储过程,并且按定义预编译。 其次,Command 对象的 CommandType 属性在第二个示例中更改为 adCmdStoredProc,以通知 ADO 该命令是存储过程。

最后,在设置值时,必须在第二个示例中通过索引引用参数,因为在设计时可能不知道参数的名称。 如果知道参数的名称,可以将 Command 对象的 new 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