1

以下は私が持っているコードです。私の人生では、クエリの何が問題なのかを理解することはできません。

私はもともと「1つ以上のパラメーターに値が指定されていません」というエラーがありましたが、消えたようです(ただし、なぜそれを取得したのかさえわかりません)。

このコードの前に接続が開かれます。パラメータ GVars.thisFY は文字列 = "FY13" です - このテーブルは確実に存在します。パラメータ GVars.currentDate は、DateTime = 今日です。

この [Destination] および [Next Collection] 範囲のレコードは確実に存在します。

string sql;
OleDbDataAdapter adapter;

sql = "SELECT * FROM @CurFY WHERE [Destination] = @Destination AND [Next Collection] BETWEEN @NextCollectionA AND @NextCollectionB;";

// Create the command object
OleDbCommand cmd = new OleDbCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = sql;

// Add values to the fields
cmd.Parameters.AddWithValue("@CurFY", GVars.thisFY);
cmd.Parameters.AddWithValue("@Destination", "Henwood");
cmd.Parameters.AddWithValue("@NextCollectionA", GVars.currentDate);
cmd.Parameters.AddWithValue("@NextCollectionB", GVars.currentDate.AddDays(1));

adapter = new OleDbDataAdapter(cmd.CommandText, conn);

try
{
    adapter.Fill(ds);

    GVars.bLblLastUpdate = DateTime.Now.ToString("HH:mm:ss");
}
catch (Exception ex)
{
}

編集: 以下のようにテーブル パラメーターを削除するようにコードを変更しましたが、「1 つ以上のパラメーターに値が指定されていません」というメッセージが引き続き表示されますが、特定できません..

EDIT2:余分なものを削除したので、投稿は回答済みの元の質問のみに関連しています。奇妙な「値が指定されていません」エラーに対して新しい質問を作成します

4

2 に答える 2

5

テーブル、ビュー、または列の名前でクエリをパラメーター化することはできません。パラメーター化できるのはデータ メンバーのみです。

次のように、SQL を動的に作成する必要があります。

sql = string.Format(
    "SELECT * FROM {0} WHERE [Destination] = @Destination AND [Next Collection] BETWEEN @NextCollectionA AND @NextCollectionB;"
,  GVars.thisFY
);

これは、コードによって制御されている場合にのみ実行する必要があります。たとえば、事前定義されたリストから取得したり、 SQL インジェクション攻撃GVars.thisFYを回避するために英数字以外の文字がないことを確認したりします。

于 2013-06-10T11:02:52.127 に答える
1

これを試してみてください -

sql = Sring.Format(
    "SELECT * FROM {0} WHERE [Destination] = @Destination AND [Next Collection] BETWEEN @NextCollectionA AND @NextCollectionB;", 
    GVars.thisFY
)

cmd.Parameters.AddWithValue("@Destination", "Henwood");
cmd.Parameters.AddWithValue("@NextCollectionA", GVars.currentDate);
cmd.Parameters.AddWithValue("@NextCollectionB", GVars.currentDate.AddDays(1));
于 2013-06-10T11:03:09.867 に答える