2014-01-27 150 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