2012-11-21 33 views
-3

爲什麼我得到這個錯誤,我該如何解決它?當我處理(COUNT)Int32時,出現錯誤:轉換日期和/或時間從字符串轉換失敗

ADO.NET代碼:

myConnection.Open(); 

string cmdStr = "SELECT COUNT(*) FROM Sale WHERE Date = '" + DateTime.Today + "' AND User = '" +  UserBox.Text + "'"; 

SqlCommand Pexist = new SqlCommand(cmdStr, myConnection3); 

int P = Convert.ToInt32(Pexist.ExecuteScalar().ToString()); 

myConnection.Close(); 

錯誤:

Conversion failed when converting date and/or time from character string.

回答

4

你得到這個錯誤是因爲你不使用參數。

string cmdStr = "SELECT COUNT(*) FROM Sale WHERE Date = @dt " + 
       "AND User = @usr " +  
       "AND Item = @itm " + 
       "AND Name = @name"; 

SqlCommand Pexist = new SqlCommand(cmdStr, myConnection3); 
Pexist.Parameter.AddWithValue("@dt", DateTime.Today); 
Pexist.Parameter.AddWithValue("@usr", UserBox.Text); 
Pexist.Parameter.AddWithValue("@itm", ID505.Text); 
Pexist.Parameter.AddWithValue("@name", DropDownList1.SelectedItem.ToString()); 
object result = Pexist.ExecuteScalar(); 
int P = (result == null ? 0 : Convert.ToInt32(result)); 
myConnection.Close(); 

當您使用參數時,您讓數據庫引擎處理您的輸入字符串。數據庫引擎知道如何處理日期,字符串和數字。你沒有解析問題,你可以避免Sql Injection Attacks.

例如,如果文本框ID505包含單引號,那麼在查詢字符串中會發生什麼?

此外,的ExecuteScalar返回一個對象,它是

The first column of the first row in the result set, or a null reference (Nothing in Visual Basic) if the result set is empty

所以最好嘗試的結果轉換成整數之前檢查空。

編輯經過一段時間回顧這個問題,我應該補充一點,在這種特殊情況下,ExecuteScalar的返回不能爲空。這是因爲查詢使用聚合函數COUNT(*),如果沒有找到記錄,它將始終返回一個有效數字。

0

不要使用參數。它是更安全,更將讓你身邊這樣的轉換問題...

string cmdStr = " SELECT COUNT(*) FROM Sale WHERE Date = @d AND User = @u AND Item = @i AND Name = @n"; 
SqlCommand Pexist = new SqlCommand(cmdStr, myConnection3); 
Pexist.Parameters.Add("d", SqlDataType.DateTime).Value = DateTime.Today; 

等等...

+2

SqlServer爲參數名使用不同的前綴。 @ – Steve

+0

感謝您發現它 - 修復。 – Rashack

-2

替換DateTime.Today.ToString的DateTime.Today(「YYYY/MM/DD 「)應該解決你的問題。

+1

這是有史以來最糟糕的事情。 – Steve

相關問題