在将其插入SQL Server数据库之前验证DateTime

时间:2011-08-14 03:21:48

标签: c# sql-server-2008 validation datetime varchar

在将datetime字段插入适当的表之前,有没有办法验证它?

尝试使用try / catch块插入不是一种方法。

谢谢,

9 个答案:

答案 0 :(得分:29)

不确定我是否在那里过于迂腐,但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数据类型转换为日期时间数据类型会导致超出范围的值。”

一位评论者问为什么我使用997毫秒,这包含在SQL Server 2008 and milliseconds下,但是省去了一次点击,997是你可以存储在datetime数据类型中的最大值。 998将以000毫秒

向上舍入到1秒
    /// <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 datetime数据类型


    /// <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;
    }

答案 1 :(得分:17)

尝试此操作时不需要硬编码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;
    }

答案 2 :(得分: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;
    }
}

答案 3 :(得分: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;
        }
    }

答案 4 :(得分: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
}

答案 5 :(得分:1)

DateTime.TryParse是最好的验证器

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

答案 6 :(得分:1)

您是否可以提供有关日期时间值来源的更多信息;网络表格? 你可以简单地添加一个CompareValidator,如下所示

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

答案 7 :(得分:1)

这是一个带有扩展方法的类,允许进行if(myDateTime.IsValidSqlDateTime()) { ... }

等检查
public static class DateTimeExtensionMethods
{
    public static bool IsValidSqlDateTime(this DateTime dateTime)
    {
        return !(dateTime < (DateTime) SqlDateTime.MinValue ||
                 dateTime > (DateTime) SqlDateTime.MaxValue);
    }
}

答案 8 :(得分:0)

您可以将SqlCommand与Parameter一起使用以防止SQL注入

例如:

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

和其他人一样,您可以在MSDN

中查看