Parametri dell'oggetto Command
L'argomento precedente ha illustrato Creazione ed esecuzione di un comando semplice. Un uso più interessante per l'oggetto Command viene mostrato nell'esempio successivo, in cui il comando SQL è stato parametrizzato. Questa modifica consente di riutilizzare il comando, passando un valore diverso per il parametro ogni volta. Poiché la proprietà Prepared Property nell'oggetto Command è impostata su true, ADO richiederà al provider di compilare il comando specificato in CommandText prima di eseguirlo per la prima volta. Manterrà inoltre il comando compilato in memoria. Questo rallenta leggermente l'esecuzione del comando la prima volta che viene eseguito a causa del sovraccarico necessario per prepararlo, ma migliora le prestazioni ogni volta che il comando viene chiamato successivamente. Pertanto, i comandi devono essere preparati solo se verranno usati più volte.
'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
Non tutti i provider supportano i comandi preparati. Se il provider non supporta la preparazione dei comandi, potrebbe restituire un errore non appena questa proprietà è impostata su True. Se non restituisce un errore, ignora la richiesta di preparare il comando e imposta la proprietà Prepare su false.