Home > .NET, C#, MySQL > Koristenje .NET tehnologije i MySQL-a, preko ODBC drivera 2

Koristenje .NET tehnologije i MySQL-a, preko ODBC drivera 2

Prosinac 18th, 2008

Koristenje .NET tehnologije i MySQL-a, preko ODBC drivera 2

Nakon što sam “uspjesno” izgubio uvod ovog teksta, pisem ga ponovo.
Ovaj tekst je nastavak proslog clanaka u koje smo obradili konekciju na MySQL server preko ODBC drivera.
Ovaj dio clanka pokrice pojmove kao sto su

  • ADO.NET
  • DataSet
  • DataTable
  • DataGrid – prikazivanje podataka
  • TreeView – punjenje i pretraga


ADO.NET & DataSet

U proslom clanku ostao sam duzan reci makar par rijeci o samoj ADO.NET tehonologiji. Spomenucu samo osnovne stvari.

ADO.NET je database tehnologija sadrzana u .NET frameworku, koja sluzi za pristup i manipulisanje podacima iz baza podataka.
Definise objekte (DataSet i DataTable) optimizovane za prijenos preko
intarneta i samog Interneta. Takodje podrzava standardne nacine konekcije i pristupa podacima sadrzanim u bazama podataka.
DataSet je izolovani (diskonektovani) kontejner podataka. Sadrzi tabele podataka i njihove ralacije.

Kada kazem diskonektovan mislim na to da su podaci izvuceni od servera na klijentsku stranu cime bi se (trebalo) ustedjeti na mreznom saobracaju, i (opet kazem trebalo) dobiti na brzini.

Manjkavost DataSeta je u tome sto se javljaju problemi pri azuriranju podataka sa serverom (mislim, naravno, na visekorisnicko okruzenje).

Pored DataSeta vazna komponenta ADO.NET-a je i DataProvider.
Data Provider-i su mehanizam .NET Framework-a za konekciju na bazu podataka, izvršavanje komandi, i naravno citanje podataka.

Vezu izmedju pojedinih komponenti ADO.NET-a mozete vidjeti na slijedecoj slici.

ADO.NET

Pristup i prikazivanje podataka

Poðimo sa programiranjem. Nastavicemo tamo gdje smo stali sa proslim clankom.

Prvo u vashoj bazu podataka kreirajte još dvije tabele.
U jednoj tabeli (“Platishe”) cuvamo podatke o kupcima koji placaju nashe usluge, a u drugoj (“Placanje”) njihove
uplate. Table su vezane preko ID platishe. Tabele kreirajte pomocu slijedecih SQL naredbi.

CREATE TABLE `placanje` (
  `ID` int(3) unsigned NOT NULL auto_increment,
  `IDplatisha` int(3) unsigned default NULL,
  `Sredstvo` varchar(50) default NULL,
  `JM` varchar(10) default NULL,
  `Kolicina` int(6) unsigned default NULL,
  PRIMARY KEY  (`ID`)
) TYPE=MyISAM

 CREATE TABLE `platisha` (
  `ID` int(3) unsigned NOT NULL auto_increment,
  `Ime` varchar(50) default NULL,
  `Rank` varchar(20) default NULL,
  PRIMARY KEY  (`ID`),
  UNIQUE KEY `ID` (`ID`)
) TYPE=MyISAM

Na postojeću formu dodajte slijedece komponente: DataGrid (dajte joj ime dataGrid1), TreeView (ime treeView1), te dva dugmeta (btnPretraga i btnIzlaz),
i TextBox (txtPretraga) u koji ćemo upisati pojam po kojem ćemo pretraživati treeView1.

Poslozite ovo komponente po formi kao što je dato na slici dole.

Iskoristicemo vec postojeci event (klik) kojim se konektujemo na bazu podataka, samo cemo josh dodati i dio za punjenje DataSeta i odgovarajućih komponenti.
U postojecu funkciju u kojoj obradjujemo klik event za dugme btnKonekcija dodajmo slijedeci kod:

