Jazyk C# - přístup k datům Katedra softwarového inženýrství Fakulta informačních technologií České vysoké učení technické v Praze Pavel Štěpán, 2011 Data Reader BI-PCS Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti P. Štěpán Jazyk C# - přístup k datům BI-PCS, výpis 1 1/6
// DataReader - connected pristup k datum using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; // pridano using System.Data.SqlClient; namespace DBDataReader { public partial class Form1 : Form { public Form1() { InitializeComponent(); // zakladni objekty pro pristup k datum SqlConnection conn; SqlCommand cmdselect; SqlDataReader reader; SqlCommand cmdupdate; SqlCommand cmdsp; SqlParameter parmin,parcount; int ID, Krestni, Prijmeni, Osloveni, Mesto; private void Form1_Load(object sender, EventArgs e) { conn = new SqlConnection(); // connection string (informace o pripojeni k DB) je vhodnejsi // umistit napr. do configuracniho souboru conn.connectionstring = "User ID=sa;Password=Pa$$w0rd;" + "Data Source=localhost;Initial Catalog=NW"; // pouziti windows security // conn.connectionstring = "Integrated Security=yes; " + "Data Source=localhost;Initial Catalog=NW"; bool chyba = false; try { conn.open(); // otevreni connection catch (SqlException ex) { MessageBox.Show(ex.Message); // osetreni chyb (provest vsude) foreach (SqlError err in ex.errors) { // vlastni chyby DB (casto totez) MessageBox.Show(err.Message); chyba = true; P. Štěpán Jazyk C# - přístup k datům BI-PCS, výpis 1 2/6
catch (Exception ex) { MessageBox.Show(ex.Message); chyba = true; if (chyba) return; // command pro nacteni dat cmdselect = new SqlCommand(); cmdselect.connection = conn; cmdselect.commandtext = "Select EmployeeID,LastName,FirstName," + "TitleOfCourtesy,City From Employees"; // command pro upravu dat cmdupdate = new SqlCommand(); cmdupdate.connection = conn; // priprava Stored Procedury (SP) cmdsp = new SqlCommand(); cmdsp.connection = conn; cmdsp.commandtext = "ProductsByNames"; cmdsp.commandtype = CommandType.StoredProcedure; // priprava parametru parmin = new SqlParameter(); parmin.parametername = "@min"; // pro SQL Servera se MUSI // SHODOVAT se jmenem v SP parmin.direction = ParameterDirection.Input; parmin.sqldbtype = SqlDbType.Int; cmdsp.parameters.add(parmin); // pridani do kolekce parametru NUTNE!! parcount = new SqlParameter(); parcount.parametername = "@count"; parcount.direction = ParameterDirection.Output; parcount.sqldbtype = SqlDbType.Int; cmdsp.parameters.add(parcount); // DataReader reprezentuje (zpristupnuje) nactena data // posle Select na DB a vrati DataReader reader = cmdselect.executereader(); // vrati index sloupce daneho jmena (pro efektivni pristup k datum) ID = reader.getordinal("employeeid"); Krestni = reader.getordinal("firstname"); Prijmeni = reader.getordinal("lastname"); Osloveni = reader.getordinal("titleofcourtesy"); Mesto = reader.getordinal("city"); P. Štěpán Jazyk C# - přístup k datům BI-PCS, výpis 1 3/6
void FillForm() { //.Read zpristupnuje dalsi record if (reader.read()) { // vrati false, pokud dalsi record neexistuje // Varianta 1 - efektivni, NEprehledna txtid.text = reader.getint32(0).tostring(); txtkrestni.text = reader.getstring(2); txtprijmeni.text = reader.getstring(1); txtosloveni.text = reader.getstring(3); txtmesto.text = reader.getstring(4); */ // Varianta 2 - NEefektivni, prehledna txtid.text = reader["employeeid"].tostring(); txtkrestni.text = reader["firstname"].tostring(); txtprijmeni.text = reader["lastname"].tostring(); txtosloveni.text = reader["titleofcourtesy"].tostring(); txtmesto.text = reader["city"].tostring(); */ // Varianta 3 - efektivni, prehledna txtid.text = reader.getint32(id).tostring(); txtkrestni.text = reader.getstring(krestni); txtprijmeni.text = reader.getstring(prijmeni); txtosloveni.text = reader.getstring(osloveni); txtmesto.text = reader.getstring(mesto); */ // Varianta 4 - osetreni null hodnot // tostring konvertuje null na prazdny retezec txtid.text = reader[id].tostring(); txtkrestni.text = reader[krestni].tostring(); txtprijmeni.text = reader[prijmeni].tostring(); txtosloveni.text = reader[osloveni].tostring(); txtmesto.text = reader[mesto].tostring(); private void btnnext_click(object sender, EventArgs e) { private void btnupdate_click(object sender, EventArgs e) { string strupdate; // vytvoreni SQL commandu (pozor na SQL injection!!) strupdate = "Update Employees Set LastName='" + txtprijmeni.text + "' Where EmployeeID=" + txtid.text; txtsql.text = strupdate; // debug only!! cmdupdate.commandtext = strupdate; P. Štěpán Jazyk C# - přístup k datům BI-PCS, výpis 1 4/6
// po connection s OTEVRENYM DataReaderem NELZE poslat dalsi SQL // command!! (s vyjimkou rezimu MARS na connection u SqlServera) reader.close(); // ExecuteNonQuery posle na databazi SQL command, ktery NEVRACI data cmdupdate.executenonquery(); // ExecuteNonQuery vraci pocet updatovanych,deletovanych,... recordu // int pocet = cmdupdate.executenonquery(); // dalsi moznosti DataReaderu // int cislo = (int)cmdselect.executescalar(); // vrati jednu hodnotu do { // Read nacita data z jedineho selectu daneho commandu while (reader.read()) { //... // NextResult - zacit cist data dalsiho selectu; // pokud neexistuje, vrati false while (reader.nextresult()); */ reader = cmdselect.executereader();// znovuotevreni DataReadera // pouziti Stored Procedury private void btnsp_click(object sender, EventArgs e) { txtsql.clear(); parmin.value = int.parse(txtmin.text); // hodnota vstupniho param reader.close(); reader = cmdsp.executereader(); // zde nelze cist vystupni parametry // txtsql.text += "\r\npocet radku: " + parcount.value + "\r\n"; while (reader.read()) { txtsql.text += reader["unitsinstock"] + "; " + reader["productname"] + "\r\n"; // zde take ne // txtsql.text += "\r\npocet radku: " + parcount.value + "\r\n"; reader.close(); // VYSTUPNI parametry lze cist az PO UZAVRENI DataReaderu!! txtsql.text += "\r\npocet radku: " + parcount.value + "\r\n"; P. Štěpán Jazyk C# - přístup k datům BI-PCS, výpis 1 5/6
reader = cmdselect.executereader(); P. Štěpán Jazyk C# - přístup k datům BI-PCS, výpis 1 6/6