我收到此错误消息:
---------------------------您的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
有人可以帮我弄清楚这有什么问题吗?任何帮助都表示赞赏。
谢谢
答案 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注入!