C# - SqlParameters osztály használata

forráskód letöltése
Az SqlParameters osztály részletes ismerete nélkül nehezen tudnánk olyan MS SQL tárolt eljárásokat aktivizálni, melyek számára paramétereket kell átadnunk, azok meghívásakor.
Ahhoz, hogy megismerkedhessünk ezzel az osztállyal, első lépésként létre kell hoznunk egy kapcsolatot az MS Sql szerverrel, azon belül is a Northwind példa adatbázissal. Ehhez szükségünk lesz egy SqlConnection és SqlCommand osztályra.
A kapcsolódáshoz szükséges adatokat a példaprogram TextBox-ain keresztül adhatjuk meg.
      connection = new SqlConnection("Data Source="+textBox1.Text+";uid="+textBox2.Text+";password="+textBox3.Text+";initial catalog=Northwind;Connect Timeout=3");
      connection.Open();
Az SqlParameters osztály az SqlCommand osztály Parameters property-ének a típusa. Ha szükségünk van paraméterekre, akkor azokat ezen a property-n keresztül kell beállítanunk.
      protected void button2_Click (object sender, System.EventArgs e)
      {
      SqlCommand command = new SqlCommand("Sales by Year", connection);
      command.CommandType = CommandType.StoredProcedure;        
Az SqlCommand osztály CommandText property-ébe megadjuk a futtatni kívánt tárolt eljárás nevét.
        command.CommandText = "Sales by Year";
Mivel ez a tárolt eljárás most két paramétert is vár, így létrehozunk két SqlParameter osztályt. Figyelem, nem keverendő az SqlParameter és az SqlParameters. Az utóbbi az SqlCommand Parameters property típusa, míg az SqlParameter egy olyan osztály, mely egyetlen paramétert és annak minden jellemzőjét képes tárolni. Az SqlParameters olyan osztály, mely tetszőleges számú SqlParameter osztály tárolására alkalmas, így annyi paramétert hozhatunk létre, amennyire az adott tárolt eljárásnak szüksége van.
        SqlParameter p1 = new SqlParameter();
Ha az SqlParameter paraméter nélküli konstruktorát használjuk, akkor a szükséges információkat a property-ein keresztül kell megadnunk. Ilyen például a paraméter neve. Ezt a ParameterName property-ben adhatjuk meg sztringként.
        p1.ParameterName = "@Beginning_Date";
Arról is rendelkeznünk kell, hogy milyen típusú adatot tárol ez a paraméter. Erre a DatabaseType property-t használhatjuk. Itt az SqlDataType felsorolt típus elemei közül választhatjuk ki a szükséges típust. Ennek nyilván egyeznie kell az adott tárolt eljárás, adott paraméterének típusával.
      p1.SqlDbType = SqlDbType.DateTime;
Harmadik lépésként pedig megadjuk a paraméter aktuális értékét, mely jelen példánknál egy dátum lesz. Ezt a Value property-ben adhatjuk meg.
        p1.Value = new DateTime(1996, 12, 1);
Mivel mostani példánk két dátum típusú paramétert vár, így ugyanezekkel a lépésekkel létrehozunk még egy paramétert.
        SqlParameter p2 = new SqlParameter();
        p2.ParameterName = "@Ending_Date";
        p2.SqlDbType = SqlDbType.DateTime;
        p2.Value = new DateTime(1996, 12, 10);
A két paraméter létrehozása azonban nem elegendő, ezeket még fel is kell vennünk, az SqlParameters osztály elemei közé. Ehhez ennek Add függvényét használhatjuk fel. Itt paraméterként kell megadnunk az SqlParameter típusú, imént létrehozott objektumainkat.
        command.Parameters.Add(p1);
        command.Parameters.Add(p2);
A tárolt eljárás futtatásához és eredményének kiírásához létrehoztunk egy belső Dump nevű függvényt.
        Dump(command);
      }
Nézzük most miként működik a Dump.
Itt az SqlCommand osztály ExecuteReader függvényével futtatjuk a megadott tárolt eljárást. Visszatérési értékként egy SqlDataReader osztályt kapunk.
    private void Dump(SqlCommand command)
    {
      SqlDataReader dr = command.ExecuteReader();
      listBox1.Items.Clear();
Futtatás után egy while ciklussal és az SqlDataReader osztállyal kiolvassuk az összes rekord első mezőjét és egy ListBox-ban megjelenítjük.
      while (dr.Read())
      {
        listBox1.Items.Add(dr.GetValue(0).ToString());
      }
      dr.Close();
    }
Nézzük most a 2-es nyomógombhoz tartozó tárolt eljárás futtatásának körülményeit.
Itt ugyanazt a tárolt eljárást használjuk fel, mint az előbb, de most a szükséges paramétereket másképp hozzuk létre.
A létrehozást most annyiban egyszerűsítjük, hogy az SqlParameter létrehozásánál a konstruktorban adjuk meg a paraméter nevét és típusát.
Így ezek után, már csak az érték megadásra van szükség a Value property-n keresztül.
    protected void button3_Click (object sender, System.EventArgs e)
    {
      SqlCommand command = new SqlCommand("Sales by Year", connection);
      command.CommandType = CommandType.StoredProcedure;        
      SqlParameter p1 = new SqlParameter("@Beginning_Date", SqlDbType.DateTime);
      p1.Value = new DateTime(1996, 12, 1);
      ...
Más kicsit a helyzet, ha olyan a paraméter típusa, mely VarChar, NVarChar típusú.
    protected void button4_Click (object sender, System.EventArgs e)
    {
      ...
      SqlParameter p1 = new SqlParameter();
      p1.ParameterName = "@CategoryName";
      p1.SqlDbType = SqlDbType.NVarChar;
Ebben az esetben a szokásos property-k felhasználásán kívül, még az SqlParameter osztály Size property-ének is értéket kell adnunk. Mivel most a paraméterünk típusa NVarChar és a tárolt eljárásban 15 karakter lett meghatározva maximumként, így a Size property-be is 15-nek kell kerülnie.
      p1.Size = 15;
      p1.Value = "Beverages";
      ...
  }