回答
不知道我是否過於迂腐,但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