2011-07-07 8 views
0

問題があります。私は」...範囲外の結果となるVARCHARデータ型のdatetimeへの変換

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 + "'"; 

を私のミスを識別することができます。しかしI'amは、エラーを取得:

Conversion of a Varchar Datatype to a datetime resultant in an out of range

答えて

3

まあ、私は非常に異なるタスクに近づくでしょう:取得した後

  • を日、月、および年の整数として私は間違いなくと一緒に貼り付けて解析することはできません。ただ、使用:データベースを更新するときに

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

あなたはまだエラーを取得している場合は、そのすべてをやっては、あなたが挿入しようとしている実際のどのようなデータを確認する必要があります。おそらくItemsのデータはで、はSQL Serverの範囲外です。

1

これは、月の列の代わりに日付の値の列を保存するなど、指定する形式の問題でなければなりません。

2

正確にはと表示されていません。入力が表示されていないためです。しかし、次は明らかに危険である:

DateTime RegExp = Convert.ToDateTime(DtString); 

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

我々はあなたが(あなたが本当に必要があります)パラメータを使用してしなければならないという事実をごまかす場合でも、あなたはSQLサーバが期待するように、この日付をフォーマットする必要があります - これはローカル形式とは大きく異なる可能性があります。

ただし、それをフォーマットする気にしないでください!このためにパラメータを使用すると、それは消え去ります。これはハードである必要はありません - たとえばwith dapperのために:

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

connection.Execute("UPDATE MyTable SET [email protected] where [email protected]", 
    new { exp = RegExp, id = AlmIDNo }); 

およびdone。注射と(より多くの可能性が高い)文字列としてのデータの書式設定の問題の両方から完全に安全です。

関連する問題