2013-08-10 9 views
6

używamy istniejącej bazy danych przechowywane procedury podobnej do poniższego która zwraca wyjście dziesiętną,dziesiętny parametr wyjściowy w zaokrągleniu do liczby całkowitej w EF5.0

CREATE PROCEDURE spTest(@a int, @b decimal(18,2) output) 
as 
BEGIN 
    SELECT @b=23.22 
    SELECT * FROM <TABLE> where id = @a 
END 

Kiedy wywołać procedurę przechowywaną w aplikacji w C# (kod poniżej) uzyskać wynik w parametrze wyjściowym jako 23 zamiast 23.22

ObjectParameter b = new ObjectParameter("b", typeof(System.Decimal)) 
var result = myentities.context.spTest(1234, b) 

To dokładnie ten sam problem wysłane przez Imre Horváth (http://social.msdn.microsoft.com/Forums/en-US/14bdde82-c084-44dd-ad83-c1305cb966d2/decimal-output-parameter-rounded-to-integer), ale różnica jest używamy SQL Server 2008 i entity Framework 5.0. Po zapoznaniu się z sugestią ze stanowiska mam otwarty plik edmx w edytorze XML i zauważyłem następujące parametru wyjściowego @b jak poniżej,

<Parameter Name="b" Type="decimal" Mode="InOut"/>; 

Zmieniłem go

<Parameter Name="b" Type="decimal" Mode="InOut" Precision="18" Scale="2"/>; 

i uruchom aplikacji i uzyskałem wynik zgodnie z oczekiwaniami (23.22)

To jest praca, ale nie jest rozwiązaniem, ponieważ wiesz, że zmiany zostaną utracone, gdy zaktualizujemy procedurę przechowywaną w projektancie struktury obiektu. W naszej bazie danych mamy wiele procedur przechowywanych, które mają dziesiętny (18,2) jako parametr wyjściowy. Zastanawiam się, czy nadal jest to problem w strukturze encji 5.0. Twoja pomoc będzie bardzo cenna.

Kumar

Odpowiedz

2

Nie, to nie jest ustalona w EF 5,0 Prawdopodobnie nie zostanie ustalona w 6,0 albo.

UPDATE:
ja niedawno zaktualizowana EF 6.0, a nie, problem nadal nie jest rozwiązany. Wydaje mi się, że EF 6.0 jest teraz Open Source, więc zawsze możesz go załatać samemu, jeśli masz na to ochotę.

3

W EF6, mam ten sam problem! Ale znajdź proste rozwiązanie. próbuję ustawić wyjściową wartość ObjectParameter, następnie powrót po przecinku ze skalą, jak 5602,86

public decimal GetQuotationAmount(string rec_id, decimal price) 
{ 
    ObjectParameter qTA_AMT = new ObjectParameter("QTA_AMT", typeof(decimal)); 
    qTA_AMT.Value = 100000.00m; 
    db.GRP_Calc_QuotationAmount(rec_id, price,qTA_AMT); 
    return Convert.ToDecimal(qTA_AMT.Value); 
} 
8

Mam ten sam problem z wami i postanowili go po tym, jak odnosi z tego artykułu http://tiku.io/questions/1120572/decimal-output-parameter-rounded-to-integer-in-ef5-0

Istnieją trzy kroki, aby rozwiązać ten problem:

  1. Kliknij prawym przyciskiem myszy plik edmx => Otwórz za pomocą ... => Edytor XML (tekst).
  2. wyszukiwanie tekstu <Parameter Name="b" Type="numeric" Mode="InOut" /> następnie zastąpić je <Parameter Name="b" Type="numeric" Mode="InOut" Precision="20" Scale="2" />
  3. wyszukiwania tekstu <Parameter Name="b" Mode="InOut" Type="Decimal" /> następnie zastąpić je <Parameter Name="b" Mode="InOut" Type="Decimal" Precision="20" Scale="2" />

nadzieję, że będzie Ci pomóc!