2

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

"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 并且这有效,但是 >=date 1 并且 <= date 2 给出了一个空答案

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

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

HAVING Count(*) >= " + diffResult; 

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

于 2012-06-11T12:30:16.310 回答
0

但是,如果您使用 anOleDbDataAdapter()而不是,OleDbCommand()以便可以将数据放入 Windows 窗体中的 datagridview 中呢?

于 2014-03-19T20:01:43.073 回答