2013-01-16 105 views
0

我發現CDate函數在下面的代碼奇怪的行爲:CDate有什麼奇怪的行爲?

private void button1_Click(object sender, EventArgs e) 
     { 
      OleDbConnection connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=" + Application.StartupPath + @"\db.mdb" + ";Persist Security Info=False"); 
      { 
       OleDbDataAdapter adapterA = new OleDbDataAdapter("SELECT CDate(#01/05/2013#) AS TheDate", connection); 
       DataTable dataTableA = new DataTable(); 
       adapterA.Fill(dataTableA); 
       DateTime dateTimeA = (DateTime)dataTableA.Rows[0]["TheDate"]; // get 1 
       MessageBox.Show(dateTimeA.Month.ToString()); 
      } //these to ensure that I did not use the variables in the next block /^-^\ . 


      { 
       OleDbDataAdapter adapterB = new OleDbDataAdapter("SELECT CDate(#13/05/2013#) AS TheDate", connection); 
       DataTable dataTableB = new DataTable(); 
       adapterB.Fill(dataTableB); 
       DateTime dateTimeB = (DateTime)dataTableB.Rows[0]["TheDate"]; // get 5 
       MessageBox.Show(dateTimeB.Month.ToString()); 
      } 


     } 

我明白,如果該值大於12越大,CDate功能將它視爲日期的「日」部分,另一部分將被視爲日期的'月'部分。

源代碼可以從(Link)下載。

這是什麼規則?

爲什麼微軟沒有在MSDN中解釋這一點?

+2

也許這只是VB.NET和那個SQL之間的一個奇怪的巧合,但不要'#'分隔日期文字?所以'CDate'與它無關;日期文字會自動更改格式。 「無論什麼都有效」:P – Ryan

+0

如果您需要CDate,請同意@minitech,使用字符串。此外,年,月,日可以節省語言環境問題。 – Fionnuala

回答

0

是的你是對的。 CDate會嘗試將大於12的月份值視爲日值。

你可以試試這個。

private bool IsDate(String inputDate) 
{ 
    DateTime dt; 


    Return DateTime.TryParse(inputDate,out dt); 

}