【问题标题】:Search SQL by date ASP.NET按日期搜索 SQL ASP.NET
【发布时间】:2014-01-27 18:32:07
【问题描述】:

我的代码:

DateTime date = DateTime.Now;
OleDbConnection con = new OleDbConnection();
con.ConnectionString = "provider=microsoft.jet.oledb.4.0; data source=D:/c# database/Database3.mdb";
con.Open();
DataSet ds = new DataSet();
OleDbDataAdapter da = new OleDbDataAdapter();
da = new OleDbDataAdapter("Select * From TEST WHERE MatchDate >= '"+ date.ToString() +"'", con);
da.Fill(ds);
Repeater1.DataSource = ds;
Repeater1.DataBind();
con.Close();

你能告诉我,为什么这段代码不起作用?程序抛出异常。我正在使用 MS Access 数据库。数据库中的日期格式如下所示:“2014-06-27 18:45:00”

【问题讨论】:

  • 而例外是?
  • 是的,很抱歉。我正在使用波兰语版本的“Visual web developer”,用英文表示,异常应该类似于“标准表达式中的数据类型不匹配”。我希望如此,你会知道那是什么意思..
  • 顺便说一句(因为使用参数化查询是要走的路),您不要在 Access 中用引号分隔日期,它是 #。这解释了不匹配(日期与字符串)这只有在您需要在字符串中硬编码日期时才会起作用,例如where somedate < #2008-07-31#

标签: c# asp.net sql


【解决方案1】:

您应该参数化您的查询。 DateTime 没有与之关联的任何格式,格式仅用于显示目的。

OleDbCommand cmd = new OleDbCommand("Select * From TEST WHERE MatchDate >= @matchDate", conn);
cmd.Parameters.AddWithValue("@matchDate", DateTime.Today); // Just date part comparision
                                                           // Or use DateTime.Now depending on your requirement)

OleDbDataAdapter da = new OleDbDataAdapter(cmd);
da.Fill(ds);

这也将把你从SQL Injection 中拯救出来,它会处理DateTime 的值。

除了DateTime.Now,您还想比较大于特定日期的记录,而不是日期和时间,请使用DateTime.TodayDateTime.Now.Date。这会将时间部分设置为00:00,以便您可以将记录与特定日期进行比较。

您还应该使用using 语句将您的命令/连接对象括起来,因为它们实现了IDisposable 接口,并且即使在异常情况下也将确保连接处理。

【讨论】:

  • 非常感谢您的回答,我会尝试的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多