我无法在查询中选择一系列日期我的“查询”之间没有答案

时间:2012-06-10 18:03:45

标签: c# ms-access

我正在尝试通过C#将此消息发送到访问数据库。用户输入是通过datePicker选择的两个日期。日期选择器本身被选为短格式。并且还将访问数据库字段选为短日期时间。以下是我的代码

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

问题似乎是两者之间的陈述。我已经使用> =日期1进行了测试,并且我得到的所有结果都大于日期1.然后我尝试只使用结果< = date 2,这可以工作,但是> =日期1和< = date 2给出了空答案

3 个答案:

答案 0 :(得分: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字符串中的索引,因此,“?”必须按照它们在查询字符串中出现的顺序输入值。

答案 1 :(得分:0)

您确定可以在Having子句中使用列别名吗?

HAVING Count(*) >= " + diffResult; 

建议:将使用所有值构建的sql字符串复制并粘贴到查询设计器中,并确保它在那里运行。

答案 2 :(得分:0)

但是如果您使用的是OleDbDataAdapter()而不是OleDbCommand(),那么您可以将数据导入到Windows窗体中的数据网格视图中呢?