OleDbCommand.Prepare()が必要なのはなぜですか?
-
03-07-2019 - |
質問
次のように、保存されたクエリ(「UpdatePaid」という名前の3つのパラメーター)を介してMSAccessテーブルに対応するデータグリッドとアダプターを使用しています:
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();
正常に動作します...しかし、本当に奇妙なことは、 odc.Prepare()呼び出しを行うまでしませんでしたということです。
< br>私の質問は次のとおりです。OleDbストアドプロシージャ/クエリを使用する場合、常にそれを行う必要がありますか?どうして?また、SqlDbCommandを使用して同じことを行う必要がある別のプロジェクトがあります。これらのプロジェクトも同様に行う必要がありますか?
解決
これは、奇妙なことに、準備されたステートメントと呼ばれ、実際に素晴らしいです。基本的には、SQLステートメントを作成または取得(挿入、削除、更新)し、実際の値を渡す代わりに&quot;?&quot;を渡します。プレースホルダーとして。これはすべてうまくいきますが、「?」ではなく値を渡すことを望んでいます。
したがって、&quot;?&quot;の代わりにステートメントを準備し、上記のようにパラメーターを渡します。これらのパラメーターは、プレースホルダーの代わりに入力される値になります。
準備は文字列を解析して、パラメータが疑問符に置き換わることができる場所を見つけるため、パラメータデータを入力してコマンドを実行するだけです。
oleDB内では、ストアドクエリは準備済みステートメントなので、準備が必要です。 SqlDBでストアドクエリを使用したことがないので、前の2つの答えに従う必要があります。
他のヒント
SqlDbCommandでは使用しません。私にとっては、必須というバグのようです。プロシージャを連続して複数回呼び出す場合にのみ、必要にする必要があります。たぶん私は間違っていて、この呼び出しが大好きなプロバイダーについてのドキュメントにメモがあります。
JET OLEDBプロバイダーを使用していますか?またはMSDASQL + JET ODBC?
Prepare()
を呼び出す必要はありませんが、ドライバー/プロバイダーに依存していると思います。
System.Data.SqlClient
に Prepare()
を使用する必要はありません。