2012-01-06 107 views
0

我有這些代碼塊:爲什麼此SqlCommand參數會產生SQLDateTime溢出錯誤?

var cmd = new SqlCommand(); 
cmd.CommandText = @"SELECT * FROM " + TableName + " Where "; 
SqlConnection a = new SqlConnection("the setting"); 
cmd.Connection = a; 

這些生產線下方,做工精細:

cmd.CommandText += strFromTextBox + " LIKE '%" + strUserInput + "%'"; 
//strFromTextBox & strUserInput is string datatype 
//it looks like 'apple', 'ladder', just normal string 
SqlDataAdapter adapter = new SqlDataAdapter(); 
adapter.SelectCommand = cmd; 

但這些的產生錯誤:

DateTime dtFrom = DateTime.Parse(dt1).Date; 
DateTime dtTo = DateTime.Parse(dt2).Date; 
//dt1 & dt2 is originally a string 
//they look something like this: 2/1/2012 12:00:00 AM 
cmd.Parameters.AddWithValue("@dt1", @dtFrom); 
cmd.Parameters.AddWithValue("@dt2", @dtTo); 
cmd.CommandText+= parameter[i].ToString() + " BETWEEN @dt1 AND @dt2"; 
//parameter[i] refers to the column name 

它產生的誤差:

System.Data.SqlTypes.SqlTypeException: SqlDateTime overflow.

兩個塊是通過處理:

DataTable Table = new DataTable(); 
adapter.FillSchema(Table, SchemaType.Source); 
adapter.Fill(Table); 

最後的查詢輸出(字符中發現)

SELECT * FROM linkDb Where CreateDt BETWEEN @dt1 AND @dt2 

能有人建議什麼是錯用這些代碼行?

+0

顯然不是,請檢查我提供的代碼塊..我把一條評論線顯示輸入樣本.. – rofans91 2012-01-06 06:23:38

+0

我已經這樣做了。 TQ。事實上,我有其他朋友也幫我檢查代碼..它不是從輸入.. – rofans91 2012-01-06 06:29:18

+0

你能告訴我「參數[我]」這是什麼? – 2012-01-06 06:33:30

回答

2

SQL Server DATETIME數據類型只能表示從00:00:00 1/1/1753到23/12/9999 23:59:59的日期。我的猜測是,其中一個日期字符串或者被給予超出此範圍的日期,或者它的分析方式與您想象的不同。

此外,構建這樣的SQL字符串非常容易發生SQL注入。你應該考慮儘快放棄這種做法。像現在。

+0

我知道。但請務必檢查我的問題,我提供了輸入示例...它位於正常時間線之間.. //他們看起來像這樣:2012年2月1日上午12:00:00該錯誤看起來形成對比我的輸入,這就是爲什麼... – rofans91 2012-01-06 06:25:36

+1

由於marc_s已經說過:_check your assumptions_。我學到的一件事是,當現實與你的期望相沖突時,現實通常是正確的。 – 2012-01-06 06:28:26

+1

已經這樣做.. tq ..我不會問這裏,如果事情是那麼簡單肯定.. – rofans91 2012-01-06 06:30:58

1

取而代之的是:

cmd.Parameters.AddWithValue("@dt1", @dtFrom); 
cmd.Parameters.AddWithValue("@dt2", @dtTo); 

試試這個:

SqlParameterCollection p = cmd.Parameters; 
p.Add("@dt1", SqlDbType.DateTime).Value = dtFrom; 
p.Add("@dt2", SqlDbType.DateTime).Value = dtTo; 

我還要設置參數之前設置的CommandText值。

如果失敗了,則應使用調試器來驗證dtFromdtTo中包含的值。

順便說一句,我知道這不是你的問題的一部分,但你的發佈代碼容易受到SQL注入。您還應該用using聲明包裝您的SqlConnectionSqlCommand對象。

+0

針對SQL注入警報的+1 – Simon 2012-01-07 09:58:27

相關問題