首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有Access C# OleDbParameter查询的DateTime

带有Access C# OleDbParameter查询的DateTime
EN

Stack Overflow用户
提问于 2013-05-18 07:11:28
回答 1查看 11.7K关注 0票数 2

我有以下查询,从内部访问或从C#作为OleDbCommand工作:

代码语言:javascript
复制
SELECT Table1.ProductType, Sum(Table1.ProductsSold)
FROM Table1
WHERE (Table1.DateTime Between #5/16/2013# And #5/17/2013#)
GROUP BY Table1.ProductType;

表1.Date是日期/时间数据类型。

现在,我想将日期传递为OleDbParameters。

代码语言:javascript
复制
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()和日期类型)。

EN

回答 1

Stack Overflow用户

发布于 2013-05-18 09:51:23

您需要去掉查询文本中的散列标记(#)分隔符。字符串的分隔符(如日期为# )和字符串的分隔符( ' )是文字SQL查询所必需的,但在参数化SQL查询中必须省略。作为参考,以下是我的工作测试代码:

代码语言:javascript
复制
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();
        }
    }
}

注意,我为参数包括了不同的名称(为了更好地匹配您所做的),但是请记住,对于访问OLEDB,参数名是忽略的,参数的定义必须与它们在命令文本中出现的顺序完全相同。

编辑

如果只想提取DateTimePicker值的日期部分,请尝试如下所示:

代码语言:javascript
复制
DateTime justTheDate = dateTimePicker1.Value.Date;
MessageBox.Show(justTheDate.ToString());

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16621695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档