2012-01-30 99 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");