Először is szükségünk lesz egy adatbázis kapcsolatra. Ehhez az SqlConnection osztályt használjuk és megpróbálunk kapcsolatot teremteni az MS Sql szerver Northwind példa adatbázisával.
Létrehozunk tehát egy SqlConnection osztályt, valamint egy SqlCommand-ot is a későbbi felhasználáshoz.
private SqlConnection connection;
private SqlCommand command;
Kapcsolatteremtés az Open gombra történő kattintáskor kezdődik. Itt értéket adunk az SqlConnection szükséges property-einek, majd az Open függvénnyel megnyitjuk az adatbázist.
protected void button1_Click (object sender, System.EventArgs e)
{
connection = new SqlConnection("Data Source="+textBox1.Text+";uid="+textBox2.Text+";password="+textBox3.Text+";initial catalog=Northwind;Connect Timeout=3");
connection.Open();
Egy tetszőleges lekérdezéshez a következő lépésekre van szükség: létrehozunk egy SqlCommand osztályt. A konstruktorának első paraméterében megadjuk a lekérdezés SQL sztringjét, másodikban pedig a már létre hozott kapcsolatot. CommandType property-ében kell megadnunk, hogy mit írunk a CommandText property-ébe. Mivel most egy Sql lekérdezést szeretnénk megvalósítani, ezért a CommandType property Text értéket kap. Végül meghívjuk a Dump nevű belső függvényünket, mely az aktuális SqlCommand-ot futtatja és megjeleníti annak eredményét.
private void button2_Click(object sender, System.EventArgs e)
{
command = new SqlCommand("select ProductName from Products where CategoryID=1", connection);
command.CommandType = CommandType.Text;
Dump();
}
A példa egyszerűségének kedvéért a Dump csak az eredményhalmaz első oszlopát jeleníti meg egy ListBox-ban. Ehhez egy SqlDataReader osztályt használunk fel, melyet az SqlCommand ExecuteReader függvényének kell átadnunk paraméterként. Ez a függvény indítja el azt a lekérdezést, tárolt eljárást, melyet megadtunk az eddigiek folyamán az SqlCommand-nak.
protected void Dump()
{
SqlDataReader dr = command.ExecuteReader();
Végül már csak egy while ciklusra lesz szükségünk, mely addig fut, amíg az SqlReader-nek van mit olvasnia az eredményhalmazból. A GetValue függvénnyel lekérdezzük az első oszlop aktuális értékét, majd kiírjuk a ListBox-ba.
listBox1.Items.Clear();
while (dr.Read())
{
listBox1.Items.Add(dr.GetValue(0).ToString());
}
dr.Close();
}
Nézzük most, miként futtatható egy tárolt eljárás. Ehhez csak a CommandType property-t kell StoredProcedure értékre beállítanunk és a létrehozásnál egy tárolt eljárás nevét megadni az SqlCommand konstruktorában.
private void button3_Click(object sender, System.EventArgs e)
{
command = new SqlCommand("Ten Most Expensive Products", connection);
command.CommandType = CommandType.StoredProcedure;
Dump();
}
Kissé bonyolultabb a helyzet akkor, ha egy tárolt eljárásnak paraméterei is vannak. Ez esetben nyilvánvaló, hogy a paramétereket is meg kell adnunk a futtatás előtt.
private void button4_Click(object sender, System.EventArgs e)
{
command = new SqlCommand("Sales by Year", connection);
command.CommandType = CommandType.StoredProcedure;
A paraméterek megadására az SqlCommand Parameters property-t kell használnunk, mely SqlParameters osztály típusú. Az SqlParameters egy olyan kollekció, melynek minden eleme egy-egy SqlParameter típusú osztály. E két típusról részletesen a jövő heti lapunkban lehet majd olvasni, mostani feladatunkhoz elegendő annyit tudnunk, hogy egy új paraméter felvételéhez létre kell hoznunk egy SqlParameter osztályt, majd a megfelelő értékadás után az Add függvénynek ezt átadva az új paraméter hozzáadható a paraméter listához.
Az SqlParameter létrehozásakor a konstruktorban meg kell adnunk a paraméter nevét, majd a típusát. Ezek után a Value property-n keresztül tudjuk megadni a paraméterhez tartozó értéket. Ha ez is megvan, akkor jöhet az SqlCommand Parameters property-ének Add függvénye, melynek paraméterként átadva az imént létrehozott SqlParameter osztályt máris felvettünk egy elemet a paraméter listára.
SqlParameter p1 = new SqlParameter("@Beginning_Date", SqlDbType.DateTime);
p1.Value = new DateTime(1996, 12, 1);
command.Parameters.Add(p1);
Több paraméter esetén az előző lépéseket kell ismételnünk.
SqlParameter p2 = new SqlParameter("@Ending_Date", SqlDbType.DateTime);
p2.Value = new DateTime(1996, 12, 10);
command.Parameters.Add(p2);
Dump();
}
Meg kell még említenünk, hogy az SqlCommand osztály CommandType property-ének van egy harmadik lehetséges értéke is. Ez lesz a TableDirect, mely az adattáblák direkt elérését szolgálja, viszont ezt az MS SQL nem támogatja, így ez esetben nem is tudjuk használni.
A CommandTimeout property-ben megadhatunk egy értéket másodpercben értelmezve. Ha a lekérdezésünk, tárolt eljárásunk futtatása ezen idő alatt nem fejeződik be, akkor az meg lesz szakítva és hibaüzenetet kapunk. Alapértelmezett értéke e property-nek 30.