2015-07-16 11 views
5

Gần đây tôi đã có nguyên nhân mang lại chỉ một giá trị duy nhất ngoài dữ liệu dạng bảng được trả về bởi quy trình được lưu trữ của tôi. Vì EF không hỗ trợ các thủ tục được lưu trữ với nhiều bộ kết quả, tôi đã tìm ra rằng tôi có thể thực hiện điều này thông qua một tham số đầu ra. Tuy nhiên, bằng cách sử dụng phương pháp này tôi gặp phải một vấn đề mà trong tôi đã nhận được chỉ làm tròn giá trị trở lại cho một số trường giá trị số.Làm thế nào để sử dụng đúng đối tượng InOut ObjectParameter trong EF4?

Các tham số thủ tục lưu trữ của tôi đã được khai báo là:

@MyValue numeric(19,6) output 

Khi gọi chức năng lập bản đồ, tôi đã có:

var myValue = new ObjectParameter("MyValue", typeof(decimal)); 
List<MyResultItem> results = this.ObjectContext.CallMyStoredProc(someId, myValue).ToList(); 

Đây là những gì luôn được trả về giá trị làm tròn đến một số nguyên (ví dụ: , quy mô không).

tôi lần đầu tiên được thể khắc phục điều này bằng cách thủ công chỉnh sửa XML cơ bản đến .edmx bằng cách thủ công thêm chính xác và Scale thuộc tính:

<Parameter Name="MyValue" Type="numeric" Mode="InOut" Precision="19" Scale="6" /> 

Đây là, không đáng ngạc nhiên, hoàn toàn loại bỏ thời gian sau tôi thực hiện " Cập nhật mẫu từ cơ sở dữ liệu .."

tôi dường như đã cố định nó đáng tin cậy hơn bằng cách cập nhật tuyên bố của tôi cho ObjectParameter như vậy:

var myValue = new ObjectParameter("MyValue", 999999999.999999M); 

Tuy nhiên, điều này có vẻ khủng khiếp như hack, và tôi lo lắng về các vấn đề trong tương lai (ngay cả khi nó chỉ là bảo trì liên quan đến số ma thuật này). Có cách nào tốt hơn và đáng tin cậy hơn để sử dụng các tham số đầu ra trong khuôn khổ Entity Framework không?

+0

Số thập phân trong .NET giữ chữ số của chúng để bạn thử sử dụng 0.0M hoặc 0.000000M thay vì để xem nó có hoạt động không? Điều đó ít nhất sẽ là một chút "ma thuật", tôi đoán nó rơi trở lại 0M mặc định (không có chữ số) – XIU

+0

@XIU Không biết tại sao nó thực hiện điều này, nhưng nếu tôi vượt qua 0.M với bất kỳ số lượng dấu số không, sau đó kết quả 'myValue.Value' luôn luôn 0. Ngoài ra, các ObjectParameters sau đó tôi gửi vào truy vấn là DBNull thay vì nhận được thiết lập. Hoàn toàn kỳ quái. –

+0

Có thể trùng lặp của http://stackoverflow.com/questions/18166992/decimal-output-parameter-rounded-to-integer-in-ef5-0 –

Trả lời

0

tôi đã kết thúc cần này ở nhiều nơi hơn, bây giờ, vì vậy tôi đã tạo ra một phương pháp helper cho nó:

/// <summary> 
/// Get the maximum allowed value for a SQL numeric of the specified scale and precision. 
/// </summary> 
/// <param name="scale">The scale.</param> 
/// <param name="precision">The precision.</param> 
/// <returns>Decimal representing the maximum value for the specified numeric.</returns> 
public static decimal SqlNumericMax(int scale, int precision) 
{ 
    return (decimal)Math.Pow(10, (scale - precision)) - (decimal)Math.Pow(10, (-1 * precision)); 
} 

này không bào chữa việc sử dụng các con số ma thuật trong mã, nhưng ít nhất nó giúp cung cấp kết hợp chính xác giữa những gì bạn thấy trong mã với những gì bạn thấy trong cơ sở dữ liệu. (Ví dụ, đối với một tham số proc lưu trữ numeric(19,6), bạn sẽ gọi Utility.SqlNumericMax(19, 6), vì vậy các mối quan hệ là hơn ngay lập tức rõ ràng.)

Dường như cung cấp các giá trị tối đa để tham số trước khi gọi proc lưu trữ vẫn là tốt nhất và phương pháp đáng tin cậy nhất cho cuộc gọi để điền kết quả chính xác.

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