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 Zpracování dat po částech ( stránkování DataSetu) 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/5
// Nacitani a zpracovavani dat v DataSetu po castech (vyrazne slozitejsi) 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 DBPerPartes { public partial class Form1 : Form { public Form1() { InitializeComponent(); SqlConnection conn; SqlCommand cmdselect; SqlDataAdapter adapter; DataSet ds; DataView view; int CurrentRow; const int BUFFER_SIZE = 10; // zvoleny pocet radku bufferu (ukazka) int MinID, MaxID = 0; // vim, ze MINIMALNI ProductID je 1 nebo vetsi private void Form1_Load(object sender, EventArgs e) { conn = new SqlConnection(); conn.connectionstring = "User ID=sa;Password=Pa$$w0rd; " + "Data Source=localhost;Initial Catalog=NW"; cmdselect = new SqlCommand(); cmdselect.connection = conn; cmdselect.commandtext = "Select ProductID,ProductName " + "From Products Order By ProductID"; adapter = new SqlDataAdapter(); adapter.selectcommand = cmdselect; ds = new DataSet(); // nasledujici nacte 5000 radku od 100000 - neefektivni; // chyby pri insertech a deletech jinymi uzivateli // adapter.fill(ds, 100000, 5000, "Products"); P. Štěpán Jazyk C# - přístup k datům BI-PCS, výpis 1 2/5
// vytvori strukturu tabulky (prazdnou tabulku) adapter.fillschema(ds, SchemaType.Source, "Products"); view = new DataView(ds.Tables["Products"]); // chci mit data vzdy setridena vzestupne podle ProductID view.sort = "ProductID"; FillBufferUp(); // nacteni jednoho bufferu "smerem nahoru" - uprava SQL dotazu void FillBufferUp() { // vyber max. BUFFER_SIZE recordu s hodnotou > MaxID string strsql = "Select Top " + BUFFER_SIZE + " ProductID, ProductName " + "From Products " + "Where ProductID > " + MaxID + " Order By ProductID"; // lze definovat (podstatne slozitejsi) klauzuli where, i pokud // mame trideni podle jinych kriterii (napr. LastName, FirstName). // Casto je treba pridat do trideni Primary Key // (jako posledni polozku do Order By) txtsql.text = strsql; // debug only cmdselect.commandtext = strsql; ds.tables["products"].rows.clear(); // buffer se nevyprazdňuje!! adapter.fill(ds, "Products"); // nove minimalni a maximalni hodnoty ProductID (hodnoty setrideny) int MaxIndex = view.count - 1; MinID = (int)view[0]["productid"]; MaxID = (int)view[maxindex]["productid"]; // nalezeni max. hodnoty PoductID v DB int GetLastID() { int LastID; string strmax; SqlCommand cmdmax; strmax = "Select Max(ProductID) From Products"; cmdmax = new SqlCommand(); cmdmax.commandtext = strmax; cmdmax.connection = conn; // connected pristup vyzaduje otevrene connection!! conn.open(); LastID = (int)cmdmax.executescalar(); // jedna hodnota conn.close(); return LastID; P. Štěpán Jazyk C# - přístup k datům BI-PCS, výpis 1 3/5
// nacteni jednoho bufferu "smerem dolu" - uprava SQL dotazu void FillBufferDown() { // vyber max. BUFFER_SIZE recordu s hodnotou < MinID string strsql = "Select Top " + BUFFER_SIZE + " ProductID, ProductName " + "From Products " + "Where ProductID < " + MinID + " Order By ProductID DESC"; txtsql.text = strsql; // debug only cmdselect.commandtext = strsql; ds.tables["products"].rows.clear(); adapter.fill(ds, "Products"); int MaxIndex = view.count - 1; MinID = (int)view[0]["productid"]; // OK - sort ve view zaridi MaxID = (int)view[maxindex]["productid"]; // nalezeni min. hodnoty PoductID v DB int GetFirstID() { int FirstID; string strmin; SqlCommand cmdmin; strmin = "Select Min(ProductID) From Products"; cmdmin = new SqlCommand(); cmdmin.commandtext = strmin; cmdmin.connection = conn; conn.open(); FirstID = (int)cmdmin.executescalar(); conn.close(); return FirstID; void FillForm(int Index) { DataRowView dr = view[index]; txtproductid.text = dr["productid"].tostring(); txtproductname.text = dr["productname"].tostring(); private void btfirst_click(object sender, EventArgs e) { MaxID = 0; FillBufferUp(); // naplneni 1. bufferu P. Štěpán Jazyk C# - přístup k datům BI-PCS, výpis 1 4/5
private void btnprev_click(object sender, EventArgs e) { if (CurrentRow > 0) FillForm(--CurrentRow); else { // GetLastID a FillBufferUp vykonavat pod lockingem // (v transakci) - aby nikdo nemohl odmazat radky v dobe // mezi GetFirstID a FillBufferDown // jsou pred FirstID jeste nejake radky? if (MinID > GetFirstID()) { FillBufferDown(); // nacteni dalsiho bufferu FillForm(CurrentRow = view.count - 1); private void btnnext_click(object sender, EventArgs e) { if (CurrentRow < view.count - 1) FillForm(++CurrentRow); else { // GetLastID a FillBufferUp - opet pod lockigem // jsou za MaxID jeste nejake radky? if (MaxID < GetLastID()) { FillBufferUp(); // nacteni predchoziho bufferu private void btnlast_click(object sender, EventArgs e) { MinID = int.maxvalue; FillBufferDown(); // nacteni posledniho bufferu FillForm(CurrentRow = view.count - 1); P. Štěpán Jazyk C# - přístup k datům BI-PCS, výpis 1 5/5