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

pvabu6sv  于 2023-05-06  发布在  C#
关注(0)|答案(1)|浏览(164)

我是新来的,所以也许这个问题对你来说很明显,但对我来说,这是一个耗时的尝试。我正在用C#构建一个停车程序,并使用Dapper查询我通过Heidi管理的MariaDB数据库。我正在使用VS 2022,C# v.11,Net 6.0,MariaDB V.1O.11和Dapper 2.0。
问题是,当我试图使用Dapper的DynamicParameters从数据库中检索值到一个类中时,它只返回null。我可以将对象保存到数据库中,但不能检索它们,所以我猜问题要么在我的查询中,要么在我的存储过程中,因为连接是成功的。
StoredProcedure接收一个字符串(“folio”),它的作用类似于ID,并且应该从表中返回两个值(列)(“estatus”是字符串,“horaEntrada”是DateTime),它们与“folio”重合。换句话说,应该在“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”列(搜索参数)、“Estate”列(输出参数)和“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

提前感谢您的帮助!

uqjltbpv

uqjltbpv1#

您正在使用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;
    }
}

如果您只期望storedproc返回一行,那么您需要重新访问该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
}

参考:How to return dynamic values in Dapper

相关问题