如何使用mysql调用实体框架内核中带有输入和输出参数的存储过程

如何使用mysql调用实体框架内核中带有输入和输出参数的存储过程,mysql,stored-procedures,entity-framework-core,output-parameter,input-parameters,Mysql,Stored Procedures,Entity Framework Core,Output Parameter,Input Parameters,我使用ASP.net Core 2.2和Entity Framework Core 2.2.6以及Pomelo.EntityFrameworkCore.MySql 2.2.0与MySql进行连接,我有一个存储过程,其中包含3个输入参数和1个输出参数。我可以在MySQL workbench中这样调用它 CALL GetTechniciansByTrade('Automobile', 1, 10, @total); select @total; 现在我想使用实体框架核心来调用它,我当前使用的代码是

我使用ASP.net Core 2.2和Entity Framework Core 2.2.6以及Pomelo.EntityFrameworkCore.MySql 2.2.0与MySql进行连接,我有一个存储过程,其中包含3个输入参数和1个输出参数。我可以在MySQL workbench中这样调用它

CALL GetTechniciansByTrade('Automobile', 1, 10, @total);
select @total;
现在我想使用实体框架核心来调用它,我当前使用的代码是

var outputParameter = new MySqlParameter("@PageCount", MySqlDbType.Int32);
outputParameter.Direction = System.Data.ParameterDirection.Output;

var results = await _context.GetTechnicians.FromSql("Call GetTechniciansByTrade(@MyTrade, @PageIndex, @PageSize, @PageCount OUT)",
new MySqlParameter("@MyTrade", Trade),
new MySqlParameter("@PageIndex", PageIndex),
new MySqlParameter("@PageSize", PageSize),
outputParameter).ToListAsync();

int PageCount = (int)outputParameter.Value;
我目前得到的例外是

CommandType为Text时仅支持ParameterDirection.Input(参数名称:@PageCount)


你能试试下面的东西吗

  • 使用exec而不是call

    var results=await\u context.GetTechnicians.FromSql(“EXEC GetTechniciansByTrade(@MyTrade,@PageIndex,@PageSize,@PageCount输出)”

  • 在存储过程中选择PageCount


  • 我从这个github获得了信息。

    基于此,我使用@matt-g建议找到了解决方案。 我必须使用ADO.net来实现这一点

    var technicians = new List<TechnicianModel>();
    using (MySqlConnection lconn = new MySqlConnection(_context.Database.GetDbConnection().ConnectionString))
    {
        lconn.Open();
        using (MySqlCommand cmd = new MySqlCommand())
        {
            cmd.Connection = lconn;
            cmd.CommandText = "GetTechniciansByTrade"; // The name of the Stored Proc
            cmd.CommandType = CommandType.StoredProcedure; // It is a Stored Proc
    
            cmd.Parameters.AddWithValue("@Trade", Trade);
            cmd.Parameters.AddWithValue("@PageIndex", PageIndex);
            cmd.Parameters.AddWithValue("@PageSize", PageSize);
    
            cmd.Parameters.AddWithValue("@PageCount", MySqlDbType.Int32);
            cmd.Parameters["@PageCount"].Direction = ParameterDirection.Output; // from System.Data
    
            using (var reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    technicians.Add(new TechnicianModel()
                    {
                        City = reader["City"].ToString(),
                        ExperienceYears = reader["ExperienceYears"] != null ? Convert.ToInt32(reader["ExperienceYears"]) : 0,
                        Id = Guid.Parse(reader["Id"].ToString()),
                        Name = reader["Name"].ToString(),
                        Qualification = reader["Qualification"].ToString(),
                        Town = reader["Town"].ToString()
                    });
                }
            }
    
            Object obj = cmd.Parameters["@PageCount"].Value;
            var lParam = (Int32)obj;    // more useful datatype
        }
    }
    
    var技术人员=新列表();
    使用(MySqlConnection lconn=newmysqlconnection(_context.Database.GetDbConnection().ConnectionString))
    {
    lconn.Open();
    使用(MySqlCommand cmd=new MySqlCommand())
    {
    cmd.Connection=lconn;
    cmd.CommandText=“GetTechniciansByTrade”;//存储过程的名称
    cmd.CommandType=CommandType.StoredProcess;//它是一个存储过程
    cmd.Parameters.AddWithValue(“@Trade”,Trade);
    cmd.Parameters.AddWithValue(“@PageIndex”,PageIndex);
    cmd.Parameters.AddWithValue(“@PageSize”,PageSize);
    cmd.Parameters.AddWithValue(“@PageCount”,MySqlDbType.Int32);
    cmd.Parameters[“@PageCount”].Direction=ParameterDirection.Output;//来自System.Data
    使用(var reader=cmd.ExecuteReader())
    {
    while(reader.Read())
    {
    技术人员。添加(新技术人员模型()
    {
    City=读卡器[“City”]。ToString(),
    ExperienceYears=读卡器[“ExperienceYears”]!=null?将.ToInt32转换为(读卡器[“ExperienceYears”]):0,
    Id=Guid.Parse(读卡器[“Id”].ToString()),
    Name=读卡器[“Name”]。ToString(),
    限定=读卡器[“限定”]。ToString(),
    Town=读卡器[“Town”]。ToString()
    });
    }
    }
    Object obj=cmd.Parameters[“@PageCount”].Value;
    var lParam=(Int32)obj;//更有用的数据类型
    }
    }
    
    此问题仍然存在?是否有问题尚未解决?