2011-02-21 20 views
8

Mam procedura składowana, która zwraca wartość, a nie zestaw danych i mam problemy z uruchomieniem go do pracy z EF4.Wywoływanie procedury składowanej z parametrami

Widziałem to: http://dotnet.dzone.com/news/how-retrieve-stored-procedure

Oto co zrobiłem: dodałem procedurę modelu i importowane funkcję.

Pierwszy problem, jaki miałem, to fakt, że parametry w mojej procedurze mają nazwę: @_Parameter_in. To sprawiło, że EF wprowadził je jako p_Parameter_in, ponieważ nie działałoby z podkreślnikiem jako pierwszym znakiem. Następnie, gdy zadzwoniłem do procedury przechowywanej, widzę w wywołaniu SQL Profiler, że szuka @p_Parameter_in i oczywiście nie było z tym problemu.

Teraz zmieniłem nazwę parametrów i zajrzałem do SQL Trace - wszystko wygląda i działa świetnie. Problem polega na tym, że nie mogę uzyskać wartości. Oto jak wygląda mój kod:

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

Po wywołaniu newKey.Value, to zawsze wartość 0 lub cokolwiek ustawić go. Nie przywraca wartości. Podejrzewam, że mój problem dotyczy sposobu importowania funkcji. Używam Skalarów i typu danych Int32. "Utwórz nowy typ złożony" jest dla mnie wyłączony z jakiegoś powodu. Ktoś miał ten problem?

Odpowiedz

7

Zgaduję, ponieważ nie widzę procedury przechowywanej, do której dzwonisz. Myślę, że chcesz pobrać wartość skalarną, która została zwrócona przez procedurę przechowywaną, a nie wartość parametru wyjściowego zdefiniowanego w procedurze przechowywanej.

Wydaje mi się, że chcesz zdefiniować nową funkcję w EDM i wskazać to w procedurze przechowywanej. Szybkie google ma to potencjalne rozwiązanie: http://www.devtoolshed.com/using-stored-procedures-entity-framework-scalar-return-values

HTH

+0

To jest coś do obejrzenia, mogę po prostu zmodyfikować procedurę do pracy w ten sposób. Obecnie nie zwracam wartości skalarnej. Przypisuję wartość do parametru OUTPUT w procedurze przechowywanej. – katit

+0

To też nie działa. Wystąpił błąd "Czytnik danych zwrócony przez dostawcę danych sklepu nie ma wystarczającej liczby kolumn dla żądanego zapytania" – katit

+0

OK, udało mi się. Umieszczając select @MyValue na końcu zapisanego proc. Pytanie jest nadal otwarte, jeśli możliwe jest użycie parametrów WYJŚCIA z EF .. – katit

2

Problem polega na tym, że parametry wyjściowe proces EF po datareader kończy czytanie. Zazwyczaj jest to po wywołaniu funkcji DataBind(). Miałem ten sam problem z dłuższymi procedurami przetwarzania. Rozwiązuję to za pomocą funkcji .ToList() w ObjectResult.

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

Pojedyncze wiersze lub wartości można prawdopodobnie rozwiązać za pomocą funkcji FirstOrDefault().

0

Miałem ten sam problem co opisana przez Jana Remundę. Ktoś zmienił typ zwracania z Integer na Entity.Core.Objects.ObjectResult (of Integer?), Co zawsze powodowało, że nic nie zwracało.

Dla nas rozwiązaniem było zmuszenie EF do odczytu zwrotu przechowywanego procesu przez dodanie funkcji .FirstOrDefault() do zwrotu.

Powiązane problemy