Zwracanie warści przez procedure

0

Witam.

Mam nadzieje, że nie powtarzam jakiegoś wątku.

Mam problem z zwracaniem wartości przez procedurę.
Mam taką prostą procedurę

ALTER PROCEDURE test
@imie varchar Output
AS

 Select @imie = imie from imiona where id = 1 

Jej wywołanie w C# jest następujące

SqlConnection con = new SqlConnection(connectionString);
if (con.State == ConnectionState.Closed) con.Open();
SqlCommand cmd1 = new SqlCommand("test", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter par1;
par1 = cmd1.Parameters.Add(new SqlParameter("@imie", SqlDbType.NChar, 15));
par1.Direction = ParameterDirection.Output;
textBox2.Text = cmd1.Parameters["@imie"].Value.ToString();
cmd1.ExecuteNonQuery();

Procedura nie pobiera mi wartości z bazy i nie przekazuje jej.
Jeśli ktoś byłby tak miły i pomógł w tym problemie, byłbym wdzięczny.

0

Heh sam znalazłem odpowiedź jeśli by koś potrzebował wygląda ona tak

SqlConnection con = new SqlConnection(connectionString);
if (con.State == ConnectionState.Closed) con.Open();
SqlCommand cmd1 = new SqlCommand("test", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter par1;
par1 = cmd1.Parameters.Add(new SqlParameter("@imie", SqlDbType.NChar, 15));
par1.Direction = ParameterDirection.Output;
cmd1.ExecuteNonQuery();
textBox2.Text = cmd1.Parameters["@imie"].Value.ToString();

0

Kilka uwag, które mogą ci się przydać:

  1. nie sprawdzaj połączenia, najlepiej umieść połączenie w klauzurze using, mniej więcej tak:
using (SqlConnection cn = new SqlConnection("...")
{
    // tutaj wywołanie procedur
}

Masz pewność, że zawsze połączenie zostanie zamknięte po wywołaniu operacji (nawet jeśli wywali wyjątek!). Nie zostawiaj otwartego połączenia.

  1. Jeśli procedura ma za zadanie jedynie zwrócić wartość, zamiast ExecuteNonQuery() użyć klasy SqlDataReader , oraz metody Read(). Zwróć uwagę, że ExecuteNonQuery() zwraca liczbę wierszy, jakie się zmieniły (dosłownie "rows affected"). Tak więc może się przydać, ale do czego innego (operacje Update, Delete)

  2. Jeśli masz zamiar zwrócić jedynie jedną wartość, zamiast SqlDataReader.Read() użyj ExecuteScalar()() (najłatwiej, najszybciej, najbardziej elegancko),.

0

Dzięki za cenne uwagi, zastosuję się do nich. Jeśli mogę to mam prośbę do Ciebie. Jeśli masz jakieś pozycje związane z C# i sql server 2005 w języku polskim i możesz się nimi podzielić to chętnie bym skorzystał. Mój adres [email protected]. Nie stać mnie jeszcze na kupienie takich książek :)
Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1