2012-01-30 68 views
1

「你在你的SQL語法錯誤」 我繼續得到同樣含糊的錯誤與此代碼:錯誤使用C#MySQL的INSERT語句 -

command.CommandText = "INSERT INTO database (upc, title, description, quantity) VALUES ('"+ upc.Text +"',"+"'"+titlename+"',"+ "'"+descname+"',"+ "'1'"+"), MyConString"; 

的錯誤是:

{」您的SQL語法錯誤;請查看 對應於您的MySQL服務器版本的手冊,以獲得在數據庫(upc,title,description,quantity)附近使用 的正確語法值 ('016000165779','Betty Crock'在第1行「}

我是C#的新手,並試圖構建一個使用UPC代碼插入到mySQL數據庫的程序。

+7

一個是地方錯了,最重要的事情是[SQL注入](http://en.wikipedia.org/wiki/SQL_injection)孔 – jadarnel27 2012-01-30 17:26:21

+2

http://xkcd.com/327/ – 2012-01-30 17:27:00

+0

待辦事項你的任何變量都包含'''? – 2012-01-30 17:27:53

回答

4

試試這個:

command.CommandText = "INSERT INTO tableName " + 
          "(upc, title, description, quantity) " + 
         "VALUES " + 
          "(@upc, @title, @description, @quantity)"; 

command.Parameters.AddWithValue("@upc", upc.Text); 
command.Parameters.AddWithValue("@title", titlename); 
command.Parameters.AddWithValue("@description", descname); 
command.Parameters.AddWithValue("@quantity", "1"); 

注:

  • 這將修復您的SQL injectionhole通過使用parametrize d查詢。特別是在我看到upc.Text時,這讓我認爲您將用戶輸入連接到您的SQL字符串中(非常危險)。
  • 我在查詢中將單詞「database」更改爲「tableName」。這就是表名的名稱,而不是數據庫名稱。
  • 我neatened你的字符串聲明一點,所以它更容易閱讀=)
+0

表IS名稱的數據庫...我應該改變它到別的東西我只是把名字放在那裏 – 2012-01-30 17:43:16

+0

@DevinPrejean你一定要給這個表命名一些更具描述性的東西,比如' upcCodes「或」productUPCs「。描述表中內容的東西。正如DorSherner在[他的回答](http://stackoverflow.com/a/9068030/861565)中提到的那樣,如果您需要保留「數據庫」,則可以在表名稱周圍添加反引號。 – jadarnel27 2012-01-30 17:44:24

+0

哦,我改變了它,它會拋出一個新的錯誤,但我認爲這會更容易。它說色譜柱UPC超出範圍。這可能是因爲這個數字太大了。我將列上的最大值設置爲INT(45),但這不起作用。 – 2012-01-30 17:47:36

3

database可能是一個保留字。嘗試使用反引號轉義它:

INSERT INTO `database` ... 

我也不知道爲什麼, MyConString部分是查詢本身裏面,但我不是C#的專家。

+0

+1。你是如此之快:) – a1ex07 2012-01-30 17:28:17

+1

@ a1ex07我得到了太多的方式:( – 2012-01-30 17:29:05

+0

以及最終確實改變了錯誤...但它拿起產品的「描述」的一部分,並在某個點拋出一個錯誤。新的錯誤代碼:{「您的SQL語法錯誤;查看與您的MySQL服務器版本相對應的手冊,以便在'sa snap'附近使用正確的語法。」美國農業部檢查並通過了該檢查。','1 '),MyConStri'在第1行「} – 2012-01-30 17:36:10

3

爲什麼在查詢結尾處有「,MyConString」?這似乎很奇怪。

另外,database可能不是您的名字

+0

database是表的名稱,myconstring在最後,因爲它標識了連接。它的所有代碼我沒有顯示。 – 2012-01-30 17:42:22

0

我認爲昏迷之前你缺少在最後一個雙引號:

「+」)",MyConString「;

+0

不。黑色沒有被拾起。紅色的文本是程序讀取 – 2012-01-30 17:30:36

1

數據庫是MySQL中的關鍵字,儘量給予描述性的名稱,因此,這將有助於瞭解。並使用參數化查詢來避免sql注入SqlInjections

這是mysql關鍵字列表:MySql Reserved keywords,今後儘量避免使用關鍵字。

command.CommandText = "INSERT INTO [database] (upc, title, description, quantity) VALUES (@upc,@title ...) 
command.Parameters.AddWithValue("@upc","upcValue"); 
command.Parameters.AddWithValue("@title","titleValue");