【问题标题】:Updating Table from C# Winforms Not working从 C# Winforms 更新表不起作用
【发布时间】:2011-06-21 22:24:05
【问题描述】:

我收到此错误消息:


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

--------------- 好的

是的,我知道这与语法有关。问题是,我已经尝试了它的许多变体,但仍然无法让它工作,所以我去了 5 个我在谷歌上找到的带有教程的网站,但仍然是同样的问题。下面是我的代码:

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

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

有人可以帮我弄清楚这有什么问题吗?任何帮助都将不胜感激。

谢谢

【问题讨论】:

    标签: c# .net mysql database winforms


    【解决方案1】:

    我想你在SET之前忘记了一个空格。
    如果是文本字段而不是数字字段,还必须用单引号将值括起来。
    但是请把这段代码扔掉,写一个与uses parameters不同的代码。

    【讨论】:

      【解决方案2】:

      除了 Mitch 的建议,我还将 conn 和 cmd 对象包装在 using 块中:

      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#

      【讨论】:

        【解决方案3】:

        您需要引用 varchar 值:

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

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

        【讨论】:

        • 对不起,但上面的代码给了我这个错误:**--------------------------- -- ------------------------- 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '= 'hi'' 附近使用正确的语法------------------------ --- 好的 --------------- **
        • 表格有 3 列“标题、标题和文本”。都是varchars,每个长度都是255。
        • 非常感谢@Mitch Weat!在您发布编辑评论后,我在 SET 之前添加了空格后它起作用了。谢谢:)
        • @Lucifer:我可以建议你接受@gaearon 的回答,因为我认为他们首先发现了缺失的空间。
        • 真的吗?我没有意识到。当然,没问题:)
        【解决方案4】:

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

        在此处使用参数将使您免于 SQL 注入 - 一种非常简单的方法来杀死或滥用编写不佳的应用程序。

        【讨论】:

          【解决方案5】:

          请检查语法

          更新语法:

          更新表名 set feildname = value where condition ;

          你用对了吗?

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

          小心sql注入!

          【讨论】:

          • 我不需要 where 条件。共有 3 列,我只更新 1 列。没有条件。
          猜你喜欢
          • 1970-01-01
          • 2012-08-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-25
          相关资源
          最近更新 更多