2015-08-04 14 views
8

starałem się dostać kod status wykonania procedury przechowywanej, gdy napotkał ten błąd:Czytelnik danych ma błędu więcej niż jedno pole podczas wywoływania procedury, która zwraca liczbę całkowitą

An exception of type 'System.Data.Entity.Core.EntityCommandExecutionException' occurred in EntityFramework.SqlServer.dll but was not handled in user code

Additional information: The data reader has more than one field. Multiple fields are not valid for EDM primitive or enumeration types.

mam przepisany procedurę zrobić absolutnie nic, ale zwraca wartość całkowitą, to jak to wygląda teraz:

ALTER Procedure [dbo].[test] 
(
    @i int, 
    @a nvarchar(max), 
    @b nvarchar(max), 
    @c nvarchar(max), 
    @d nvarchar(max) 
) 
As 
Begin 
    SET NOCOUNT ON 

    return 1 
End 

ale nadal ten sam błąd w czasie wykonywania po osiągnięciu wywołanie procedury na linii:

this.Database.SqlQuery<int>("test @i, @a, @b, @c, @d", p_i, p_a, p_b, p_c, p_d).FirstOrDefault(); 

Czy mimo to można dowiedzieć się, jakie są te pola i skąd pochodzą? I jak mam odzyskać zwróconą wartość?

Próbowałem określić krotka dwa ciągi jak T tylko patrzeć na te wartości, ale bez powodzenia ...

Aktualizacje:
Select 1 zamiast return 1 sprawia funkcję użytkową , pozostaje tylko pytanie, jakie są te tajemnicze pola, które są zwracane do czytnika danych?

+2

spróbuj z 'wybierz 1' zamiast powrotu. – artm

+1

Wyświetlany kod wywołuje inny zapisany proces niż ten, który został zmodyfikowany, co może potencjalnie wyjaśnić problem (chyba że w poście wystąpiło literówka). –

+0

@competent_tech Przepraszamy, to nazwa oryginalnej funkcji, która została uproszczona, to tylko literówka w poście ... – Jyrkka

Odpowiedz

0

spróbować

var result = this.Database.SqlQuery<int>("exec test {0}, {1}, {2}, {3}, {4}", p_i, p_a, p_b, p_c, p_d).FirstOrDefault(); 
+0

Otrzymuję 'Niepoprawną składnię w pobliżu '0'. – Jyrkka

+0

kiedy otrzymujesz ten błąd podczas kompilacji lub środowisko wykonawcze? myślę, że to powinno działać. Spróbuj również "exec [dbo]. [Test] {0}, {1}, {2}, {3}, {4}" –

+0

Wypróbowałem też drugi, błąd pozostał taki sam, otrzymuję to W czasie wykonywania. – Jyrkka

0

Myślę, że odpowiedź udzielona przez Charlie ma rację. Ale musisz napisać kod w następujący sposób.

var result = this.Database.SqlQuery<int>(string.Format("exec test {0}, {1}, {2}, {3}, {4}", p_i, p_a, p_b, p_c, p_d)).FirstOrDefault(); 
+0

Cóż, teraz wyjątek jest inny 'Błąd konwertujący typ danych nvarchar na int.' – Jyrkka

+0

oświadczenie jest prawidłowe. więc sprawdź typ danych parametrów w procedurze przechowywanej i wartości, które im przekazujesz. –

+1

Mogę uruchomić kwerendę z SSMS, więc zarówno procedura, jak i wartości są użyteczne. Jedyne, co mogę myśleć to to, że musisz umieścić cytaty w okolicy {1-4}, ponieważ @a, @b, @c i @d są nvarcharami ... – Jyrkka

7

spodziewa się pewnego rodzaju wyniku zestaw (np SELECT). Pod maską, używa DbCommand.ExecuteReader(), a gdy T jest skalarem, oczekuje, że zestaw wyników ma dokładnie jedno pole - ale jeśli zestaw wyników ma więcej niż jedno pole, lub jeśli nie ma pól, zgłasza wyjątek które napotkaliście.

Wartość zwrotna może być pobrana przez przepuszczanie DbParameter do Database.SqlQuery<T>() i ustawienie Direction = ParameterDirection.ReturnValue jak widać na poniższych przykładach:


FYI, jeśli tylko chcesz uzyskać wartość zwracaną, ale nie chcesz zestawu wyników, użyj ExecuteSqlCommand z DbParameter.

+0

Dziękuję za wyjaśnienie rzeczy zza kulis. , ale nie zrozumiałem, procedura zwraca dokładnie jedną wartość, nie jestem pewien, czy można ją traktować jako pole, ale wiadomość mówi, że czytnik ma więcej niż jedno pole ... – Jyrkka

+0

@ Jyrkka: Chodzi mi o to, że podczas używania 'SqlQuery' zlicza pola w zestawie wyników, więc' SELECT x, y, FROM table' będzie miał dwa pola. Kiedy 'T' jest skalarem, oczekuje jednego pola, ale jeśli nie ma pól, wygląda na to, że daje taki sam błąd, jak w przypadku, gdy jest więcej niż jeden. – jjj

0

doszedłem do podobnej sytuacji, byłem wywołanie procedury z EF i procedura miał kilka wypowiedzi drukowania EF był już mylone, ponieważ czyta wszystkie wydruki jak wyjście. Pamiętaj, aby skomentować wszystkie odciski przed użyciem w EF.

+0

Cóż, jak widać, jest to zupełnie inna historia - spójrz na zapytanie, nie ma żadnych instrukcji drukowania - tylko jedno proste 'return' ... – Jyrkka

Powiązane problemy