2013-11-21 2 views
11

У меня есть хранимая процедура, возвращающая значение таблицы.Выполнение хранимой процедуры с помощью PetaPoco

Вот моя хранимая процедура:

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"); 

ответ

5

Вы List<T> где T является типом ПОКО со свойствами, которые вы хотите отобразить или Dynamic

Так фактический синтаксис:

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

или

var result = db.Fetch<dynamic>("EXEC GetPermitPendingApproval @permitYear", 
                 new {permitYear = 2013}); 
+1

Это не работает, а вот ошибка: Недопустимое имя объекта '[Object]' из этой строки запроса "SELECT NULL FROM [Объект] EXEC GetPermitPendingApproval" – Sam

23

Вам нужно поставить точку с запятой перед EXEC.

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

Круто! Он работает сейчас. Спасибо! – Sam

+0

Можете ли вы объяснить, зачем нужна полуколонка? Это связано с некоторой внутренней реализацией чего-то в PetaPoco? – rdans

+2

@rdans Да, это работа вокруг ";" позволяет завершить 1-й оператор, чтобы начать другой. Другими словами, это игнорирует первое утверждение, введенное петапоко, что делает его неиспользованным. – Bamboo

8

Ответ, вероятно, поздний, но я надеюсь, что он будет полезен для будущих поколений. Вы должны включить параметр EnableAutoSelect в false на объекте базы данных PetaPoco db.EnableAutoSelect = false; В противном случае он будет продолжать добавлять SELECT NULL FROM [Object] к вашему заявлению sql.

Хорошо, что можно отлаживать источники PetaPoco. Я нашел эту опцию только из-за отладки!

Смежные вопросы