首页 > 解决方案 > mysql.data 8.0 在调用 PROCEDURE 时在 .net core 3.1 中出现“参数 '-' not found in the collection”

问题描述

mysql.data 8.0 在调用 PROCEDURE 时在 .net core 3.1 中出现“参数'-'未在集合中找到”。但是当我制作“CheckParameters = false”时就可以了。但我不希望 CheckParameters 为假。

我的环境是:

从nuget安装的asp.net core 3.1 mysql.data,版本为8.0.20,数据库在腾讯云中,是

我的 sp 代码是:

CREATE PROCEDURE `sp_Sys_Option_Select_Test`(
    IN  INKEYWORD               VARCHAR(50),        --  关键字
    IN  INPAGESIZE              VARCHAR(50),            --  每页行数
    IN  INCURPAGE               VARCHAR(50),            --  当前页数
    IN  USERCODE                    VARCHAR(50),        --  操作人编码       (*)
    OUT OUTTOTALCOUNT       VARCHAR(50),            --  总行数
    OUT OUTCHECKMESSAGE VARCHAR(500)        --  返回消息
)
BEGIN 
    select now() as dttime;
    SET OUTTOTALCOUNT = 'this is out_TotalCount';
    SET OUTCHECKMESSAGE = 'Y:控制开关查询成功(反馈';
END

我在 asp.net core 3.1 中的 c# 是:


using (var conn= new MySql.Data.MySqlClient.MySqlConnection(ConnectionString))
{
    MySqlCommand myCommand = new MySqlCommand("sp_Sys_Option_Select_Test", conn);
    myCommand.CommandType = System.Data.CommandType.StoredProcedure;
    myCommand.Parameters.Add(new MySqlParameter() { ParameterName = "INKEYWORD", Value = "", Direction = ParameterDirection.Input, DbType = System.Data.DbType.String });
    myCommand.Parameters.Add(new MySqlParameter() { ParameterName = "INPAGESIZE", Value = "2", Direction = ParameterDirection.Input, DbType = System.Data.DbType.String });
    myCommand.Parameters.Add(new MySqlParameter() { ParameterName = "INCURPAGE", Value = "1", Direction = ParameterDirection.Input, DbType = System.Data.DbType.String });
    myCommand.Parameters.Add(new MySqlParameter() { ParameterName = "USERCODE", Value = "ADMIN", Direction = ParameterDirection.Input, DbType = System.Data.DbType.String });
    myCommand.Parameters.Add(new MySqlParameter() { ParameterName = "OUTTOTALCOUNT", Value = null, Direction = ParameterDirection.Output, DbType = System.Data.DbType.String, Size = 4000 });
    var outp = new MySqlParameter() { ParameterName = "OUTCHECKMESSAGE", Value = null, Direction = ParameterDirection.Output, DbType = System.Data.DbType.String, Size = 4000 };
    myCommand.Parameters.Add(outp);
    MySqlDataAdapter mda = new MySqlDataAdapter(myCommand);
    DataSet ds = new DataSet();
    mda.Fill(ds);
    Console.WriteLine(Convert.ToString(outp.Value));
}

你可以在没有'@'的情况下看到我的参数。实际上,当我将'@'添加到参数时,它也是同样的错误。那么例外是:

   at MySql.Data.MySqlClient.MySqlParameterCollection.GetParameterFlexible(String parameterName, Boolean throwOnNotFound)
   at MySql.Data.MySqlClient.StoredProcedure.GetAndFixParameter(String spName, MySqlSchemaRow param, Boolean realAsFloat, MySqlParameter returnParameter)
   at MySql.Data.MySqlClient.StoredProcedure.CheckParameters(String spName)
   at MySql.Data.MySqlClient.StoredProcedure.Resolve(Boolean preparing)
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader()
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
   at EcCloudCoreApi.Program.CreateHostBuilder(String[] args) in 

标签: c#mysql

解决方案


这听起来像是 Oracle 的 MySQL Connector/NET(即MySql.Data)中的一个错误。如果你能找到一个小的 repro,你可以在https://bugs.mysql.com上报告。(我无法使用 MySQL 服务器重现您提供的代码的问题。)

您应该能够通过切换到MySqlConnector来解决该问题,这是一个备用 MySQL ADO.NET 库。迁移说明在这里:https ://mysqlconnector.net/tutorials/migrating-from-connector-net/


推荐阅读