Question

Je travaille avec une grille de données et un adaptateur correspondant à une table MSAccess via une requête stockée (nommée "UpdatePaid", 3 paramètres tels qu'illustrés ci-dessous), comme suit:

    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();

Cela fonctionne bien ... mais ce qui est vraiment étrange, c'est que cela n'a pas fonctionné jusqu'à ce que je mette l'appel odc.Prepare () .
< Voici ma question: Dois-je le faire tout le temps lorsque je travaille avec des processus / requêtes stockés OleDb? Pourquoi? J'ai également un autre projet à venir où je devrai faire la même chose avec une commande SqlDb ... dois-je le faire avec ceux-là aussi?

Était-ce utile?

La solution

Cela s'appelle, assez curieusement, une déclaration préparée, et ils sont vraiment très sympas. En gros, qu’il s’agisse de créer ou d’obtenir une instruction SQL (insertion, suppression, mise à jour) et de ne pas transmettre les valeurs réelles, vous passez "?? & Quot; en tant que titulaire. Tout cela est bien beau, sauf que nous voulons que nos valeurs soient transmises à la place du "?".

Nous préparons donc la déclaration et, au lieu de "?", nous transmettons les paramètres ci-dessus, qui correspondent aux valeurs qui remplacent les espaces réservés.

La préparation analyse la chaîne pour rechercher où les paramètres peuvent remplacer les points d'interrogation. Il vous suffit donc d'entrer les données du paramètre et d'exécuter la commande.

Dans oleDB, les requêtes stockées sont des instructions préparées. Par conséquent, une préparation est requise. Je n'ai pas utilisé de requêtes stockées avec SqlDB, je devrais donc m'en remettre aux 2 réponses précédentes.

Autres conseils

Je ne l'utilise pas avec SqlDbCommand. Il me semble qu’il est obligatoire . Cela ne devrait être agréable d’avoir que si vous appelez une procédure plusieurs fois de suite. Peut-être que je me trompe et que la documentation mentionne des fournisseurs qui aiment trop cet appel.

Utilisez-vous le fournisseur JET OLEDB? ou MSDASQL + JET ODBC?

Vous n'avez pas besoin d'appeler Prepare () , mais j'estime que cela dépend du pilote / du fournisseur.

Vous n'avez certainement pas besoin d'utiliser Prepare () pour System.Data.SqlClient .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top