C# 带引号的MySql命令参数
我想通过我的c#应用程序(使用Connector/NET8.0.11)将行插入MySql数据库。我使用命令参数来传递值,因为我的理解是,我不必关心任何特殊字符。请在下面找到一个简化的代码示例C# 带引号的MySql命令参数,c#,mysql,C#,Mysql,我想通过我的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");
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”附近
我知道我根本不能使用参数,只需在我的值字符串中加倍引号。。。但我已经使用Connector/ODBC构建了类似的应用程序,它们运行良好。您能帮我找到Connector/Net的诀窍吗?女士们、先生们,我非常感谢您的帮助,特别感谢Progman,您的评论解决了我的问题 我现在回答我自己的问题,总结一下。有3种可能的解决方案: 整个问题都与SQL模式有关,没有反斜杠转义。一种解决方案可能是关闭特定的SQL模式 傅波在评论中提到:
MySql.Data.MySqlClient.MySqlHelper.EscapeString(“12'34”)
的转义结果是12'34
这很奇怪,但是SQL模式NO_backslax_escape与参数值的转义字符串之间存在冲突(在我看来,这是Connector/Net中的一个错误,因为Connector/ODBC工作正常)。另一种解决方案可能是使用连接器/ODBC
我的最后一个窍门是节目主持人的评论:
根据需要,在添加值之前必须调用Prepare()
这更像是一种解决方法,但如果同时使用SQL模式无反斜杠转义和命令参数,则必须在调用ExecuteNonQuery()
之前调用Prepare()
。请注意,与《开发人员指南》中的示例不同,在添加参数之前,我无法调用它(您将得到一个异常),我将IgnorePrepare=false
添加到连接字符串中。我认为这之所以有效,是因为它改变了客户端和服务器之间的数据传输:
prepared语句的另一个优点是,在启用服务器端prepared语句的情况下,它使用二进制协议,使客户机和服务器之间的数据传输更加高效
以下是适用于我的代码片段:
//add IgnorePrepare=false to the connection string
MySqlConnection Con = new MySqlConnection("Server = localhost; Port = 3306; Database = param_test; Uid = ***; Pwd = ***; SslMode=none; IgnorePrepare=false");
Con.Open();
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.Prepare(); //calling it after Adding the parameters works fine
Cmd.ExecuteNonQuery();
我更关心的是'34'和'56'附近的
部分。看起来MySQL连接器是如何内联查询而不正确转义查询的。您是否可以尝试在其中放置一个sql注入查询,看看它是否有效?像(“@test2”,“1';从testtab中删除('1'='1”);
@PaulF my误判了MySql.Data.MySqlClient.MySqlHelper.EscapeString的转义结果(“12'34”)
是12'34
,但它不应该是12'34
?@Steve仍然像…near>一样得到异常;从testtab WHERE(\'1'='1')中删除)“
。我假设连接器没有完全连接到它。@m.denis根据您的需要,在添加值之前必须调用Prepare()
。这有帮助吗?