使用命令调用存储过程
可以使用命令来调用存储过程。 本主题结尾处的代码示例是 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