【问题标题】:C# OleDbParameter with Access DateTime query带有访问日期时间查询的 C# OleDbParameter
【发布时间】:2013-05-13 08:50:52
【问题描述】:

我有以下查询,可以在 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 类型。)

【问题讨论】:

    标签: c# ms-access datetime oledbparameter


    【解决方案1】:

    您需要去掉查询文本中的井号 (#) 分隔符。 literal SQL 查询需要分隔符,如日期的 # 和字符串的 ',但在 parameterized 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 值的日期部分,请尝试以下操作:

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

    当我运行时,MessageBox 总是显示类似2013-05-01 00:00:00 的内容(而不是当前时间)。

    【讨论】:

    • 我的问题可能没有突出问题。我的原始参数类似于 cmd.Parameters.AddWithValue("@StartDate", dtpDailyStartDate.Value);但是,DateTimePicker 的 Value 属性返回了正确的日期,但是 CURRENT 时间。
    • 这让我尝试了这个: cmd.Parameters.AddWithValue("@StartDate", Convert.ToDateTime(dateTimePicker1.Value.ToShortDateString()));这种方法没有返回任何记录。
    • 如果我将 DateTimePicker 的 Format 属性设置为 Short,原始参数将起作用。我将 DateTimePicker 的 Format 设置为 Custom,CustomeFormat 属性设置为 dddd、MMM dd、yyyy。 “属性”窗口说明这控制了值的显示方式。它似乎也影响 Value 属性的返回方式。我真的很想显示工作日,但以午夜为时间获取值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    相关资源
    最近更新 更多