Perché ho bisogno di OleDbCommand.Prepare ()?
-
03-07-2019 - |
Domanda
Sto lavorando con un datagrid e un adattatore che corrispondono a una tabella MSAccess tramite una query memorizzata (denominata " UpdatePaid " ;, 3 parametri come mostrato sotto) in questo modo:
OleDbCommand odc = new OleDbCommand("UpdatePaid", connection);
OleDbParameter param;
odc.CommandType = CommandType.StoredProcedure;
param = odc.Parameters.Add("v_iid", OleDbType.Double);
param.SourceColumn = "I";
param.SourceVersion = DataRowVersion.Original;
param = odc.Parameters.Add("v_pd", OleDbType.Boolean);
param.SourceColumn = "Paid";
param.SourceVersion = DataRowVersion.Current;
param = odc.Parameters.Add("v_Projected", OleDbType.Currency);
param.SourceColumn = "ProjectedCost";
param.SourceVersion = DataRowVersion.Current;
odc.Prepare();
myAdapter.UpdateCommand = odc;
...
myAdapter.Update();
Funziona bene ... ma la cosa davvero strana è che non finché non ho inserito la chiamata odc.Prepare () .
< br> La mia domanda è quindi: devo farlo continuamente quando lavoro con i processi / query memorizzati su OleDb? Perché? Ho anche un altro progetto in arrivo in cui dovrò fare la stessa cosa con un SqlDbCommand ... devo farlo anche con quelli?
Soluzione
Questo si chiama, stranamente, un'affermazione preparata, e in realtà sono davvero carini. Fondamentalmente, ciò che accade è creare o ottenere un'istruzione sql (inserire, eliminare, aggiornare) e invece di passare valori effettivi, si passa "? & Quot; come segnaposto. Questo va bene e va bene, tranne quello che vogliamo che i nostri valori vengano passati al posto del "quot"? ".
Quindi prepariamo l'istruzione in modo che invece di "? " passiamo i parametri come hai sopra che saranno i valori che vanno al posto dei segnaposti.
La preparazione analizza la stringa per trovare dove i parametri possono sostituire i punti interrogativi, quindi tutto ciò che devi fare è inserire i dati dei parametri ed eseguire il comando.
All'interno di oleDB, le query memorizzate sono istruzioni preparate, quindi è necessaria una preparazione. Non ho usato query memorizzate con SqlDB, quindi dovrei rinviare alle 2 risposte precedenti.
Altri suggerimenti
Non lo uso con SqlDbCommand. Mi sembra un bug che sia richiesto . Dovrebbe essere bello avere se hai intenzione di chiamare una procedura più volte di seguito. Forse mi sbaglio e c'è una nota nella documentazione sui provider che amano troppo questa chiamata.
Stai utilizzando il provider OLEDB JET? o MSDASQL + JET ODBC?
Non dovresti aver bisogno di chiamare Prepare ()
, ma credo che dipenda dal driver / provider.
Non devi assolutamente usare Prepare ()
per System.Data.SqlClient
.