回答
不知道我是否过于迂腐,但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;
}
是的,你说得对。我正在寻找一种解决方案,以确保我作为DateTime的字符串现在将被插入表中的Datetime字段中,而不会出现任何错误。 – MichaelVerossa
编辑添加一个简单的方法,将检查值在范围内。要尝试第二种方法,可能不太容易出错 – billinkc
我会试试你的方法!谢谢,billinkc! – MichaelVerossa
如果你提的关于您的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
不在这种情况下。每个SQLDatetime都是一个有效的.NET日期时间,但不是相反。 – bjoern
你能否提供一个BT在何处日期时间价值是从哪里来的更多信息;一个网页表单? 你可以简单地添加一个CompareValidator如下
<asp:CompareValidator ID="CompareValidator1" runat="server"
ControlToValidate="txtDate"
Type="Date"
ErrorMessage="CompareValidator">
</asp:CompareValidator>
您可以使用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查看
这是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;
}
}
试试这个没有硬编码的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;
}
您也可以使用在SqlDateTime结构中定义的显式转换运算符;而不是解析字符串表示:'var minValue =(DateTime)System.Data.SqlTypes.SqlDateTime.MinValue;' – Styxxy
<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;
}
}
- 1. SQL Server触发器在插入表之前验证数据
- 2. 在插入到SQL Server之前验证CSV数据
- 3. 在插入数据库之前验证数据
- 4. 在插入Firebase之前验证数据
- 5. 插入数据到SQL Server数据库
- 6. 将数据插入SQL Server数据库使用ADO.Net数据集
- 7. 在批量插入mongoose/mongodb之前用数据库验证所有数据
- 8. 验证/调用插入之前验证数据()
- 9. 在SQL Server中的数字数据类型之前插入零
- 10. ASP.NET SQL Server数据库身份验证
- 11. 将SQL数据插入VB数据库
- 12. SQL Server数据/输入验证
- 13. 无法将数据插入到SQL Server数据库中
- 14. 将数据从ASP.NET插入到本地SQL Server数据库中
- 15. Android:使用webservices将数据插入到sql server数据库
- 16. ASP.NET,VB.NET无法将数据插入到SQL Server数据库中
- 17. 我无法将数据插入到SQL Server数据库中
- 18. 我想用C#将数据插入到SQL Server数据库中。
- 19. 如何将数据插入到SQL Server Express数据库中
- 20. 在插入数据库之前或之后格式化数据?
- 21. 在插入SQL Server数据库之前使用0填充数字
- 22. 验证后将数据插入到数据库
- 23. C#从数据表插入数据到SQL Server数据库
- 24. 在插入/更新之前验证数据还是不是?
- 25. 在插入SQLite表之前验证重复数据
- 26. 插入SQL Server CE数据库
- 27. 插入并从SQL Server数据库
- 28. 更新/插入SQL Server数据库表
- 29. 插入空值到SQL Server数据库
- 30. 插入到sql server数据库错误
你是如何将这些数据?此外,你在谈论什么类型的验证?在一定的范围内或者它的有效格式? – iamkrillin