ADO.NET wstawianie danych do bazy – SqlCommand

 

W tym temacie zdecydowałem się poruszyć zagadnienie wstawiania danych do bazy z wykorzystaniem obiektu typu SqlCommand. Początkowo opis miał zawierać również opis wykorzystania SqlDataAdapter, ale temat zrobiłby się wtedy zbyt obszerny jak na jeden post. Dodatkowo poruszona zostanie kwestia zapytań z parametrami oraz wywyoływania procedur składowanych.

W poprzednich odsłonach pokazałem jak wykorzystać obiekt typu SqlCommand do pobrania danych z bazy za pomocą polecenia SELECT. Można go jednak stosować również m.in. do innych operacji DML (INSERT, UPDATE, DELETE). Opis tabel, które zostaną teraz wykorzystane, przedstawiłem w poprzednim poście dotyczącym tworzenia tabel będących w relacji 1-do-1. Na początek zajmijmy się zatem najprostszym wariantem wstawiania danych, czyli na sztywno zapisanym zapytaniem. Zapytanie takie w moim przypadku będzie miało następującą postać:

string query = "INSERT INTO dbo.Addresses (City, Street) VALUES ('Warszawa', 'Mickiewicza')";

Widzimy tu na sztywno wpisane wartości dla miasta – Warszawa, dla ulicy – Mickiewicza. Aczkolwiek przydatność takiego zapytania jest niewielka, to warto zacząć właśnie od takiej prostej konstrukcji w celu sprawdzenia, czy dane mogą zostać bez komplikacji dodane do tabeli. Polecenia niezwracające wyników które miałyby być analizowane wywoływane są za pomocą metody ExecuteNonQuery() wywoływanej na rzecz obiektu typu SqlCommand. Metoda ta zwraca jedynie liczbę wierszy, które zostały, w tym przypadku, wstawione do tabeli. Kod dla takiego, podstawowego sposobu wstawiania danych do tabeli może wyglądać następująco:
 
using (SqlCommand cmd = new SqlCommand(query, cn))
{
     //Execute query 
    try{
        int rowsAffected = cmd.ExecuteNonQuery();
                                   
        if (rowsAffected != 0)
        {
            System.Diagnostics.Debug.WriteLine("Rows inserted: " + rowsAffected);
        }
        else
        {
            System.Diagnostics.Debug.WriteLine("No rows inserted!");
        }
    }
    catch(Exception ex)
    {
        System.Diagnostics.Debug.WriteLine("Error executing query");
        System.Diagnostics.Debug.WriteLine(ex.Message);
    }
}

Najczęściej wartości przeznaczone do wstawienia do tabeli pochodzą ze zmiennych. Należałoby więc uczynić coś, aby zamiast wpisywanych na sztywno wartości przekazywać wartości zmiennych. Zmienne do zapytania można przekazać poprzez umieszczenie w klauzuli VALUES (….) nazw tych zmiennych ze znakiem @, czyli w takiej postaci, jak deklarowane są zmienne w języku T-SQL:
 
string query = "INSERT INTO dbo.Addresses (City, Street) VALUES (@City, @Street);";

Sposób odbierania wyników jest identyczny jak w poprzednim przypadku. Tym razem należy jednak w jakiś sposób powiązać zmienne występujące w aplikacji ze zmiennymi znajdującymi się w zapytaniu. Można to uczynić na dwa sposoby. Pierwszy z nich, nieco dłuższy:
 
using (SqlCommand cmd = new SqlCommand(query, cn))
{
    //At first using standard INSERT with parameters - insert into Addresses table 
    SqlParameter p = new SqlParameter();
    p.ParameterName = "@City";
    p.Value = CityTextBox.Text;
    cmd.Parameters.Add(p);//Add parameter to set of parameters

    ...
}

Sposób ten wymaga utworzenia obiektu typu SqlParameter, a następnie nadaniu mu nazwy parametru (takiej jak w zapytaniu) oraz wartości, która użyta będzie jako parametr zapytania. W przedstawionym kodzie wartość ta pochodzi z pola tekstowego uzupełnianego przez użytkownika. Na koniec pozostaje jedynie dodać parametr do kolekcji zawartej w obiekcie typu SqlCommand. Drugi, szybszy sposób, w jednym poleceniu tworzy automatycznie obiekt typu SqlParameter, wypełnia odpowiednie właściwości i dodaje do kolekcji:
 
using(SqlCommand cmd = new SqlCommand(query, cn))
{
    ...

    //Another way to create a parameter
    cmd.Parameters.AddWithValue("@Street", StreetTextBox.Text);
}

W tym przypadku wykorzystana została metoda AddWithValue() wywoływana dla kolekcji parametrów obiektu typu SqlCommand.

Stąd już tylko krok do pokazania w jaki sposób można wywoływać procedury składowane z poziomu kodu C#. Przede wszystkim, gdy chcemy skorzystać z procedury należy zmienić argument dostarczany do konstruktora obiektu SqlCommand. Przykładowo, dla utworzonej przez mnie procedury o nazwie sp_InsertShopProcedure, wyglądać to będzie następująco:

using (SqlCommand cmd = new SqlCommand("sp_InsertShopProcedure", cn))
{
    ...
}

Widać więc, że w momencie tworzenia obiektu cmd przekazujemy w konstruktorze jedynie nazwę procedury, pomijając jakiekolwiek informacje o parametrach. Dopiero dla tak utworzonego obiektu parametry te są dostarczane poprzez wykorzystanie odpowiednich metod, przy czym należy pamiętać, aby zaznaczyć iż wykonywana będzie procedura, a nie zwykłe zapytanie:
 
cmd.CommandType = CommandType.StoredProcedure;

Następnie można dodać odpowiednie parametry w taki sposób:
 
cmd.Parameters.AddWithValue("@Name", NameTextBox.Text);
cmd.Parameters.AddWithValue("@City", CityTextBox.Text);
cmd.Parameters.AddWithValue("@Street", StreetTextBox.Text);

lub z zaznaczeniem typu sql i jego rozmiaru, w taki:
 
//Another way to supply parameters
cmd.Parameters.Add("@ChainName", SqlDbType.VarChar, 15);
cmd.Parameters["@ChainName"].SqlValue = ChainNameTextBox.Text;

Sposób wywołania takiej procedury jest identyczny jak zwykłego zapytania, czyli wymaga użycia metody ExecuteNonQuery() na rzecz obiektu typu SqlCommand.
Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

%d blogerów lubi to: