【问题标题】:Execute stored procedure with PetaPoco使用 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

我不确定我们是否有这样的方式来使用 PetaPoco 执行存储过程并以表格的形式获取返回的数据?请帮忙!

通常我可以使用以下脚本执行存储过程,但这不是我想要的方式。

db.Execute("EXEC GetPermitPendingApproval @permitYear=2013");

【问题讨论】:

    标签: stored-procedures petapoco


    【解决方案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&lt;T&gt;,其中 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 });
      

      【讨论】:

        猜你喜欢
        • 2012-01-31
        • 2012-01-26
        • 2012-04-16
        • 2018-07-03
        • 2013-07-26
        • 2023-03-23
        • 2011-05-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多