Kreiramo instancu dataseta, kao shto bi uchinili sa bilo kojim objektom. U ovaj dataSet kupicemo sve podatke koji nam budu interesantni.

	DataSet dsPlatishe = new DataSet();

Definisimo slijedecu select komandu (tj njene parametre)

	komanda.CommandText = "SELECT Ime, Rank, Sredstvo, JM, Kolicina  FROM platisha,
	placanje WHERE platisha.ID = placanje.IDplatisha";
	komanda.Connection = konekcija;

Kreiramo novi DataAdapter (vishe). DataAdapter sadrzi SQL naredbu, brine se o konekciji (ne trebate raditi konekcija.Open() i konekcija.Close()), te dostavlja podatke DataSetu. Dovoljno je samo kreirati instancu konekcije i vezati dataAdaper (ili cak kao u ovom slucaju komandu).

	OdbcDataAdapter daListe = new OdbcDataAdapter();
	daListe.SelectCommand =komanda;

DataSet se puni podacima korishtenjem metode Fill. Vrlo jednostavno:

	daListe.Fill (dsPlatishe,"Uplaceno");

Metoda Fill (naravno vezana je za adapter i podatke koje on ima) sadrzi dva parametra, DataSet i ime tabele.
Ime dajemo onako kako nama odgovara, a nova tabela u DataSetu ce biti samo jedna od
tabela u kontejneru kojima ce se sluziti nasa aplikacija.
Ovdje je nastala tabela “Uplaceno” sastavljena od rezultata koje je dataAdapter dobio preko SQL komande,
a koristicemo je samo za popunjavanje DataGrida.

Ubacimo sada u nas DataSet i podatke iz obje tabele, tao što ćemo ih preko zasebnih DataAdaptera procitati i kreirati nove
unutar DataSeta. Ovako nas DataSet postaje jedna baza podataka na klijentskoj strani, sa kojom se mi mozemo igrati po zelji (ne po Zelji).

Znaci, pokupimo tabele iz baze podataka u dvije odvojene tabele, tako sto za svaku za svaku od njih definisemo
dataAdapter i tekst komande.

	komanda.CommandText = "SELECT *  FROM platisha";
	OdbcDataAdapter daPlatishe = new OdbcDataAdapter();
	daPlatishe.SelectCommand =komanda;
	daPlatishe.Fill (dsPlatishe,"Platishe");

	komanda.CommandText = "SELECT *  FROM placanje";
	OdbcDataAdapter daPlacanje = new OdbcDataAdapter();
	daPlacanje.SelectCommand =komanda;
	daPlacanje.Fill (dsPlatishe,"Placanje");

Nas DataGrid cemo popuniti podacima iz tabele (unutar DataSeta) “Uplaceno”

dataGrid1.DataSource = dsPlatishe.Tables["Uplaceno"];

TreeView – punjenje komponente

Kreiracemo dva DataTable objekta, vezana za druge dvije tabele iz DataSeta.

DataTable tabelaPlatishe = dsPlatishe.Tables["Platishe"];
DataTable tabelaPlacanje = dsPlatishe.Tables["Placanje"];

TreeView cemo napuniti tako da su cvorovi (nodes) koji su glavni (prvi po redu) budu imena platisha, koja cemo dobiti iz DataTable
tabelaPlatishe, a cvorovi vezani za njih bice napunjen podacima o njihovima uplatama (DataTable tabelaPlacanje).

//prvo prolazimo kroz sve redove u tabeli kupaca (platisha)
foreach(DataRow  aRow in tabelaPlatishe.Rows)
{
	TreeNode nodePlatisha = new TreeNode(aRow[1].ToString());
	//prolazimo kroz sve redove u tabeli uplata
	foreach(DataRow  uplataRow in tabelaPlacanje.Rows)
	{
		//ako je IDplatisha = ID Platishe dodaj ovaj cvor predhodnom
		if(uplataRow[1].Equals(aRow[0]))
		{
		TreeNode nodeUplata = new TreeNode(uplataRow[2].ToString() + " "
		 + uplataRow[3].ToString() + " " + uplataRow[4].ToString());
		nodePlatisha.Nodes.Add(nodeUplata);
		}
	}
	treeView1.Nodes.Add(nodePlatisha);
}

