在将DateTime插入SQL Server数据库之前验证它
本文关键字:验证 数据库 Server DateTime 插入 SQL 在将 | 更新日期: 2023-09-27 18:05:25
在将datetime
字段插入适当的表之前,是否有任何方法可以验证它?
尝试使用try/catch块插入不是一种方法。
谢谢,
不确定我是否过于迂腐,但DateTime.TryParse将验证一个值是否是有效的DateTime对象。OP询问在插入SQL Server日期时间之前是否验证值。SQL Server日期时间的可接受值范围为"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和毫秒中有介绍,但只需点击一下,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日期时间数据类型
/// <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;
}
在不硬编码sql-dateTime值的情况下尝试此操作:
public bool IsValidSqlDateTime(DateTime? dateTime)
{
if (dateTime == null) return true;
DateTime minValue = (DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;
DateTime maxValue = (DateTime)System.Data.SqlTypes.SqlDateTime.MaxValue;
if (minValue > dateTime.Value || maxValue < dateTime.Value)
return false;
return true;
}
这是对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;
}
}
<asp:RangeValidator runat="server" ID="rgvalDate" ControlToValidate="txtDate" Text="[Invalid]" Type="Date" MinimumValue="1/1/1753" MaximumValue="12/31/9999" />
或
自定义验证器:
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;
}
}
这里有一个带有扩展方法的类,可以进行if(myDateTime.IsValidSqlDateTime()) { ... }
:等检查
public static class DateTimeExtensionMethods
{
public static bool IsValidSqlDateTime(this DateTime dateTime)
{
return !(dateTime < (DateTime) SqlDateTime.MinValue ||
dateTime > (DateTime) SqlDateTime.MaxValue);
}
}
您能提供更多关于日期时间值来源的信息吗;网络表单?你可以简单地添加一个CompareValidator如下
<asp:CompareValidator ID="CompareValidator1" runat="server"
ControlToValidate="txtDate"
Type="Date"
ErrorMessage="CompareValidator">
</asp:CompareValidator>
如果您提到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
}
DateTime.TryParse
是最好的验证器
DateTime temp;
if(DateTime.TryParse(txtDate.Text, out temp))
//Works
else
// Doesnt work