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?

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top