2

Access 内部または C# から OleDbCommand として機能する次のクエリがあります。

SELECT Table1.ProductType, Sum(Table1.ProductsSold)
FROM Table1
WHERE (Table1.DateTime Between #5/16/2013# And #5/17/2013#)
GROUP BY Table1.ProductType;

Table1.DateTime は日付/時刻データ型です。

ここで、日付を OleDbParameters として渡したいと思います。

SELECT Table1.ProductType, Sum(Table1.ProductsSold)
FROM Table1
WHERE (Table1.DateTime Between #@StartDate# And #@StopDate#)
GROUP BY Table1.ProductType;

cmd.Parameters.Add(new OleDbParameter("@StartDate", OleDbType.Date));
cmd.Parameters["@StartDate"].Value = dateTimePicker1.Value.ToShortDateString();
cmd.Parameters.Add(new OleDbParameter("@StopDate", OleDbType.Date));
cmd.Parameters["@StopDate"].Value = dateTimePicker2.Value.ToShortDateString();

私は多くのことを検索して試しました (VarChar と文字列、ハッシュタグの代わりの一重引用符、コマンドまたはパラメーターのハッシュタグなど)。日付を真夜中に開始したい (したがって、ToShortDateString() および Date 型)。

4

1 に答える 1

4

#クエリ テキストのハッシュ マーク ( ) 区切り記号を取り除く必要があります。#日付や'文字列などの区切り文字は、リテラルSQL クエリに必要ですが、パラメーター化された SQL クエリでは省略しなければなりません。参考までに、これが私の作業テストコードです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;

namespace oledbTest1
{
    class Program
    {
        static void Main(string[] args)
        {
            var conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\__tmp\testData.accdb;");
            conn.Open();
            var cmd = new OleDbCommand(
                    "SELECT Table1.ProductType, SUM(Table1.ProductsSold) AS TotalSold " +
                    "FROM Table1 " +
                    "WHERE Table1.DateTime BETWEEN @StartDate AND @StopDate " +
                    "GROUP BY Table1.ProductType", 
                    conn);
            cmd.Parameters.AddWithValue("@StartDate", new DateTime(2013, 5, 16));
            cmd.Parameters.AddWithValue("@StopDate", new DateTime(2013, 5, 17));
            OleDbDataReader rdr = cmd.ExecuteReader();
            int rowCount = 0;
            while (rdr.Read())
            {
                rowCount++;
                Console.WriteLine("Row " + rowCount.ToString() + ":");
                for (int i = 0; i < rdr.FieldCount; i++)
                {
                    string colName = rdr.GetName(i);
                    Console.WriteLine("  " + colName + ": " + rdr[colName].ToString());
                }
            }
            rdr.Close();
            conn.Close();

            Console.WriteLine("Done.");
            Console.ReadKey();
        }
    }
}

パラメーターに個別の名前を含めたことに注意してください (より正確に一致させるため)。ただし、Access OLEDB の場合、パラメーター名は無視され、コマンド テキストに表示される順序とまったく同じ順序でパラメーターを定義する必要があることに注意してください。

編集

DateTimePicker 値の Date 部分だけを抽出する場合は、次のようにしてください。

DateTime justTheDate = dateTimePicker1.Value.Date;
MessageBox.Show(justTheDate.ToString());

それを実行すると、MessageBox には常に次のようなものが表示されます2013-05-01 00:00:00(現在の時刻ではありません)。

于 2013-05-18T09:51:23.507 に答える