2011-08-14 114 views

回答

23

不知道我是否過於迂腐,但DateTime.TryParse會驗證值是否有效DateTime對象。 OP詢問在插入到SQL Server datetime之前驗證一個值。 SQL Server datetime的可接受值的範圍是「1753年1月1日至9999年12月31日」。這不適用於DateTime .NET對象。該腳本將「1/1/0001 12:00:00 AM」的值分配給badDateTime併成功解析。

DateTime d = DateTime.MinValue; 
string badDateTime = DateTime.MinValue.ToString(); 
Console.WriteLine(badDateTime); 
DateTime.TryParse(badDateTime, out d); 

然而,如果你試圖存儲到一個日期時間字段,它會失敗,「varchar數據類型爲datetime數據類型的轉換導致超出範圍的值。」

一位評論者問我爲什麼在幾毫秒內使用了997,這在SQL Server 2008 and milliseconds下有所報道,但爲您節省了點擊量,997是您可以存儲在日期時間數據類型中的最大值。 998將被向上舍入到1秒與000毫秒

/// <summary> 
    /// An initial pass at a method to verify whether a value is 
    /// kosher for SQL Server datetime 
    /// </summary> 
    /// <param name="someval">A date string that may parse</param> 
    /// <returns>true if the parameter is valid for SQL Sever datetime</returns> 
    static bool IsValidSqlDatetime(string someval) 
    { 
     bool valid = false; 
     DateTime testDate = DateTime.MinValue; 
     DateTime minDateTime = DateTime.MaxValue; 
     DateTime maxDateTime = DateTime.MinValue; 

     minDateTime = new DateTime(1753, 1, 1); 
     maxDateTime = new DateTime(9999, 12, 31, 23, 59, 59, 997); 

     if (DateTime.TryParse(someval, out testDate)) 
     { 
      if (testDate >= minDateTime && testDate <= maxDateTime) 
      { 
       valid = true; 
      } 
     } 

     return valid; 
    } 

這可能是一個較好的方法,因爲這將嘗試投DateTime對象爲實際SQL日期時間數據類型


/// <summary> 
    /// An better method to verify whether a value is 
    /// kosher for SQL Server datetime. This uses the native library 
    /// for checking range values 
    /// </summary> 
    /// <param name="someval">A date string that may parse</param> 
    /// <returns>true if the parameter is valid for SQL Sever datetime</returns> 
    static bool IsValidSqlDateTimeNative(string someval) 
    { 
     bool valid = false; 
     DateTime testDate = DateTime.MinValue; 
     System.Data.SqlTypes.SqlDateTime sdt; 
     if (DateTime.TryParse(someval, out testDate)) 
     { 
      try 
      { 
       // take advantage of the native conversion 
       sdt = new System.Data.SqlTypes.SqlDateTime(testDate); 
       valid = true; 
      } 
      catch (System.Data.SqlTypes.SqlTypeException ex) 
      { 

       // no need to do anything, this is the expected out of range error 
      } 
     } 

     return valid; 
    } 
+0

是的,你說得對。我正在尋找一種解決方案,以確保我作爲DateTime的字符串現在將被插入表中的Datetime字段中,而不會出現任何錯誤。 – MichaelVerossa

+0

編輯添加一個簡單的方法,將檢查值在範圍內。要嘗試第二種方法,可能不太容易出錯 – billinkc

+0

我會試試你的方法!謝謝,billinkc! – MichaelVerossa

1

如果你提的關於您的DateTime字段的服務器端驗證,使用DateTime.TryParse。一個快速和骯髒的例子是

DateTime dateValue; 
string dateString = "05/01/2009 14:57:32.8"; 
if (DateTime.TryParse(dateString, out dateValue)) 
{ 
    // valid date comes here. 
    // use dateValue for this 
} 
else 
{ 
    // valid date comes here 
} 
1

DateTime.TryParse是最好的驗證

DateTime temp; 
if(DateTime.TryParse(txtDate.Text, out temp)) 
//Works 
else 
// Doesnt work 
+0

不在這種情況下。每個SQLDatetime都是一個有效的.NET日期時間,但不是相反。 – bjoern

1

你能否提供一個BT在何處日期時間價值是從哪裏來的更多信息;一個網頁表單? 你可以簡單地添加一個CompareValidator如下

<asp:CompareValidator ID="CompareValidator1" runat="server" 
      ControlToValidate="txtDate" 
      Type="Date" 
      ErrorMessage="CompareValidator"> 
</asp:CompareValidator> 
+0

+0

http://stackoverflow.com/editing-help – naveen

+1

謝謝納文,證明有點頭痛:) –

1

您可以使用SqlCommand時Parametter防止SQL注入攻擊

對於examplae:

SqlCommand cmn = new SqlCommand("UPDATE table SET date = @Date "); 
// cmn set Here.... 
cmn.Parameters.Add("@Date",SqlDbType.DateTime).Value = dateTimeObj; 

與其他(一個或多個),你可以在MSDN查看

2

這是billinkc回答的另一個問題。但是,在此方法中,min/max的.Value屬性用於避免解析和try/catch。有人提到他們想確保他們將有效日期插入到SQL Server中。所以,我採用了返回對SQL Server有效的日期的方法。這可以很容易地更改爲布爾方法,該方法檢查dateToVerify是否是有效的SQL Server日期。

protected DateTime EnsureValidDatabaseDate(DateTime dateToVerify) 
{ 
    if (dateToVerify < System.Data.SqlTypes.SqlDateTime.MinValue.**Value**) 
    { 
     return System.Data.SqlTypes.SqlDateTime.MinValue.Value; 
    } 
    else if (dateToVerify > System.Data.SqlTypes.SqlDateTime.MaxValue.**Value**) 
    { 
     return System.Data.SqlTypes.SqlDateTime.MaxValue.Value; 
    } 
    else 
    { 
     return dateToVerify; 
    } 
} 
12

試試這個沒有硬編碼的SQL datetime值:

public bool IsValidSqlDateTime(DateTime? dateTime) 
    { 
     if (dateTime == null) return true; 

     DateTime minValue = DateTime.Parse(System.Data.SqlTypes.SqlDateTime.MinValue.ToString()); 
     DateTime maxValue = DateTime.Parse(System.Data.SqlTypes.SqlDateTime.MaxValue.ToString()); 

     if (minValue > dateTime.Value || maxValue < dateTime.Value) 
      return false; 

     return true; 
    } 
+1

您也可以使用在SqlDateTime結構中定義的顯式轉換運算符;而不是解析字符串表示:'var minValue =(DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;' – Styxxy

2
<asp:RangeValidator runat="server" ID="rgvalDate" ControlToValidate="txtDate" Text="[Invalid]" Type="Date" MinimumValue="1/1/1753" MaximumValue="12/31/9999" /> 

OR

自定義的驗證:

protected void cvalDOB_ServerValidate(object sender, ServerValidateEventArgs e) 
    { 
     e.IsValid = IsValidSqlDateTime(e.Value); 
    } 

    public static bool IsValidSqlDateTime(object Date) 
    { 
     try 
     { 
      System.Data.SqlTypes.SqlDateTime.Parse(Date.ToString()); 
      return true; 
     } 
     catch 
     { 
      return false; 
     } 
    } 
相關問題