0

問題があります。間違いを特定できます...

int dt = Convert.ToInt32(Items.Rows[T1]["F14"].ToString().Trim());
int mn = Convert.ToInt32(Items.Rows[T1]["F15"].ToString().Trim());
int yr = Convert.ToInt32(Items.Rows[T1]["F16"].ToString().Trim());
string DtString = mn.ToString().Trim() + "/" + dt.ToString().Trim() + "/" + yr.ToString().Trim();
DateTime RegExp = Convert.ToDateTime(DtString);

exp_date is datetime field in sqlserver.

string MyDtQry = "UPDATE MyTable SET exp_date='" + RegExp + "' where MyTable.id_no='" + AlmIDNo + "'";

しかし、私はエラーを受け取っています:

Varcharデータ型を日時に変換すると範囲外になります

4

3 に答える 3

3

まあ、私は非常に異なる方法でタスクにアプローチします:

  • 日、月、年を整数として取得した後は、それらを元に戻して解析することは絶対にありません。使用するだけです:

    // Note the meaningful variable names here, btw...
    DateTime date = new DateTime(year, month, day);
    
  • データベースを更新するとき、SQLステートメントに直接値を入れませんでした。代わりに、パラメーター化されたSQLステートメントを使用し、パラメーターをに設定してくださいdate。そうすれば、データベースが提供したものとは異なる日付形式を期待していることを心配する必要はありません。一般に、値をSQLに直接埋め込むのではなく、常にパラメーター化されたSQLを使用する必要があります。このような状況を支援するだけでなく、SQLインジェクション攻撃を回避します。

それでもエラーが発生する場合は、それをすべて実行した後、挿入しようとしている実際のデータを確認する必要があります。たぶん、のデータはItems実際にSQLServerの範囲外です。

于 2011-07-07T12:15:54.050 に答える
2

入力を表示しないため、正確に確認するのは困難です。ただし、次のことは明らかに危険です。

DateTime RegExp = Convert.ToDateTime(DtString);

string MyDtQry = "UPDATE MyTable SET exp_date='" + RegExp + "' where MyTable.id_no='" + AlmIDNo + "'";

パラメータを使用する必要があるという事実を理解したとしても(実際にはそうする必要があります)、SQLサーバーが期待する方法でこの日付をフォーマットする必要があります。これはローカルフォーマットとは大きく異なる可能性があります。

でも; わざわざフォーマットしないでください!このためのパラメータを使用すると、消えます。これは難しい必要はありません-たとえば、dapperを使用します:

DateTime RegExp = new DateTime(yr, mn, dt);

connection.Execute("UPDATE MyTable SET exp_date=@exp where MyTable.id_no=@id",
    new { exp = RegExp, id = AlmIDNo });

そして完了。インジェクションと(この場合はより可能性が高い)データを文字列としてフォーマットする問題の両方から完全に安全です。

于 2011-07-07T12:18:35.220 に答える
1

これは、月の列の代わりに日付の値の列を保存している可能性があるなど、指定している形式の問題である必要があります。

于 2011-07-07T12:16:52.267 に答える