Не уверен, что я слишком педантичен, но DateTime.TryParse проверит, является ли значение допустимым объектом DateTime. ОП спросил о проверке значения перед вставкой в SQL Server datetime. Диапазон допустимых значений для SQL Server datetime составляет «1 января 1753 года - 31 декабря 9999 года», что не относится к объектам 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);
Однако, если вы попытаетесь сохранить это в поле datetime, произойдет сбой с сообщением «Преобразование типа данных varchar в тип данных datetime привело к значению вне допустимого диапазона.»
Комментатор спросил, почему я использовал 997 для миллисекунд, это покрывается SQL Server 2008 и миллисекундами , но, сохраняя вас, клик, 997 - это самое большое значение, которое вы можете сохранить в типе данных datetime. 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 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;
}