Ostaje nam josh da uradimo pretragu. Prvo cemo definisati jedan klik event za dugme btnPretraga.

	this.btnPretraga.Click += new System.EventHandler(this.btnPretraga_Click);

U funkciji private void btnPretraga_Click(object sender, System.EventArgs e) obradicemo taj klik.

Ova funkcija poziva funkciju za pretragu “pretraziCvorove(TreeNode, string)” koja kao argument prima cvor (mi cemo joj proslijediti
onaj koji je selektovan) i tekst po kojem ce pretrazivati. Ova fukcija je rekurzivna (poziva sama sebe). Njen kod je slijedeci (objasnjenja su data
u komentarima, radi preglednosti).

public int  pretraziCvorove(TreeNode node, string tekst)
{
int i = 0;
//ubacimo try catch za svaki slucaj, mada ne bi trebalo biti problema
try
{
	foreach(TreeNode currentNode in node.Nodes)
	{
	//ako je prije neka pretraga bojila cvorove vratimo im pozadinu na bijelo
	currentNode.BackColor = Color.White;
	//mora biti >=0 da bi došao do zadnjeg levela
	if((currentNode.Nodes!=null) && (currentNode.Nodes.Count>=0))
	{
		//provjera da li node match , provjerićemo noncase sensitive,
		//i to za slucaj da se string sadrzi unutar rijeci u cvoru
		if(currentNode.Text.ToUpper().ToString().IndexOf(tekst.ToUpper().ToString()) != -1)
		{
			//Oznachimo node koji nam odgovara
			currentNode.BackColor = Color.LightYellow;
			i = i + 1;
		}
		//pozivamo rekurzivno func. za trenutni node
		pretraziCvorove(currentNode,tekst);
		}
	}
}
catch
{
	//nije node selektovan, vjerovatno je to error, sprijeèiti prije pozivanja func
	//ovdje bi trebalo obraditi gresku, ali nije bitno sada...
	MessageBox.Show("Odaberite polje od kojeg poèinje pretraga");
}
return i;
}

Aplikacija bi trebala ovako da izgleda

BHWM primjer

Jos nam ostaje da obradimo klik na btnIzlaz. Definisimo event za klik na njega, i obradimo ga u slijedecoj funkciji

private void btnIzlaz_Click(object sender, System.EventArgs e)
{
if(MessageBox.Show ("Sigurno?", "BHwebmasters.net",  MessageBoxButtons.YesNo) == DialogResult.Yes)
Application.Exit();
}

Sve komentare, kritike i pitanja vezana za ovaj clanak molim postavite na BHWM forumu.

Dino Lokmic,

Linkovi:

Vise o ADO.NET

source ovog primjera

using
System;

using
System.Drawing;

using

System.Collections;

using
System.ComponentModel;

using
System.Windows.Forms;

using
System.Data;

using
System.Data.Odbc;

namespace
mysql1

