2011-08-14 92 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; 
     } 
    } 
相关问题