C#, GUI, baze

C#, GUI, baze

Avtor: Matija Lokar

Kako do podatkov v bazi

  • Podatke hranimo v bazi
  • S pomočjo jezika SQL "enostavno" dobimo ustrezne podatke
  • Sedaj pa bi s temi podatki radi še kaj naredili
  • Narisali, poiskali optimalno podzaporedje, ...
  • Torej:

    • Kako iz baze dobiti podatke, da jih uporabimo v izbranem programskem jeziku
  • Ali tudi, če počnemo "navadne" zadeve?

    • Torej take, ki so bolj ali manj enostavno izvedljive kar s SELECT (in ostalo kramo stavkov v SQL)
    • Da! Zakaj?

      • SQL je za običajnega zemljana "pretežek"
      • Potrebujemo gumbke, vnosna polja, ...
      • Podatki morajo biti prikazani "lepo"

"Glavni igralci"

  • Podatkovni vir: izvor podatkov

    • Baze
    • Pa tudi: datoteke XML, ...
  • Povezava do podatkovnega vira

    • Ustrezen razred, ki vsebuje podatke o tem, kje je podatkovni vir in kako se do njega dostopa
    • Povezava je aktivna (odprta - delujoča) ali zaprta
  • Ukaz

    • Objekt, ki predstavlja ukaz, ki ga RDBMS izvede nad virom
    • Potrebuje odprto povezavo
  • Podatki

    • Tabele, ki jih vrne ukaz
    • Predstavitev podatkov v programu

Povezava

  • Prvi objekt, ki ga potrebujemo
  • Osnovna povezava do podatkovnega vira

    • Poskrbi tudi za upo. ime, geslo …
  • Definiramo povezovalni niz

    • Zgled za SQLServerCE
    • String povezovalniNiz = @"Data Source = E:\ISKRA\Baze\LjM.sdf;Persist Security Info=False;";
  • Ustvarimo povezavo

    • SqlCeConnection povezava = new
      SqlCeConnection(povezovalniNiz);
  • In jo odpremo

    • povezava.Open();

Objekt Command

  • Objekt, ki bo po povezavi "prenašal" ukaze od programa k podatkovnemu viru in nazaj nosil rezultate

    • SqlCeCommand ukaz = new SqlCeCommand();
  • Določimo mu lastnosti

    • s katero povezavo je povezan

      • ukaz.Connection = povezava;
    • Tip ukaza

      • ukaz.CommandType = CommandType.Text;
    • Vsebino

      • Ustrezni ukaz v SQL
      • ukaz.CommandText = "SELECT * FROM Razvrstitev";

Izvajanje ukazov

  • Odpremo povezavo do podatkovnega vira
  • Izvedemo ukaz
  • Obdelamo rezultate
  • Zapremo povezavo

DataReader

  • Objekt, ki vsebuje rezultate ukaza, ki jih vrne podatkovni vir.
  • Ga lahko le beremo

    • SqlCeDataReader
  • SqlCeDataReader rez = ukaz.ExecuteReader();

In sedaj obdelajmo podatke

while (rez.Read()) {
   String ime = rez[2].ToString();
   String priimek = rez[1].ToString();
   String mesto = rez["city"].ToString();
   Console.WriteLine(ime + " " + priimek +
      " " + mesto);
}

  • Rez je torej nekakšna tabela
  • Indeksi

    • Imena stolpcev
    • Uporabljamo pa lahko tudi 0, 1, …

In kako na to "obesiti" GUI

Želeni program

(10.png)

Baza

(11.png)

Windows Forms

  • V C# Express izberemo Windows Forms Application
  • Način Design
  • Način Code
(12.png)

Načrtamo GUI

  • Lastnost MultiLine pri TextBox
  • In sedaj povezava do baze
  • Pozor na reference!
  • Kam dodati vzpostavljanje povezave, …
  • V dogodek Load na formi

    • Ukaz mora biti dosegljiv več metodam, zato "zunaj" (komponenta forme)

Form_Load

SqlCeCommand ukaz = new SqlCeCommand();

private void Form1_Load(object sender, EventArgs e)
{
    // vzpostavimo povezavo
    SqlCeConnection povezava;
    String povezovalniNiz = @"Data Source =
          F:\ISKRA\Baze\LjM.sdf;Persist Security
          Info=False;";
    povezava = new SqlCeConnection(povezovalniNiz);
    // ukazni objekt
    ukaz.Connection = povezava;
    ukaz.CommandType = CommandType.Text;
    povezava.Open(); // odpremo povezavo
}

Klik na gumb

private void button1_Click(object sender, EventArgs e)
{
    ukaz.CommandText = "SELECT * FROM Razvrstitev" +
       " WHERE LR = " + textBox1.Text;
    SqlCeDataReader rez = ukaz.ExecuteReader();
    String izpis = "";
    while (rez.Read())
    {
        String priimek = rez["Priimek"].ToString();
        String ime = rez["Ime"].ToString();
        izpis = izpis + ime + " " + priimek +
           Environment.NewLine;
    }
    textBox2.Text = izpis;
}

Zadnjič

Zaženemo C# Express

(17.png)

Dodamo vir podatkov

(18.png)

Izberemo ustrezno bazo

(19a.png) (19b.png)

Povemo, katere tabele potrebujemo

(20.png)

In vse je pripravljeno

(21.png)

Povleči tabelo, ali stolpec na okno in …

(22.png)

Kaj se zgodi

  • Cel kup novih datotek
  • Dodani objekti
  • Oglejmo si nekaj kode

