使用 PetaPoco 执行存储过程
Posted
技术标签:
【中文标题】使用 PetaPoco 执行存储过程【英文标题】:Execute stored procedure with PetaPoco 【发布时间】:2013-12-06 06:28:32 【问题描述】:我有一个返回表值的存储过程。
这是我的存储过程:
PROCEDURE [GetPermitPendingApproval]
@permitYear int = NULL,
AS
BEGIN
SELECT [p].[ID]
,[p].[PermitNumber]
,[p].[PermitTypeID]
,[p].[ApplicationDate]
,[u].[FirstName]
,[u].[MI]
,[u].[LastName]
,[u].[Suffix]
,[u].[ProfessionalTitle]
,[u].[WorksFor]
FROM [SciCollUser] u
INNER JOIN UserPermit up ON up.[UserID] = u.[ID]
INNER JOIN Permit p ON p.[ID] = [up].[PermitID]
WHERE (@permitYear IS NULL OR p.PermitYear = @permitYear)
ORDER BY [p].[ApplicationDate] ASC;
END
我不确定我们是否有这样的方式来并以表格的形式获取返回的数据?请帮忙!
通常我可以使用以下脚本执行存储过程,但这不是我想要的方式。
db.Execute("EXEC GetPermitPendingApproval @permitYear=2013");
【问题讨论】:
【参考方案1】:您需要在 EXEC 之前放置一个分号。
var result = db.Fetch<dynamic>(";EXEC GetPermitPendingApproval @@permitYear = @0", 2013);
【讨论】:
你能解释一下为什么需要分号吗?这是由于 PetaPoco 中某些内部实现的原因吗? @rdans 是的,它可以解决“;”允许您结束第一个语句以开始另一个语句。换句话说,这忽略了 petapoco 插入的第一条语句,使其未使用。【参考方案2】:答案可能已经晚了,但我希望它对后代有用。您应该在 PetaPoco 数据库对象 db.EnableAutoSelect = false;
上将 EnableAutoSelect 选项设置为 false
否则它会继续添加SELECT NULL FROM [Object]
到你的 sql 语句。
很好,可以调试 PetaPoco 源。我发现这个选项只是因为调试!
【讨论】:
【参考方案3】:您会得到List<T>
,其中 T 是具有您要映射的属性的 POCO 类型或 Dynamic
所以实际的语法是:
var result = db.Fetch<dynamic>(";EXEC GetPermitPendingApproval @0", 2013);
或
var result = db.Fetch<dynamic>(";EXEC GetPermitPendingApproval @permitYear",
new permitYear = 2013);
【讨论】:
它不起作用,这是一个错误:来自此查询字符串“SELECT NULL FROM [Object] EXEC GetPermitPendingApproval”的无效对象名称'[Object]'【参考方案4】:从 v6.0.344-beta 开始,PetaPoco 现在原生支持存储过程,因此您可以:
var result = db.FetchProc<MyClass>("GetPermitPendingApproval", new permitYear = 2013 );
【讨论】:
以上是关于使用 PetaPoco 执行存储过程的主要内容,如果未能解决你的问题,请参考以下文章