Execute stored procedure with PetaPoco
Asked Answered
S

4

16

I have a stored procedure which returns back a table value.

Here is my stored procedure:

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

I am not sure whether we have such a way to use PetaPoco to execute a stored procedure and get a returned data as a table? Please help!

As normally I can execute a stored procedure with the follow script but it is not the way I want.

db.Execute("EXEC GetPermitPendingApproval @permitYear=2013");
Salinas answered 21/11, 2013 at 16:41 Comment(0)
S
32

You need to put a semicolon before EXEC.

var result = db.Fetch<dynamic>(";EXEC GetPermitPendingApproval @@permitYear = @0", 2013);
Sula answered 12/2, 2014 at 13:2 Comment(3)
can you explain why the semi colon is needed? Is this due to some internal implementation of something within PetaPoco?Aver
@Aver Yes it is a work around ";" allows you to end the 1st statement to start another. In other words, this ignores the 1st statement inserted by petapoco making it unused.Bobbibobbie
this horrible workaround still works like a charm in 2023, thanksSorbitol
S
18

Answer is probably late, but I hope, that it will be useful for future generations. You should turn EnableAutoSelect option to false on PetaPoco database object db.EnableAutoSelect = false; Otherwise it will keep adding SELECT NULL FROM [Object] to you sql statement.

It's good, that it's possible to debug PetaPoco sources.I've found this option only because of debugging!

Sayles answered 13/4, 2016 at 19:55 Comment(0)
W
9

You get List<T> where T is a POCO type with the properties you want to map or a Dynamic

So the actual syntax is:

var result = db.Fetch<dynamic>(";EXEC GetPermitPendingApproval @0", 2013);

or

var result = db.Fetch<dynamic>(";EXEC GetPermitPendingApproval @permitYear",
                                                       new {permitYear = 2013});
Whiz answered 21/11, 2013 at 19:59 Comment(1)
It does not work and here is an error: Invalid object name '[Object]' from this query string "SELECT NULL FROM [Object] EXEC GetPermitPendingApproval"Salinas
L
6

As of v6.0.344-beta, PetaPoco now supports stored procs natively, so you can do:

var result = db.FetchProc<MyClass>("GetPermitPendingApproval", new { permitYear = 2013 });
Lianna answered 24/11, 2018 at 16:7 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.