2011-02-21 47 views
8

Tôi có một thủ tục được lưu trữ trả về một giá trị, không phải tập dữ liệu và tôi gặp sự cố khi làm việc với EF4.Gọi thủ tục lưu sẵn với các tham số

Tôi đã nhìn thấy điều này: http://dotnet.dzone.com/news/how-retrieve-stored-procedure

Dưới đây là những gì tôi đã làm: Tôi đã thêm một thủ tục để các mô hình, và nhập khẩu một hàm.

Vấn đề đầu tiên tôi gặp phải là thông số trong quy trình của tôi có tên là @_Parameter_in. Điều đó khiến EF mang chúng vào như p_Parameter_in vì nó sẽ không hoạt động với dấu gạch dưới là ký tự đầu tiên. Sau đó, khi tôi gọi là thủ tục được lưu trữ, tôi có thể thấy trong SQL Profiler gọi rằng nó tìm kiếm @p_Parameter_in, và tất nhiên có một vấn đề với điều đó.

Bây giờ tôi đã đổi tên các tham số và nhìn vào Dấu vết SQL - mọi thứ đều hoạt động tốt. Vấn đề là tôi không thể có được giá trị. Dưới đây là cách mã của tôi trông như thế nào:

System.Data.Objects.ObjectParameter newKey = new System.Data.Objects.ObjectParameter("NewKey_out", typeof(Int32)); 
newKey.Value = 0; 
context.GetNextSurrogateKey_v2("tTest", newKey); 

Sau khi gọi newKey.Value, giá trị này luôn bằng 0 hoặc bất kỳ giá trị nào tôi đặt. Nó không mang lại giá trị. Tôi nghi ngờ vấn đề của tôi là với cách tôi nhập hàm. Tôi sử dụng Scalars và kiểu dữ liệu Int32. "Tạo kiểu phức hợp mới" bị tắt cho tôi vì một lý do nào đó. Có ai có vấn đề đó không?

Trả lời

7

Tôi đoán ở đây vì tôi không thể xem quy trình được lưu trữ mà bạn đang gọi. Tôi nghĩ rằng bạn đang muốn lấy một giá trị vô hướng đã được trả về bởi các thủ tục lưu trữ, chứ không phải là giá trị của một tham số đầu ra như được định nghĩa trong thủ tục được lưu trữ.

Tôi tin rằng bạn muốn xác định một Chức năng mới trong EDM và trỏ điểm này vào quy trình được lưu trữ. Một google nhanh chóng có giải pháp này tiềm năng: http://www.devtoolshed.com/using-stored-procedures-entity-framework-scalar-return-values

HTH

+0

Đó là một cái gì đó để xem xét, tôi chỉ có thể sửa đổi thủ tục để làm việc như thế này. Hiện tại tôi không trả lại giá trị vô hướng. Tôi gán giá trị cho tham số OUTPUT trong thủ tục lưu sẵn. – katit

+0

Điều đó không hoạt động. Tôi gặp lỗi "Trình đọc dữ liệu được nhà cung cấp dữ liệu lưu trữ trả lại không có đủ cột cho truy vấn được yêu cầu" – katit

+0

Ok, tôi đã làm cho trình đọc dữ liệu hoạt động. Với việc chọn @MyValue ở cuối proc được lưu trữ. Câu hỏi vẫn mở nếu có thể sử dụng tham số OUTPUT với EF .. – katit

2

Vấn đề là EF thông số đầu ra quá trình sau khi kết thúc datareader đọc. Đó thường là sau khi gọi hàm DataBind(). Tôi đã gặp vấn đề tương tự với các quy trình xử lý lâu hơn. Tôi giải quyết điều này bằng cách sử dụng .ToList() chức năng trên ObjectResult.

var rowsCount = new ObjectParameter("RowsCount", typeof(Int32));  
var result = db.GetProductList(pageSize, pageNumber, rowsCount).ToList(); 
this.ProductsCount = (int?)rowsCount.Value; 

Hàng hoặc giá trị đơn lẻ có thể bạn có thể giải quyết bằng hàm FirstOrDefault().

0

Tôi gặp vấn đề tương tự như mô tả của Jan Remunda. Ai đó đã thay đổi kiểu trả về từ Integer thành Entity.Core.Objects.ObjectResult (của Integer?) Dẫn đến việc không trả về gì cả.

Đối với chúng tôi giải pháp là buộc EF phải đọc trả lại proc đã lưu bằng cách thêm hàm .FirstOrDefault() vào trả về.

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