{

///
<summary>

///
Summary description for Form1.

///
</summary>

public
class
frmMysql : System.Windows.Forms.Form

{

private

System.Windows.Forms.Button btnKonekcija;

private
System.Windows.Forms.Label lblInfo;

private
System.Windows.Forms.DataGrid dataGrid1;

private
System.Windows.Forms.TreeView treeView1;

private
System.Windows.Forms.TextBox txtPretraga;

private
System.Windows.Forms.Button btnPretraga;

private
System.Windows.Forms.Button btnIzlaz;

private

System.ComponentModel.Container components = null;

public
frmMysql()

{

InitializeComponent();

}

protected
override
void
Dispose(
bool
disposing )

{

if(
disposing )

{

if
(components !=
null)

{

components.Dispose();

}

}

base.Dispose(
disposing );

}

#region
Windows Form Designer generated code

///
<summary>

///
Required method for Designer support – do not modify

///

the contents of this method with the code editor.

///
</summary>

private
void
InitializeComponent()

{

System.Resources.ResourceManager
resources =
new
System.Resources.ResourceManager(
typeof(frmMysql));

this.btnKonekcija
=
new
System.Windows.Forms.Button();

this.lblInfo
=
new

System.Windows.Forms.Label();

this.dataGrid1
=
new
System.Windows.Forms.DataGrid();

this.treeView1
=
new
System.Windows.Forms.TreeView();

this.txtPretraga
=
new

System.Windows.Forms.TextBox();

this.btnPretraga
=
new
System.Windows.Forms.Button();

this.btnIzlaz
=
new
System.Windows.Forms.Button();

((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).BeginInit();

this.SuspendLayout();

//

//
btnKonekcija

//

this.btnKonekcija.Location
=
new

System.Drawing.Point(0, 24);

this.btnKonekcija.Name
= “btnKonekcija”;

this.btnKonekcija.Size
=
new
System.Drawing.Size(456, 23);

this.btnKonekcija.TabIndex
= 0;

this.btnKonekcija.Text
= “Konektovanje na MySQL bazu podataka i kupljenje podataka”;

this.btnKonekcija.Click
+=
new
System.EventHandler(
this.btnKonekcija_Click);

//

//
lblInfo

//

this.lblInfo.BackColor
= System.Drawing.SystemColors.Info;

this.lblInfo.Location
=
new

System.Drawing.Point(0, 0);

this.lblInfo.Name
= “lblInfo”;

this.lblInfo.Size
=
new
System.Drawing.Size(464, 24);

this.lblInfo.TabIndex
= 1;

this.lblInfo.Text
= “Konektujte se na DB pritiskom na dugme”;

this.lblInfo.TextAlign
= System.Drawing.ContentAlignment.MiddleCenter;

//

//
dataGrid1

//

this.dataGrid1.CaptionText
= “Uplate od strane clanova BHWM”;

this.dataGrid1.DataMember
= “”;

this.dataGrid1.HeaderForeColor
= System.Drawing.SystemColors.ControlText;

this.dataGrid1.Location
=
new
System.Drawing.Point(0, 48);

this.dataGrid1.Name
= “dataGrid1″;

this.dataGrid1.Size
=
new

System.Drawing.Size(456, 136);

this.dataGrid1.TabIndex
= 3;

//

//
treeView1

//

this.treeView1.ImageIndex
= -1;

this.treeView1.Location
=
new
System.Drawing.Point(0, 184);

this.treeView1.Name
= “treeView1″;

this.treeView1.SelectedImageIndex
= -1;

this.treeView1.Size
=
new
System.Drawing.Size(456, 168);

this.treeView1.TabIndex
= 4;

//

//
txtPretraga

//

this.txtPretraga.Location
=
new
System.Drawing.Point(0, 360);

this.txtPretraga.Name
= “txtPretraga”;

this.txtPretraga.Size
=
new
System.Drawing.Size(184, 20);

this.txtPretraga.TabIndex
= 5;

this.txtPretraga.Text
= “”;

//

//
btnPretraga

//

this.btnPretraga.Location
=
new
System.Drawing.Point(192, 357);

this.btnPretraga.Name
= “btnPretraga”;

this.btnPretraga.Size
=
new
System.Drawing.Size(128, 23);

this.btnPretraga.TabIndex
= 6;

this.btnPretraga.Text
= “Pretraži TreeView”;

this.btnPretraga.Click
+=
new
System.EventHandler(
this.btnPretraga_Click);

//

//
btnIzlaz

//

this.btnIzlaz.Location
=
new
System.Drawing.Point(328, 357);

this.btnIzlaz.Name
= “btnIzlaz”;

this.btnIzlaz.Size
=
new

System.Drawing.Size(128, 23);

this.btnIzlaz.TabIndex
= 7;

this.btnIzlaz.Text
= “IZLAZ”;

this.btnIzlaz.Click
+=
new

System.EventHandler(this.btnIzlaz_Click);

//

//
frmMysql

//

this.AutoScaleBaseSize
=
new

System.Drawing.Size(5, 13);

this.ClientSize
=
new
System.Drawing.Size(458, 383);

this.Controls.Add(this.btnIzlaz);

this.Controls.Add(this.btnPretraga);

this.Controls.Add(this.txtPretraga);

this.Controls.Add(this.treeView1);

this.Controls.Add(this.dataGrid1);

this.Controls.Add(this.lblInfo);

this.Controls.Add(this.btnKonekcija);

this.FormBorderStyle
= System.Windows.Forms.FormBorderStyle.FixedSingle;

this.Icon
= ((System.Drawing.Icon)(resources.GetObject(“$this.Icon”)));

this.MaximizeBox
=
false;

this.Name
= “frmMysql”;

this.StartPosition
= System.Windows.Forms.FormStartPosition.CenterScreen;

this.Text
= “MySQL & .NET :: posjetite bhwebmasters.net”;

this.TopMost
=
true;

this.Load
+=
new
System.EventHandler(
this.frmMysql_Load);

((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).EndInit();

this.ResumeLayout(false);

}

#endregion

[STAThread]

static
void Main()

{

Application.Run(new
frmMysql());

}

private
void
btnKonekcija_Click(
object
sender, System.EventArgs e)

{

OdbcCommand
komanda =
new
OdbcCommand();

//Kreiramo
instancu dataseta, kao shto bi uchinili sa bilo kojim objektom

DataSet
dsPlatishe =
new
DataSet();

//Kreiramo
instancu konekcije

OdbcConnection
konekcija =
new
OdbcConnection(“DSN=mysql_csharp”);

try

{

//mali
dodaci, cisto informativno

//izmjerimo
vrijeme prije konekcije

DateTime
t1 = DateTime.Now;

//konekcija.Open();

lblInfo.Text
= “Konekcija uspjela!”;

//Spojimo
dvije tabele, da vidimo kako se ponaša sa tim

komanda.CommandText
= “SELECT Ime, Rank, Sredstvo, JM, Kolicina FROM platisha,
placanje WHERE platisha.ID = placanje.IDplatisha”;

komanda.Connection
= konekcija;

//Kreiramo
novi DataAdapter

OdbcDataAdapter
daListe =
new

OdbcDataAdapter();

daListe.SelectCommand
=komanda;

//pokupili
smo podatke u datadapter sada samo ih proslijedimo u DataSet

daListe.Fill
(dsPlatishe,”Uplaceno”);

//punimo
datagrid

dataGrid1.DataSource
= dsPlatishe.Tables["Uplaceno"];

//konekcija.Close();

DateTime
t2 = DateTime.Now;

TimeSpan
t3;

t3
= t2 – t1;

lblInfo.Text
= lblInfo.Text + “\nProcitano: ” +
dsPlatishe.Tables["Uplaceno"].Rows.Count.ToString() + “

slogova, za “+ t3.Seconds+” sekundi!”;

//Pokupimo
tabele iz baze podataka u dvije odvojene tabele

//za
svaku od njih definisacemo dataAdapter i tekst komande

komanda.CommandText
= “SELECT * FROM platisha”;

OdbcDataAdapter
daPlatishe =
new
OdbcDataAdapter();

daPlatishe.SelectCommand
=komanda;

//neka
sada DataSet dobije i tabele koje imaju isto ime kao i one u bazi
podatka

daPlatishe.Fill
(dsPlatishe,”Platishe”);

DataTable
tabelaPlatishe = dsPlatishe.Tables["Platishe"];

//uradimo
isto i za tabelu placanje

komanda.CommandText
= “SELECT * FROM placanje”;

OdbcDataAdapter
daPlacanje =
new

OdbcDataAdapter();

daPlacanje.SelectCommand
=komanda;

daPlacanje.Fill
(dsPlatishe,”Placanje”);

DataTable
tabelaPlacanje = dsPlatishe.Tables["Placanje"];

//prvo
prolazimo kroz sve redove u tabeli kupaca (platisha)

foreach(DataRow
aRow
in
tabelaPlatishe.Rows)

{

TreeNode
nodePlatisha =
new
TreeNode(aRow[1].ToString());

nodePlatisha.ForeColor =
Color.DarkGreen;

//prolazimo
kroz sve redove u tabeli uplata

foreach(DataRow
uplataRow
in
tabelaPlacanje.Rows)

{

//ako
je IDplatisha = ID iz tabele Platishe dodaj ovaj cvor predhodnom

if(uplataRow[1].Equals(aRow[0]))

{

TreeNode
nodeUplata =
new
TreeNode(uplataRow[2].ToString() + ” ” +
uplataRow[3].ToString() + ” ” + uplataRow[4].ToString());

nodePlatisha.Nodes.Add(nodeUplata);

}

}

treeView1.Nodes.Add(nodePlatisha);

}

}

catch(Exception
eks)

{

lblInfo.Text
= “Greška: ” + eks.Message.ToString();

lblInfo.BackColor
= Color.Red;

lblInfo.ForeColor
= Color.White;

}

}

private
void
frmMysql_Load(
object

sender, System.EventArgs e)

{

}

private
void

btnIzlaz_Click(object
sender, System.EventArgs e)

{

if(MessageBox.Show
(“Sigurno?”, “BHwebmasters.net”,
MessageBoxButtons.YesNo) == DialogResult.Yes)

Application.Exit();

}

private
void
btnPretraga_Click(
object
sender, System.EventArgs e)

{

//prvo
se osiguravamo da je korisnik odabrao neki cvor, ako nije func se ne
poziva

if(treeView1.SelectedNode
==
null)

{

MessageBox.Show(“odaberite
polaznu tacku za pretragu”);

return;

}

int
i = 0;

i=pretraziCvorove(treeView1.SelectedNode,
txtPretraga.Text);

//Pokazi
koliko je pojmova pronadjeno i rasiri cvorove od odabranog ka dole

MessageBox.Show(“Pronadjeno

” + i.ToString() + ” rezultata!”);

treeView1.SelectedNode.ExpandAll();

}

public
int

pretraziCvorove(TreeNode node, string
tekst)

{

int
i = 0;

//ubacimo
try catch za svaki slucaj, mada ne bi trebalo biti problema

try

{

foreach(TreeNode
currentNode
in
node.Nodes)

{

//ako
je prije neka pretraga bojila cvorove vratimo im pozadinu na bijelo

currentNode.BackColor
= Color.White;

//mora
biti >=0 da bi došao do zadnjeg levela

if((currentNode.Nodes!=null)
&& (currentNode.Nodes.Count>=0))

{

//provjera
da li node match , provjericemo noncase sensitive, i to za slucaj da
se string makar nalazi unutar rijeci u cvoru

if(currentNode.Text.ToUpper().ToString().IndexOf(tekst.ToUpper().ToString())
!= -1)

{

//Oznachimo
node koji nam odgovara

currentNode.BackColor
= Color.LightYellow;

i
= i + 1;

}

//pozivamo
rekurzivno func. za trenutni node

pretraziCvorove(currentNode,tekst);

}

}

}

catch

{

//nije
node selektovan, vjerovatno je to error, sprijeciti prije pozivanja
func

//ovdje
bi trebalo obraditi gresku, ali nije bitno sada…

MessageBox.Show(“Odaberite
polje od kojeg pocinje pretraga”);

}

return
i;

}

}

}

Popularity: 10% [?]

.NET, C#, MySQL , , , , ,

  1. Veljača 15th, 2009 at 20:24 | #1

    Moram da vas pohvalim , danima sam trazio nesto poput ovog tutoriala.
    Do sada ste prvi BH portal koji zapravo ima nekog kvalitetnog sadrzaja i koji su dosada mi necemu i sluzili.

    Vezano za post:
    Sve je odlicno , fino objasnjeno – manje vise strucno.
    Samo mala zamjerka na ovom sourceu na kraju , veoma je nepregledan.

  2. Veljača 15th, 2009 at 20:52 | #2

    Pozdrav Asmire i dobrodoslica,

    hvala velika na tako iskrenom komentaru i toplim rijecima. Takve pohvale daju nam motiv za dalji rad.

    srdacan pozdrav,
    Zeljko Kvesic ispred ekipe BHWebmasters.Net-a

  1. No trackbacks yet.