C# 带引号的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");

我想通过我的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”附近


我知道我根本不能使用参数,只需在我的值字符串中加倍引号。。。但我已经使用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()
。这有帮助吗?