2013-11-21 14 views
11

Tôi có một thủ tục được lưu trữ trả về giá trị bảng.Thực thi thủ tục lưu sẵn với PetaPoco

Dưới đây là thủ tục lưu trữ của tôi:

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 

Tôi không chắc chắn cho dù chúng ta có một cách để sử dụng PetaPoco để thực hiện một thủ tục lưu trữ và có được một dữ liệu trả về như một bảng? Hãy giúp tôi!

Như thường lệ, tôi có thể thực hiện quy trình được lưu trữ bằng tập lệnh sau nhưng đó không phải là cách tôi muốn.

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

Trả lời

5

Bạn nhận được List<T> nơi T là một loại với các thuộc tính bạn muốn ánh xạ hoặc một Dynamic

POCO Vì vậy, các cú pháp thực tế là:

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

hoặc

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

Nó không hoạt động và đây là lỗi: Tên đối tượng không hợp lệ '[Object]' từ chuỗi truy vấn này "SELECT NULL FROM [Object] EXEC GetPermitPendingApproval" – Sam

23

Bạn cần đặt dấu chấm phẩy trước EXEC.

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

Cool! Nó hoạt dộng bây giờ. Cảm ơn bạn! – Sam

+0

bạn có thể giải thích tại sao bán đại tràng là cần thiết? Đây có phải là do một số nội bộ thực hiện một cái gì đó trong PetaPoco? – rdans

+2

@rdans Vâng, đó là một công việc xung quanh ";" cho phép bạn kết thúc câu lệnh thứ nhất để bắt đầu một câu lệnh khác. Nói cách khác, điều này bỏ qua câu lệnh thứ 1 được chèn bởi petapoco khiến nó không được sử dụng. – Bamboo

8

Trả lời có thể là muộn, nhưng tôi hy vọng, điều đó sẽ hữu ích cho các thế hệ tương lai. Bạn nên bật tùy chọn EnableAutoSelect thành false trên đối tượng cơ sở dữ liệu PetaPoco db.EnableAutoSelect = false; Nếu không, nó sẽ tiếp tục thêm SELECT NULL FROM [Object] vào câu lệnh sql của bạn.

Thật tuyệt, có thể gỡ lỗi các nguồn PetaPoco. Tôi đã tìm thấy tùy chọn này chỉ vì gỡ lỗi!

Các vấn đề liên quan