2011-11-03 80 views
0

我有一个函数,应该采取x2字符串输入并将它们插入到mySQL数据库中。这两个字符串是查询结果,可以是任何东西。测试过程中出现此错误。INSERT错误 - 1064

前{“您的SQL语法错误;检查手册中 对应于你的MySQL服务器版本正确的语法使用 附近是一个很好的开始,但是我可以向你保证它赢得” T为他没有按” 位于第1" 行} {System.Exception的} MySql.Data.MySqlClient.MySqlException

一些想法我来了以后,它的错误,因为我的一个字符串包含撇号结论'字符,并与mySQL语法混淆。我可以对我的字符串做些什么,以确保它们可以像所有字符一样插入到我的表中?

我试过使用AddWithValue()函数进行字符串操作&,但目前为止都没有工作。我认为使用Replace函数会有帮助,但我很喜欢什么是我希望输出的正确的mySQL语法。

任何想法/建议赞赏。谢谢。

public void Insert(string SearchQuery, string QueryResult) 
     { 
      const string connString = "SERVER=localhost; DATABASE=social_db; UID=root; PASSWORD=pass;"; 
      MySqlConnection connection = new MySqlConnection(connString); 
      MySqlCommand command = connection.CreateCommand(); 

      QueryResult = QueryResult.Replace("'", "\'"); 

      command.CommandText = 
       "INSERT INTO social_tbl (SearchQuery, QueryResult)" 
       + " VALUES " 
       + "('" + SearchQuery + "', '" + QueryResult + "');"; 

      //command.CommandText = 
      //"INSERT INTO social_tbl (SearchQuery, QueryResult) VALUES ('@SearchQuery', '@QueryResult');"; 

      //command.Parameters.AddWithValue("@SearchQuery", SearchQuery); 
      //command.Parameters.AddWithValue("@QueryResult", QueryResult); 

      connection.Open(); 

      command.ExecuteNonQuery(); 

      connection.Close();   
     } 

回答

0

试试这个:

INSERT INTO social_tbl ('SearchQuery', 'QueryResult') 
1

从不将参数转换成一个SQL字符串 - this opens up a very serious security hole (SQL injection!)

使用

 command.CommandText = 
     "INSERT INTO social_tbl (SearchQuery, QueryResult) VALUES (@SearchQuery, @QueryResult);"; 

     command.Parameters.AddWithValue("@SearchQuery", SearchQuery); 
     command.Parameters.AddWithValue("@QueryResult", QueryResult); 

有了这个,你不需要Replace并使用“绑定参数”,它让你从SQL注入安全的,有时甚至是利益的表现。在你原来的代码中,每个参数都有'--当使用“绑定参数”时,这不是必需的,它不会起作用(正如你已经发现的那样)。

+0

这有助于消除我的错误,但是这会将NULL值插入到我的数据表中。 SearchQuery&QueryResult的DataType只是Text,如果我传递的字符串太大,我该怎么做/在这里使用? – Draznar

+0

@Draznar你应该总是检查传入的数据,如果它太大,你可以抛出一个异常和/或更改数据库列的宽度和/或根据您的要求适当缩短参数... – Yahia

+0

@Draznar please don'吨忘记upvote和/或“标记为接受”任何答案是有帮助的... – Yahia

0

我不完全确定为什么,但在查看了一些其他问题以了解洞察之后,我发现使用'?'而不是'@'字符。似乎解决了我的问题。

command.CommandText = 
      "INSERT INTO socialm_tbl (SearchQuery, QueryResult) VALUES (?SearchQuery, ?QueryResult);"; 

      command.Parameters.AddWithValue("?SearchQuery", SearchQuery); 
      command.Parameters.AddWithValue("?QueryResult", QueryResult);