2

このメッセージをC#経由でアクセスデータベースに送信しようとしています。ユーザー入力は、datePickerを介して選択された2つの日付です。日付ピッカー自体が短い形式として選択されます。また、accessdbフィールドも短い日時として選択されています。以下は私のコードです

"SELECT PLADS,COUNT(*)AS Total FROM OptagetPladser " +
"WHERE( Dato Between #" + date_1 + "# AND #" + date_2 + "# AND Optaget= 0) " +
"GROUP BY PLADS HAVING Total >= " + diffResult;

問題はbetweenステートメントにあるようです。> = date 1を使用してテストしましたが、date 1より大きいすべての結果が得られました。次に、<= date 2の結果だけで試してみましたが、これは機能しますが、> =date1および<=date2は空の答えになります。

4

3 に答える 3

4

パラメータを使用してみてください:

StringBuilder sb = new StringBuilder();
sb.AppendLine("SELECT PLADS, COUNT(*) AS Total FROM OptagetPladser");
sb.AppendLine("WHERE ((Dato Between ? AND ?) AND Optaget= 0)");
sb.AppendLine("GROUP BY PLADS HAVING Total >= ?");

確立された接続の使用:

using (OleDbCommand cmd = new OleDbCommand(sb.ToString(), cn)) {
  cmd.Parameters.AddWithValue("?", date_1);
  cmd.Parameters.AddWithValue("?", date_2);
  cmd.Parameters.AddWithValue("?", diffResult);
  using (OleDbDataReader rdr = cmd.ExecuteReader()) {
    while (rdr.Read()) {
      // do something
    }
  }
}

OleDbの場合、パラメーターはSQL文字列に表示されるタイミングのインデックスに基づいているため、「?」値は、クエリ文字列に表示されるのと同じ順序で入力する必要があります。

于 2012-06-10T18:15:51.413 に答える
0

あなたのHaving句で列エイリアスを使用できると確信していますか?

HAVING Count(*) >= " + diffResult; 

提案:すべての値を使用して作成したSQL文字列をコピーしてクエリデザイナに貼り付け、そこで実行されることを確認します。

于 2012-06-11T12:30:16.310 に答える
0

しかし、OleDbDataAdapter()代わりにを使用OleDbCommand()して、Windowsフォームのdatagridviewにデータを取り込むことができる場合はどうでしょうか。

于 2014-03-19T20:01:43.073 に答える