2011-10-14 12 views
6

Jestem nowy w pisaniu procedury składowanej. Napisałem więc jeden z parametrami wyjściowymi i chcę uzyskać dostęp do wartości wyjściowej, na gorąco, aby to zrobić.Sposób korzystania z parametru OUTPUT w procedurze zapisanej

Moje procedury przechowywanej:

ALTER PROCEDURE selQuery 
    (
     @id int, @code varchar(50) OUTPUT 
    ) 
AS 
    SELECT RecItemCode = @code, RecUsername from Receipt where RecTransaction = @id 
    RETURN @code 

Jeśli próbuje ustawić „@ code = RecItemCode” Uzyskiwanie błąd jako: „SELECT, które przypisuje wartość do zmiennej nie może być łączona z operacji pobierania danych”

I używam procedura przechowywana jako:

con.Open(); 
cmd.Parameters.AddWithValue("@id", textBox1.Text); 
SqlParameter code = new SqlParameter("@code", SqlDbType.Int); 
code.Direction = ParameterDirection.Output; 
cmd.Parameters.Add(code); 
SqlDataReader sdr = cmd.ExecuteReader(); 
MessageBox.Show(cmd.Parameters["@code"].Value.ToString()); // getting error 
con.Close(); 

błąd: „Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.” Chcę uzyskać wartość parametru wyjściowego. Jak to zdobyć?

Dzięki.

Odpowiedz

7

Kod SQL w SP jest nieprawidłowy. Prawdopodobnie chcesz, aby

W swoim oświadczeniu nie ustawiasz @ kod, próbujesz użyć go dla wartości RecItemCode. To by wyjaśniało twój NullReferenceException przy próbie użycia parametru wyjściowego, ponieważ wartość nigdy nie jest do niego przypisana i dostajesz domyślną wartość null.

Innym problemem jest to, że instrukcja SQL jeśli przepisywane jako

Select @code = RecItemCode, RecUsername from Receipt where RecTransaction = @id 

To jest mieszanie przypisania zmiennej i odzyskiwanie danych. Podkreśla to kilka punktów. Jeśli potrzebujesz danych, które napędzają @code oprócz innych części danych, zapomnij o parametrze wyjściowym i po prostu wybierz dane.

Select RecItemCode, RecUsername from Receipt where RecTransaction = @id 

Jeśli potrzebujesz tylko kodu, użyj pierwszej instrukcji SQL, którą ci pokazałem.Na bezceremonialny przypadek rzeczywiście trzeba wyjście i dane, należy użyć dwóch różnych sprawozdań

Select @code = RecItemCode from Receipt where RecTransaction = @id 
Select RecItemCode, RecUsername from Receipt where RecTransaction = @id 

Należy to przypisać wartość do parametru wyjściowego, a także powrotu dwie kolumny danych w wierszu. Jednak wydaje mi się to bardzo niepotrzebne.

Jeśli piszesz SP, tak jak pokazałem na samej górze, po prostu wywołaj cmd.ExecuteNonQuery();, a następnie odczytaj wartość parametru wyjściowego.


Kolejna kwestia związana z twoim SP i kodem. W swoim SP zadeklarowałeś @code jako varchar. W kodzie podajesz typ parametru jako Int. Zmień SP lub swój kod, aby zapewnić spójność typów.


Uwaga: Jeśli wszystko, co robisz, zwraca pojedynczą wartość, jest inny sposób, który nie wymaga parametrów wyjściowych. Można napisać

Select RecItemCode from Receipt where RecTransaction = @id 

a następnie użyć object obj = cmd.ExecuteScalar(); aby uzyskać wynik, nie ma potrzeby parametr wyjściowy w trybie SP lub w kodzie.

+0

dzięki anthony, bardzo pomogło .... wielkie dzięki – Sandy

+0

Dziękuję i +1. 'object obj = cmd.ExecuteScalar();' działało idealnie. Udało mi się osiągnąć to, czego potrzebowałem w dwóch liniach kodu C#, drugi to "myString = obj.ToString();". – FumblesWithCode

24

Istnieje kilka rzeczy, które trzeba rozwiązać, aby uzyskać jego pracy

  1. Nazwa jest źle jej nie @ouput jego @code
  2. Musisz ustawić kierunek parametru do wyjścia.
  3. Nie używaj AddWithValue, ponieważ nie powinna mieć wartości tylko Ty Add.
  4. Zastosowanie ExecuteNonQuery jeśli nie jesteś powrocie rzędy

Spróbuj

SqlParameter output = new SqlParameter("@code", SqlDbType.Int); 
output.Direction = ParameterDirection.Output; 
cmd.Parameters.Add(output); 
cmd.ExecuteNonQuery(); 
MessageBox.Show(output.Value.ToString()); 
+0

świetnie, ale jak uzyskać wartość parametru wyjściowego ?? output.Value.ToString() podając błąd jako "Odwołanie do obiektu nie jest ustawione na wystąpienie obiektu." – Sandy

+0

i nie mów "TY ZAPOMINA", ponieważ nie zapomniałem, właściwie nie wiem :-( – Sandy

+0

@rapsalands, * po * wykonaj zapytanie, pobierz wartość z parametru. 'Cmd.ExecuteNonQuery(); int value = (int) output.Value; ' –

1

Trzeba zdefiniować parametr wyjściowy jako parametr wyjściowy w kodzie z ParameterDirection.Output wyliczenie. Istnieje wiele przykładów tego, ale tutaj jest jeden na MSDN.

1
SqlCommand yourCommand = new SqlCommand(); 
yourCommand.Connection = yourSqlConn; 
yourCommand.Parameters.Add("@yourParam"); 
yourCommand.Parameters["@yourParam"].Direction = ParameterDirection.Output; 

// execute your query successfully 

int yourResult = yourCommand.Parameters["@yourParam"].Value; 
+0

Otrzymuję błąd. zobacz edycję postu ... dzięki – Sandy

+0

@rapsalands Nie możesz po prostu wykonać kodu. To nie jest samodzielny blok kodu. Ten błąd mówi, że nie utworzono instancji obiektu (tzn. Nie utworzono nowej instancji).Chodziło o to, aby podać ogólne pojęcie, jak uzyskać wartość z parametru wyjściowego przechowywanego procesu. –

+0

Właściwie próbuję nauczyć się SP i nigdy wcześniej tego nie robiłem. Będzie świetnie, jeśli potrafisz powiedzieć, co jest nie tak z moim kodem. Mam na myśli, gdzie muszę stworzyć instancję ?? – Sandy

0

Konieczne jest zamknięcie połączenia przed użyciem parametrów wyjściowych. Coś w tym stylu:

con.Close(); 
MessageBox.Show(cmd.Parameters["@code"].Value.ToString()); 
Powiązane problemy