2014-01-27 111 views
-6

我的代码:搜索按日期ASP.NET SQL

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数据库。 databese中的日期格式如下所示:“2014-06-27 18:45:00”

+7

而例外是? – Pleun

+0

对,对不起。我使用波兰语版本的“Visual Web开发者”,英文中的例外应该是“标准表达式中的数据类型不匹配”。我希望如此,你会知道这意味着什么。 – Shagohad

+0

另外(因为使用参数化查询是要走的路),所以你不用在Access中用引号分隔日期,那它就是'#'。这解释了mistmatch(日期与字符串)这只有在你需要在你的字符串中硬编码一个日期时才会起作用,例如'where somedate <#2008-07-31#' –

回答

3

您应该参数化您的查询。 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,以便您可以将记录与特定日期进行比较。

您还应该将您的Command/Connection对象与using声明放在一起,因为它们实现了IDisposable接口,并且即使在发生异常情况下也会确保连接处置。

+1

非常感谢您的回答,我会尽力而为。 – Shagohad

+1

非常感谢你,它的工作原理! – Shagohad