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