錯誤信息如下:
“System.Data.SqlClient.SqlException”類型的未經處理的異常在 System.Data.dll 中發生
其他信息: “”附近有語法錯誤。
文字版代碼如下:
1 sqlCmd.CommandText =string.Format( "insert into [dbo].[Table4Test]([ID],[Name],[Password])values({0},'{1}','{2}')", dataOfItem[0],dataOfItem[1],dataOfItem[2]); 2
3 sqlCmd.ExecuteNonQuery();
可以看出,出錯的地方就是那一句SQL語句。
既然是SQL語句的問題為何不貼進SQL里去調試一番呢?
於是和我便從從程序出錯時提取出出錯的那句SQL語句。
Ctrl+c、Ctrl+V,我將它原原本本的復制到了SQL Server Management Studio里。
F5運行。
經過一番修改,確認是括號問題,重新輸入一遍括號后,數據成功入庫。
看起來現在只是括號的半角和全角問題,可惜我錯了。
Ctrl+c、Ctrl+V,我將修改后的符號原原本本的復制到了Microsoft Visual Studio里。
繼續報錯。
隨后我又經行了如下嘗試,均無果。
1、將String.Format()方法更換成String的加號運算符重載。
2、將從Visual Studio 2012更換成2015。
3、將.Net 框架從4.6.1更換為4.5。
4、重啟SQL Server 實例。
5、重啟計算機。
6、把NAME字段的類型設置為nvarchar 。(感謝劉宏璽的建議)
7、在SQL語句下添加;(感謝貧民窟大俠的建議)
8、使用String.Trim()方法。
9、使用Object.Replace()替換括號。
唯一成功過的一次是我把SQL語句手動打一遍,像這樣:
1 sqlCmd.CommandText ="insert into [dbo].[Table4Test]([ID],[Name],[Password])values(0,'吳靜鈺','1')"; 2 3 sqlCmd.ExecuteNonQuery();
問題看似出在了字符串合並上。
根據runliuv的建議,我用File.AppendAllText()方法導出了SQL 語句的文本,並將notepad++軟件設為顯示所有符號。
把NotePad++用ANCI編碼將文件重新打開,看到了異常。
對比前面的那張圖看到,第一個values后面的字符“1”亂碼了。
於是,我把該字符在UTF8編碼格式重新打開並復制到了一個新的TXT文件當中,用十六進制查看器對其與ANCI和UTF8無ROM編碼進行對比。
(UTF8編碼格式)
(UTF8無ROM編碼、ACNI編碼)
解決方法:
用Notepad++軟件將數據源的UTF8編碼格式轉化為UTF8無ROM。
感謝runliuv
(他所提供的方法是正確的,打開顯示所有字符是最有效的方法,但是我在執行上出了問題。)
總結:
“人們總是看到自己所願意看到的東西”
在遇到解決不了BUG的時候,不妨從頭想想,看看自己所忽略掉的細節。因為人們常常會忽略掉一些顯而易見的細節,不斷自我欺騙,讓事情的走向看似向着我們所篤行的方向前進。
修補漏洞如此,為人處事亦是如此。