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

このようにして、値を正しく解釈する負担は、データベースの要件に従って日付、10 進数、および文字列をフォーマットできるフレームワーク コードに渡されます。ちなみにこれでSqlインジェクションも防げます

また、USER という単語は Access SQL の予約キーワードであるため、角かっこでカプセル化する必要があります。

于 2013-05-24T22:37:46.977 に答える
1

まず最も重要なのは、パラメータ化されたクエリを使用することです!

あなたの問題に関して、コードをデバッグすることをお勧めします:

「OleDbCommand dbcommand」の Commandtext を取得し、手動でクエリを実行して、同じ結果が得られるかどうかを確認します。

また、コードを try catch ブロック内に配置する必要があります。そうしないと、まったく意味がありません。

于 2013-05-24T22:42:04.643 に答える