我是新手,所以也许这个问题对你来说很明显,但对我来说这是一个耗时的尝试。我正在用 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
提前感谢您的帮助!
您正在使用旨在返回单行的
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
}