Ali gre vse skupaj "peš" (in še s popravljanjem podatkov)

Delo z nepovezanimi podatki

  • Radi bi podatke v bazi tudi spreminjali
  • Ampak nočemo ves čas imeti odprte povezave ("drago", včasih nemogoče (Web, mobilnost, …))
  • Objekt DataSet

    • Lahko vsebuje več tabel
    • Le "skladišče" za podatke
  • Povezava do baze

    • Občasna
    • Prenos podatkov med DataSet in bazo
    • SqlCeDataAdapter (oz. SqlDataAdapter oz. … (glede na tip RDBMS)

Primer

(26.png)

SQLCeDataAdapter

  • Polnjenje DataSet (Fill)

    • Odpri povezavo
    • "počrpaj" podatke (iz podatkovnega vira – običajno je to baza) in jih daj v DataSet
    • Zapri podatke
  • Ob spremembi podatkov (Update)

    • Odpri povezavo
    • V DataSet spremenjene podatke shrani v podatkovni vir
    • Zapri podatke

Koraki 1, 2, 3

  • Povezava do baze

    • String povezovalniNiz = @"Data Source =
      F:\ISKRA\Baze\LjM.sdf;Persist Security Info=False;";
    • povezava = new SqlCeConnection(povezovalniNiz);
  • Ustvariti DataSet

    • DataSet mojiPodatki = new DataSet();
    • Trenutno je ta objekt prazen (brez podatkov)
    • Polnili ga bomo preko DataAdapter
  • SqlCeDataAdapter

    • Ukaz v SQL s katerim pridobimo podatke
    • Povezavo do baze (ni odprta, za to bo skrbel DA)
    • podVmesTekaci = new SqlCeDataAdapter(
      "SELECT * FROM Razvrstitev", povezava);

Koraki 4, 5

  • Možnost uporabe Insert, Delete, Update

    • Dodati SqlCeCommandBuilder
  • Objekt, ki omogoča, da DA "reagira" na spreminjanje DS in to zapiše v bazo

    • SqlCeCommandBuilder cmdBldr = new
      SqlCeCommandBuilder(podVmesTekaci);
  • Polnjenje DataSet

    • DA.Fill(DS, kakoImenujemoToTabelo)

      • podVmesTekaci.Fill(podTekaci, imeTabele);
  • Popravki DataSet podatkovni vir

    • podVmesTekaci.Update (podTekaci, imeTabele);

GUI

  • DataGrid
  • Tabelarična predstavitev
  • Lastnost

    • DataSource
  • tabTekaci.DataSource = podTekaci;
  • tabTekaci.DataMember = imeTabele;
  • Ob spremembi DS – spremebe v DataGrid
  • Ampak stvar naredimo "peš"

    • Konzolna aplikacija (ki bo ustvarila okno)

Program

  • Ustrezne reference

    • using System.Data.SqlServerCe;
    • using System.Drawing;
    • using System.Windows.Forms;
  • Razred
    class OknoSPodatki : Form
    {
        private SqlCeConnection povezava;
        private SqlCeDataAdapter podVmesTekaci;

        private DataSet podTekaci;
        private DataGrid tabTekaci;

        private const string imeTabele = "Tekači";
    }

Konstruktor

  • Ustvari GUI

public OknoSPodatki()
    {
        this.Height = 500;
        this.Width = 800; // velikost okna
        // napolnimo podatke
        PolniPodatke();
        // podatke prikažemo v DataGrid
        tabTekaci = new DataGrid();
        tabTekaci.Location = new Point(5, 5);
        tabTekaci.Size = new Size(
            this.ClientRectangle.Size.Width - 10,
            this.ClientRectangle.Height - 50);
        tabTekaci.DataSource = podTekaci;
        tabTekaci.DataMember = imeTabele;
}

Konstruktor

// gumb Popravi
Button popravi = new Button();
popravi.Text = "Popravi";
popravi.Location = new Point( // kje bo gumb
   this.ClientRectangle.Width / 2 - popravi.Width / 2,
   this.ClientRectangle.Height - (popravi.Height + 10));
popravi.Click += new EventHandler(PopraviKlik);

// dodamo na okno DataGrid in Gumb
Controls.AddRange(new Control[] { tabTekaci, popravi });

PolniPodatke()

public void PolniPodatke()
{
    // 1. vzpostavimo povezavo
    String povezovalniNiz = @"Data Source = F:\ISKRA\Baze\LjM.sdf";
    povezava = new SqlCeConnection(povezovalniNiz);

    // 2. naredimo DataSet (množico podatkov)
    podTekaci = new DataSet();

    // 3. ustvarimo  SqlCeDataAdapter z ukazom SELECT in povezavo
    podVmesTekaci = new SqlCeDataAdapter(
        "SELECT * FROM Razvrstitev", povezava);

    // 4. dodamo možnost ukazov insert, update in delete
    SqlCeCommandBuilder cmdBldr = new SqlCeCommandBuilder(podVmesTekaci);

    // 5. napolnimo tabelo
    podVmesTekaci.Fill(podTekaci, imeTabele);
}

Ustrezni kliki in začetni zagon

// klik na gumb Popravi
public void PopraviKlik(object sender, EventArgs e)
{
    // spremembe v bazo
    podVmesTekaci.Update(podTekaci, imeTabele);
}

// Izpišemo okno in zaženemo zgodbo
static void Main()
{
    Application.Run(new OknoSPodatki());
}

0%
0%