我是新来的,所以也许这个问题对你来说很明显,但对我来说,这是一个耗时的尝试。我正在用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
提前感谢您的帮助!
1条答案
按热度按时间uqjltbpv1#
您正在使用
QueryFirstOrDefault
方法,该方法旨在返回单行。但是,存储过程并没有刻意限制为只有1行,因此请尝试使用Query()
方法,因为这允许多行。例如如果您只期望storedproc返回一行,那么您需要重新访问该SQL以确保它是正确的。如果这样做了,那么您可以使用
QueryFirstOrDefault
方法。例如,如果要获取最新的数据,可以修改存储过程以包含ORDER BY子句,根据日期列按降序对结果进行排序。例如:
然后,在你的C#代码中,你可以使用FirstOrDefault()方法而不是First(),它将返回第一行(最近的日期),如果结果集为空,则返回默认值:
试试这个:
参考:How to return dynamic values in Dapper