从C#Winforms更新表不起作用

时间:2011-02-05 16:17:21

标签: c# .net mysql database winforms

我收到此错误消息:

  
     

---------------------------您的SQL语法有错误;检查   与您的MySQL对应的手册   用于正确语法的服务器版本   在'(标题)VALUES(hi)'附近使用   1

     

---------------------------确定

是的,我知道这与语法有关。问题是,我已经尝试了很多变种,仍然无法让它工作,所以我去了5个网站,我发现谷歌与教程,仍然是同样的问题。这是我的代码:

注意:下面列出的文本框控件的Text属性中的值只是纯文本,所有字母和数字。

try
            {
                label1.Text = "Trying to save. Wait.";
                conn.Open();
                string sql = "UPDATE " + pagelist.Text + "SET " + itemlist.Text + "=" + sitetext.Text;
                MySql.Data.MySqlClient.MySqlCommand cmd = new MySql.Data.MySqlClient.MySqlCommand(sql, conn);
                cmd.ExecuteNonQuery();
            }
            catch (Exception en)
            {
                MessageBox.Show(en.Message);
            }

关于表:

表有3列“标题,标题和文字”。所有都是varchars,每个的长度是255

有人可以帮我弄清楚这有什么问题吗?任何帮助都表示赞赏。

谢谢

5 个答案:

答案 0 :(得分:3)

您需要引用varchar值:

string sql = 
 "UPDATE " + pagelist.Text + " SET " + itemlist.Text + " = '" + sitetext.Text + "'";     

更好的是,使用参数化查询来避免SQL注入攻击。

答案 1 :(得分:3)

除了Mitch的建议外,我还要使用块包装conn和cmd对象:

using ( var conn = new Connection( connString ) )
{
  conn.Open();
  var sql = "my sql";
  using( var cmd = new MySql.Data.MySqlClient.MySqlCommand(sql, conn) )
  {
    cmd.ExecuteNonQuery();
  }
}

这将确保资源被适当释放,连接关闭等等。

以下是与使用参数化查询相关的SO答案:Parameterized Query for MySQL with C#

答案 2 :(得分:3)

我认为你在SET之前忘记了一个空格 如果是文本而不是数字字段,则还必须用单引号括起值 但请抛弃此代码并编写另一个uses parameters

答案 3 :(得分:2)

当直接在查询中使用时,字符串文字需要用引号括起来并正确转义,但这在这里是错误的选项;因为您不能信任输入,所以应该在赋值中使用参数。这取决于提供程序,这可能意味着... = ?... = @argName等 - 并将值添加到命令对象的.Parameters集合中。

在这里使用参数将使您免于SQL注入 - 这是一种非常简单的方法来杀死或滥用写得不好的应用程序。

答案 4 :(得分:0)

请检查语法

更新语法:

更新tablename set feildname = value where condition;

你正确使用这个吗?

如果你传递一个字符串,则用单引号传递它

小心sql注入!