2

次のように、保存されたクエリ(「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()呼び出しを入れるまでうまくいかなかったことです。したがって、私の質問は次のとおりです。OleDb ストアド プロシージャ/クエリを操作するときに、常にそれを行う必要がありますか? なんで?また、SqlDbCommand を使用して同じことを行う必要がある別のプロジェクトも予定されています...それらも使用する必要がありますか?

4

3 に答える 3

4

これは、奇妙なことに、準備済みステートメントと呼ばれ、実際には非常に優れています。基本的に何が起こるかは、SQL ステートメント (挿入、削除、更新) を作成または取得し、実際の値を渡す代わりに「?」を渡すことです。プレースホルダーとして。これで問題ありませんが、"?" の代わりに値が渡されるようにする必要があります。

そのため、ステートメントを準備して、「?」の代わりに、上記のようにパラメーターを渡します。これは、プレースホルダーの代わりに使用される値になります。

準備は文字列を解析して、パラメーターが疑問符を置き換えることができる場所を見つけるため、パラメーター データを入力してコマンドを実行するだけです。

oleDB 内では、ストアド クエリは準備済みステートメントであるため、準備が必要です。SqlDB でストアド クエリを使用したことがないため、前の 2 つの回答に従う必要があります。

于 2008-10-01T04:30:49.490 に答える
0

SqlDbCommand では使用しません。それが必要なことは私にはバグのようです。プロシージャを連続して複数回呼び出す場合にのみ、あると便利です。たぶん私が間違っているのかもしれません。この呼び出しが大好きなプロバイダーに関するドキュメントに注意書きがあります。

于 2008-09-30T23:22:17.987 に答える
0

JET OLEDB プロバイダーを使用していますか? またはMSDASQL + JET ODBC?

を呼び出す必要はありませんがPrepare()、それはドライバー/プロバイダーに依存すると思います。

Prepare()forを使用する必要はまったくありませんSystem.Data.SqlClient

于 2008-09-30T23:27:24.667 に答える