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

但我'得到的錯誤:

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 }); 

和完成的;完全安全的注入和(在這種情況下更可能)格式化數據的問題作爲字符串。

相關問題