在 C# 中使用 Dapper 和 Heidi 的存储过程,我得到一个空值

问题描述 投票:0回答:1

我是新手,所以也许这个问题对你来说很明显,但对我来说这是一个耗时的尝试。我正在用 C# 构建一个停车程序,并使用 Dapper 查询我通过 Heidi 管理的 MariaDB 数据库。我正在使用 VS2022、C# v.11、Net 6.0、MariaDB V.1O.11 和 Dapper 2.0.

问题是,当我尝试使用 Dapper 的 DynamicParameters 将数据库中的值检索到一个类中时,它只返回 null。我可以将对象保存到数据库中,但不能检索它们,所以我猜问题出在我的查询或存储过程中,因为连接成功了。

StoredProcedure 接收一个字符串(“folio”),它的作用类似于 ID,并且应该从表中返回两个值(列)(“estatus”是一个字符串,“horaEntrada”是一个 DateTime),它们与“对开本”。换句话说,应该在“Folio”列中寻找与“folio”的重合,并返回“Estatus”和“HoraEntrada”列下的值,并将这些值分别分配给“estatus”和“horaEntrada”。

这是我的代码(删除了所有与我的问题无关的代码)。在这里,我使用名为“PorHoraModel”的模型和名为“spPorHoraFolio_Get”的存储过程。变量“builder”是我的连接字符串

public static PorHoraModel GetFolio(PorHoraModel modelo)
        {
            var builder = MariaDBConnector();
            using (var connection = new MySqlConnection(builder))
            {
                connection.Open();

                var p = new DynamicParameters();
                p.Add("@folio", modelo.Folio, DbType.String, ParameterDirection.Input);
                p.Add("@estatus", modelo.Status, DbType.String, ParameterDirection.Output);
                p.Add("@horaEntrada", modelo.HoraEntrada, DbType.DateTime, ParameterDirection.Output);

                modelo = connection.QueryFirstOrDefault<PorHoraModel>("spPorHoraFolio_Get", p, commandType: CommandType.StoredProcedure);

                connection.Close();

                return modelo;
            }
        }

这是我的存储过程(“spPorHoraFolio_Get”),它使用“listadoporhora”数据库从“Folio”列(搜索参数)、“Estatus”列(输出参数)和“HoraEntrada”列(输出参数)中获取值

CREATE DEFINER=`root`@`localhost` PROCEDURE `spPorHoraFolio_Get`(
    IN `folio` VARCHAR(14),
    OUT `estatus` VARCHAR(5),
    OUT `horaEntrada` DATETIME
)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
BEGIN

SELECT Folio, Estatus, HoraEntrada 
FROM listadoporhora
WHERE (Folio = folio);

END

提前感谢您的帮助!

c# database mariadb dapper dynamicparameters
1个回答
0
投票

您正在使用旨在返回单行的

QueryFirstOrDefault
方法。然而,存储过程并没有刻意限制为仅 1 行,因此请尝试使用
Query()
方法,因为这允许多行。例如

public static PorHoraModel GetFolio(PorHoraModel modelo)
{
    var builder = MariaDBConnector();
    using (var connection = new MySqlConnection(builder))
    {
        connection.Open();

        var p = new DynamicParameters();
        p.Add("@folio", modelo.Folio, DbType.String, ParameterDirection.Input);
        p.Add("@estatus", modelo.Status, DbType.String, ParameterDirection.Output);
        p.Add("@horaEntrada", modelo.HoraEntrada, DbType.DateTime, ParameterDirection.Output);

        var results = connection.Query<PorHoraModel>("spPorHoraFolio_Get", p, commandType: CommandType.StoredProcedure);

        if (results.Count > 0)
        {
            modelo = results.First();
        }

        connection.Close();

        return modelo;
    }
}

如果您只希望存储过程返回一行,那么您需要重新访问该 SQL 以确保它是正确的。如果这样做,那么您可以使用

QueryFirstOrDefault
方法。

例如如果要获取最新数据,可以修改存储过程以包含 ORDER BY 子句,根据日期列按降序对结果进行排序。例如:

SELECT col1, date_column FROM your_table
ORDER BY date_column DESC
LIMIT 1;

然后,在您的 C# 代码中,您可以使用 FirstOrDefault() 方法而不是 First(),它将返回第一行(最近日期)或如果结果集为空则返回默认值:

if (results.Count() > 0)
{
    modelo = results.FirstOrDefault();
}

试试这个:

var results = connection.Query<dynamic>("spPorHoraFolio_Get", p, commandType: CommandType.StoredProcedure);

foreach (var row in results)
{
    var fields = row as IDictionary<string, object>;
    var estatus = fields["estatus"];
    var horaEntrada = fields["horaEntrada"];
    // Process the values as needed
}

参考:如何在 Dapper 中返回动态值

© www.soinside.com 2019 - 2024. All rights reserved.