Ответ 1
Не уверен, что я чересчур педантичен, но DateTime.TryParse будет проверять, является ли значение допустимым объектом DateTime. OP спросил о проверке значения перед вставкой в SQL Server datetime. Диапазон допустимых значений для SQL Server datetime - "1 января 1753 года, 31 декабря, 9999". Это не относится к DateTime.NET. Этот script присваивает значение "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 к фактическому типу данных 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;
}