-1

我不确定为什么会这样。我在网上看到过同样的问题,但几乎没有人帮助纠正它。

当我在 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;

    }
4

2 回答 2

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();

通过这种方式,正确解释您的值的负担被传递给框架代码,该代码可以根据您的数据库要求格式化日期、小数和字符串。顺便说一句,这也将防止 Sql Injection

此外,单词 USER 是 Access SQL 中的保留关键字,因此您需要用方括号将其封装起来

于 2013-05-24T22:37:46.977 回答
1

首先也是最重要的:使用参数化查询!

关于您的问题,我建议您调试代码:

获取“OleDbCommand dbcommand”的命令文本并手动查询以查看是否得到相同的结果。

此外,您应该将代码放在 try catch 块中,否则它根本没有意义。

于 2013-05-24T22:42:04.643 回答