我想通过我的c应用程序(使用connector/net8.0.11)向mysql数据库插入行。我使用命令参数来传递值,因为-在我的理解中-我不必关心任何特殊字符。请在下面找到一个简化的代码示例。
MySqlCommand Cmd = new MySqlCommand("INSERT INTO testtab(TestCol1,TestCol2) VALUES(@test1,@test2)", Con);
Cmd.Parameters.AddWithValue("@test1", "12'34");
Cmd.Parameters.AddWithValue("@test2", "56");
Cmd.ExecuteNonQuery();
但“12'34”中的单引号导致了一个例外:
“您的sql语法有错误;请查看与mysql服务器版本相对应的手册,在第1行的'34'、'56')'附近使用正确的语法。”
我知道我不能简单地使用参数,只是在我的值字符串内的双引号。。。但我已经用连接器/odbc构建了类似的应用程序,它们运行得很好。你能帮我找出连接器/网络的窍门吗?
1条答案
按热度按时间bqjvbblv1#
女士们先生们,我非常感谢你们的帮助,特别感谢progman,你们的评论解决了我的问题。
我现在回答我自己的问题来总结一下。有3种可能的解决方案:
整个问题都与sql模式有关,没有反斜杠转义。一种解决方案是关闭特定的sql模式。
傅博在评论中提到:
逃逸的结果
MySql.Data.MySqlClient.MySqlHelper.EscapeString("12'34")
是12\'34
这很奇怪,但是sql模式no\u backslash\u escapes与参数值的转义字符串斗争(在我看来,这是connector/net中的一个bug,因为connector/odbc工作正常)。另一种解决方案是使用连接器/odbc。对我来说,最后一个窍门是progmans的评论:
根据dev.mysql.com/doc/connector net/en/…在添加值之前必须调用prepare()。
这更像是一种解决方法,但是如果您同时使用sql模式no反斜杠转义和命令参数,则必须调用
Prepare()
打电话之前ExecuteNonQuery()
. 请注意,与《开发人员指南》中的示例不同,在添加参数之前,我无法调用它(您将得到一个异常),我添加了IgnorePrepare=false
连接字符串。我认为这样做的原因是因为它改变了客户端和服务器之间的数据传输:prepared语句的另一个优点是,在启用服务器端prepared语句的情况下,它使用二进制协议,使客户机和服务器之间的数据传输更加高效。
下面是对我有用的代码片段: