ExecuteScalar始终返回0

时间:2013-05-24 22:33:54

标签: c# oledb executescalar

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

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

    }

2 个答案:

答案 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块中,否则根本就没有意义。