MySQL 参数化查询的功能就像它在 C# 应用程序中未参数化一样

Posted

技术标签:

【中文标题】MySQL 参数化查询的功能就像它在 C# 应用程序中未参数化一样【英文标题】:MySQL parameterized query is functioning like it is not parameterized in C# application 【发布时间】:2022-01-22 05:10:05 【问题描述】:

我不断收到此错误:mysql.Data.MySqlClient.MySqlException: '您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在“功能:SecurityTesting @mytag 场景:SQL Injection Given I visit ' at line 1”附近使用正确的语法

参数 Gherkin 是导致查询失败的参数。我都试过了?和 @ 作为参数前缀,没有任何变化。

这是我的代码:

string CommandText = " INSERT INTO Feature(`Path`, Gherkin, RepoID, `Name`, Updated) VALUES (?Path,  ?Gherkin , ?RepoID, ?Name, ?Updated) ON DUPLICATE KEY UPDATE Gherkin = VALUES(?Gherkin); ";


       

            using (MySqlConnection connection = new MySqlConnection())
            
                connection.ConnectionString = ConfigurationManager.ConnectionStrings["TAF_DB"].ConnectionString;
                using (MySqlCommand command = new MySqlCommand())
                

                    var gherkinParam = new MySqlParameter("Gherkin", test.Gherkin);
                    //var gherkinParam = new MySqlParameter("Gherkin", MySqlDbType.VarChar);
                    var pathParam = new MySqlParameter("Path", MySqlDbType.VarChar);
                    var RepoIDParam = new MySqlParameter("RepoID", MySqlDbType.Int64);
                    var nameParam = new MySqlParameter("Name", MySqlDbType.VarChar);
                    var updatedParam = new MySqlParameter("Updated", MySqlDbType.VarChar);

                    gherkinParam.Value = test.Gherkin;
                    command.Parameters.Add(gherkinParam);
                    pathParam.Value = test.Path;
                    command.Parameters.Add(pathParam);
                    RepoIDParam.Value = test.RepoID;

                    command.Parameters.Add(RepoIDParam);
                    nameParam.Value = test.Name;

                    command.Parameters.Add(nameParam);
                    updatedParam.Value = test.Updated;
                    command.Parameters.Add(updatedParam);

                    command.Connection = connection;
                    command.CommandType = CommandType.Text;
                    command.CommandText = CommandText;
                    connection.Open();
                    command.ExecuteNonQuery();
                    connection.Close();

                
            

【问题讨论】:

一些小提示:command.CommandType = CommandType.Text; 不是必需的,它是默认设置。 connection.Close(); 也没有必要,using 会这样做。您可以使用 contrucotr 参数缩短为 using (var connection = new MySqlConnection(ConfigurationManager.ConnectionStrings["TAF_DB"].ConnectionString)) using (var command = new MySqlCommand(CommandText, connection)) ... 您也可以将参数缩短为 command.Parameters.Add(new MySqlParameter("@Gherkin", MySqlDbType.VarChar).Value = test.Gherkin; 等。您可以将多行字符串用于带有 @" 的命令文本 【参考方案1】:

您应该在函数VALUES() 中使用列名Gherkin,而不是命名参数?Gherkin

UPDATE Gherkin = VALUES(Gherkin)

【讨论】:

谢谢!这对声明的最后一部分起到了作用,但我仍然必须有一个 @ 或 ?第一个“VALUES”部分的前缀,否则该值始终为“Gherkin”。 @Benny 当然你必须在 VALUES 列表中使用 ?Gherkin。我的回答是关于 UPDATE 语句中的 VALUES() 函数。

以上是关于MySQL 参数化查询的功能就像它在 C# 应用程序中未参数化一样的主要内容,如果未能解决你的问题,请参考以下文章

如何使 pixi js 掩码过滤器响应移动视图上的触摸,就像它在桌面视图中移动指针一样?

有没有办法安装 jar 本地 gradle 存储库,就像它在 mave 中一样(maven install:install-file [duplicate]

c# dapper mysql like 参数化

[转]向facebook学习,通过协程实现mysql查询的异步化

Oracle/SQL - 基于参数的动态列

解析参数化查询C#时出错[重复]