我不确定为什么会这样。我在网上看到同样的问题,但没有任何帮助来纠正它。
当我在Access中运行我的查询时,得到的值不同,范围从0到10,但由于某种原因,它不会在我的代码中返回相同的值。
static int OrdersPerHour(string User)
{
int? OrdersPerHour = 0;
OleDbConnection conn = new OleDbConnection(strAccessConn);
DateTime curTime = DateTime.Now;
try
{
string query = "SELECT COUNT(ControlNumber) FROM Log WHERE DateChanged > #" + curTime.AddHours(-1) + "# AND User = '" + User + "' AND Log.EndStatus in ('Needs Review', 'Check Search', 'Vision Delivery', 'CA Review', '1TSI To Be Delivered');";
OleDbCommand dbcommand = new OleDbCommand(query, conn);
dbcommand.Connection.Open();
dbcommand.CommandType = CommandType.Text;
dbcommand.CommandText = query;
OrdersPerHour = (int?)dbcommand.ExecuteScalar();
}
catch (OleDbException ex)
{
}
finally
{
conn.Close();
}
return OrdersPerHour.Value;
}
答案 0 :(得分:3)
不要使用字符串连接和Access语法来构建sql命令 使用像这样的简单参数化查询
string query = "SELECT COUNT(ControlNumber) FROM Log " +
"WHERE DateChanged > ? AND [User] = ? AND " +
"Log.EndStatus in ('Needs Review', 'Check Search', 'Vision Delivery'," +
"'CA Review', '1TSI To Be Delivered');";
OleDbCommand dbcommand = new OleDbCommand(query, conn);
dbcommand.Parameters.AddWithValue("@p1", curTime.AddHours(-1));
dbcommand.Parameters.AddWithValue("@p2", User);
dbcommand.Connection.Open();
dbcommand.CommandType = CommandType.Text;
OrdersPerHour = (int)dbcommand.ExecuteScalar();
通过这种方式,正确解释您的值的负担将传递给Framework代码,该代码可以根据您的数据库要求格式化日期,小数和字符串。顺便说一下,这也会阻止Sql Injection
此外,USER一词是Access SQL中的保留关键字,因此您需要使用方括号将其封装
答案 1 :(得分:1)
首先也是最重要的:使用参数化查询!
关于您的问题,我建议您调试代码:
获取“OleDbCommand dbcommand”的Commandtext并手动查询以查看是否得到相同的结果。
另外,你应该把你的代码放在try catch块中,否则根本就没有意义。