Command 개체 매개 변수
이전 항목에서는 간단한 명령 만들기 및 실행에 대해 설명했습니다. SQL 명령이 매개 변수화된 다음 예제에서는 Command 개체에 대한 더 흥미로운 사용이 나와 있습니다. 이렇게 수정하면 매번 매개 변수에 대해 다른 값을 전달하여 명령을 다시 사용할 수 있습니다. Command 개체의 Prepared Property 속성이 true로 설정되어 있으므로 ADO는 공급자가 CommandText에 지정된 명령을 처음으로 실행하기 전에 컴파일하도록 요구합니다. 또한 컴파일된 명령을 메모리에 유지합니다. 이렇게 하면 준비에 필요한 오버헤드로 인해 처음 실행될 때 명령 실행 속도가 약간 느려지지만, 이후 명령이 호출될 때마다 성능이 향상됩니다. 따라서 명령을 두 번 이상 사용하는 경우에만 준비해야 합니다.
'BeginManualParamCmd
Public Sub ManualParamCmd
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 the CommandText as a parameterized SQL query.
objCmd.CommandText = "SELECT OrderID, OrderDate, " & _
"RequiredDate, ShippedDate " & _
"FROM Orders " & _
"WHERE CustomerID = ? " & _
"ORDER BY OrderID"
objCmd.CommandType = adCmdText
' Prepare command because we will be executing it more than once.
objCmd.Prepared = True
' Create new parameter for CustomerID. Initial value is ALFKI.
Set objParm1 = objCmd.CreateParameter("CustId", adChar, _
adParamInput, 5, "ALFKI")
objCmd.Parameters.Append objParm1
' Connect to the data source.
Set objConn = GetNewConnection
objCmd.ActiveConnection = objConn
' 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
' .Set new param value, re-execute command, and display.
objCmd("CustId") = "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
'EndManualParamCmd
End Sub
'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
모든 공급자가 준비된 명령을 지원하지는 않습니다. 공급자가 명령 준비를 지원하지 않는 경우 이 속성이 True로 설정되는 즉시 오류를 반환할 수 있습니다. 오류를 반환하지 않으면 명령 준비 요청을 무시하고 Prepared 속성을 false로 설정합니다.