2012-03-28 57 views
0

我收到錯誤:「輸入字符串格式不正確。」在SQL語句中調用int.Parse

「輸入字符串格式不正確。」

注:如果我改變線路182引號的實際數量(即,「3」或「875」),並註釋掉線171 此代碼工作完全正常。但是,第174行中的「{7}」是應該自動遞增的字段,但不會。所以我試圖在第171行中得到一個「數字」,它將使用行數+ 1來執行自動增量。

這個嗎? :-)

171 string rowCount = string.Format("SELECT COUNT(*) FROM Log WHERE Location is NULL"); 

173 string sql = string.Format("insert into Log values " + 
174   "('{0}','{1}',{2},{3},'{4}',#{5}#,'{6}','{7}')", 
175   comboBox1.Text, 
176   comboBox2.Text, 
177   float.Parse(textBox1.Text), 
178   float.Parse(comboBox3.Text), 
179   textBox3.Text, 
180   textBox2.Text, 
181   addRemove, 
182   int.Parse(rowCount) 
183  ); 
+0

再次,請提前假設,173到181行沒有任何錯誤,因爲代碼的一部分將數據插入到我的表中。我不禁想到必須解析第171行的結果數據。但我似乎無法得到它。 : -/ – Geo 2012-03-28 16:37:49

+1

你爲什麼要對一個字符串做一個String.Format(第171行),而沒有實際的格式化它? – 2012-03-28 16:38:02

+3

你對SQL查詢調用「int.Parse」?基本上:int.Parse(「SELECT COUNT(*)FROM Log WHERE Location is NULL」);這是造成這個問題的原因。也許你打算解析查詢的結果,而不是查詢本身。 – 2012-03-28 16:39:05

回答

2

int.Parse(rowCount)將字符串轉換爲數字,例如, 「100500」到100500.但是你的字符串包含"SELECT COUNT(*) FROM Log WHERE Location is NULL",這不是一個數字。

15

立即停止使用該代碼立即並改用參數化SQL。否則,您很容易受到SQL injection attacks以及潛在的數據類型轉換問題。

接下來,想想你在rowCount中實際得到了什麼。它不是一個表示整數的字符串 - 它是一些SQL。試圖解析與int.Parse不起作用,是嗎? 您需要首先執行查詢 - 或者在插入語句中使用子查詢。說實話,如果的意思是是一個自動遞增的字段,我只會專注於讓它工作,而不是用易受競爭條件影響的代碼來欺騙它。

+0

+50(如果我可以)。 – GarethD 2012-03-28 16:40:19

+2

@GarethD你不覺得他現在有足夠的積分嗎?你不想讓他再拿那些醜陋的畫作,對吧? – 2012-03-28 16:46:12

+0

@JonSkeet JK。我也贊同你的回答。 – 2012-03-28 16:47:08

2

string.Format不會執行您的SQL命令。所以int.Parse確切地看到"SELECT COUNT(*) FROM Log WHERE Location is NULL",這當然不是數字的十進制表示。

0

幾乎所有的數據庫都支持自動遞增列。你不應該試圖使用int列並自己增加它。有各種各樣的競爭條件,性能問題等使增量列真正健壯,數據庫設計人員已經爲您處理所有這些問題。

0

您可能正在尋找解決您的問題的解決方案。已發佈的答案將幫助你做到這一點。
您應該檢查其他方法。 使用命令對象並使用參數(由@JonSkeet建議)
對自動增量列的工作原理做一些研究。這因數據庫供應商而異。看來您可能正在使用Microsoft Access。對於MS Sql Server,自動增量列是一個標識列,在Oracle中,使用序列的機制又有所不同。基本上,你不提供自動增量列的值,你讓數據庫引擎爲你處理。 (以前的海報也提到過)
我還建議您將文本框的值分配給變量,並在放入插入語句或參數之前對數據進行一些驗證。嘗試防守編程。