c# - 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
解决方案
这听起来像是 Oracle 的 MySQL Connector/NET(即MySql.Data
)中的一个错误。如果你能找到一个小的 repro,你可以在https://bugs.mysql.com上报告。(我无法使用 MySQL 服务器重现您提供的代码的问题。)
您应该能够通过切换到MySqlConnector来解决该问题,这是一个备用 MySQL ADO.NET 库。迁移说明在这里:https ://mysqlconnector.net/tutorials/migrating-from-connector-net/
推荐阅读
- javascript - 当请求花费太长时间时,检测何时以角度触发 HTTP 错误
- python - 提高 sklearn 中随机森林回归器的性能
- javascript - 刷新特定的 DIV
- arrays - 为什么 IF 数组公式不生成数组?
- spring-boot - Spring 5 WebFlux 服务器通过 RSocket 协议推送通知
- haskell - 根据条件对列表进行分区的功能 - Haskell
- ajax - 阻止对服务器上我的系统 Web 应用程序文件的访问
- c++ - 为什么 sleep() 会导致换行?
- php - 使用 cURL 将表单数据发布到服务器
- python - 高斯过程回归(克里金法)与径向基函数插值