【问题标题】:How to call stored procedure in Entity Framework Core with input and output parameters using mysql如何使用 mysql 在 Entity Framework Core 中使用输入和输出参数调用存储过程
【发布时间】:2020-02-13 16:06:54
【问题描述】:

我使用 ASP.net Core 2.2 和 Entity Framework core 2.2.6 和 Pomelo.EntityFrameworkCore.MySql 2.2.0 来连接 MySQL,我有一个存储过程,它需要 3 个输入参数和 1 个输出参数。我可以在 MySQL 工作台中调用它,比如

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)

【问题讨论】:

    标签: mysql stored-procedures entity-framework-core output-parameter input-parameters


    【解决方案1】:

    我根据Question 使用@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
        }
    }
    

    【讨论】:

      【解决方案2】:

      你能试试下面的东西吗?

      1. 使用 exec 而不是调用

        var results = await _context.GetTechnicians.FromSql("EXEC GetTechniciansByTrade(@MyTrade, @PageIndex, @PageSize, @PageCount OUTPUT)"

      2. 在存储过程中选择PageCount

      我从这个githubissue得到信息。

      【讨论】:

      • 这个问题还没有解决吗?是不是还没有解决?
      猜你喜欢
      • 2017-12-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      相关资源
      最近更新 更多