我正在尝试通过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给出了空答案
答案 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窗体中的数据网格视图中呢?