2013-11-21 57 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是一個POCO類型與要映射屬性或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 [Object] EXEC GetPermitPendingApproval」 – Sam

23

你需要在EXEC之前加一個分號。

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

很酷!它現在有效。謝謝! – Sam

+0

你能解釋爲什麼需要分號嗎?這是由於PetaPoco內部的一些內部實現嗎? – rdans

+2

@rdans是的,這是一個工作「;」允許您結束第一條語句以啓動另一條語句。換句話說,這忽略了petapoco插入的第一條語句,使其不被使用。 – Bamboo

8

答案可能很晚,但我希望,它會對後代有用。您應該在PetaPoco數據庫對象上將EnableAutoSelect選項設置爲false db.EnableAutoSelect = false; 否則它會繼續向您的sql語句添加SELECT NULL FROM [Object]

這很好,它可以調試PetaPoco sources.I發現這個選項只是因爲調試!