適切なテーブルに挿入する前にdatetime
フィールドを検証する方法はありますか?
Try/catchブロックで挿入しようとするのは方法ではありません。
ありがとう、
私がそこで過度に衒学者であるかどうかはわかりませんが、DateTime.TryParseは、値が有効なDateTimeオブジェクトであるかどうかを検証します。 OPは、SQLServerの日時に挿入する前に値を確認することについて質問しました。 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データ型を日時データ型に変換した結果、値が範囲外になりました」というメッセージが表示されて失敗します。
コメント提供者は、なぜ私が997をミリ秒単位で使用したのかと尋ねました。これは SQL Server 2008およびミリ秒 で説明されていますが、クリックを節約するために、997は日時データ型に格納できる最大値です。 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;
}
SqldateTime値をハードコーディングせずにこれを試してください。
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;
}
<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;
}
}
これはbillinkcの答えに対する別の見方です。ただし、このメソッドでは、最小/最大の.Valueプロパティを使用して、解析と試行/キャッチを回避します。誰かが、SQLServerに有効な日付を挿入していることを確認したいと述べました。そこで、SQLServerに有効な日付を返すというアプローチを取りました。これは、dateToVerifyが有効なSQLServerの日付であるかどうかを確認するブールメソッドに簡単に変更できます。
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;
}
}
if(myDateTime.IsValidSqlDateTime()) { ... }
などのチェックを可能にする拡張メソッドを持つクラスを次に示します。
public static class DateTimeExtensionMethods
{
public static bool IsValidSqlDateTime(this DateTime dateTime)
{
return !(dateTime < (DateTime) SqlDateTime.MinValue ||
dateTime > (DateTime) SqlDateTime.MaxValue);
}
}
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
日時の値がどこから来ているかについての詳細情報を提供していただけませんか。ウェブフォーム?次のようにCompareValidatorを追加するだけです。
<asp:CompareValidator ID="CompareValidator1" runat="server"
ControlToValidate="txtDate"
Type="Date"
ErrorMessage="CompareValidator">
</asp:CompareValidator>
パラメータとともにSqlCommandを使用して、SQLインジェクションを防ぐことができます
例えば:
SqlCommand cmn = new SqlCommand("UPDATE table SET date = @Date ");
// cmn set Here....
cmn.Parameters.Add("@Date",SqlDbType.DateTime).Value = dateTimeObj;
その他、 [〜#〜] msdn [〜#〜] で表示できます