Садржај
1 Релационе базе података
1.0 1 Релационе базе података
1.0 2 Релационе базе података - квиз
1.0 3 Веза један према више
1.0 4 Веза један према више - квиз
1.0 5 Веза више према више
1.0 6 Веза више према више - квиз
1.0 7 Алат за пројектовање
1.0 8 СУБП
1.0 9 Креирање базе на други начин
1.0 10 Још неке SQL команде
1.1 1 Упит SELECT
1.1 2 Упит SELECT - упит из једне табеле - задаци
1.1 3 Упит SELECT - упит из једне табеле - квиз
1.1 4 Упит SELECT - функције и подупити - задаци
1.1 5 Упит SELECT - функције и подупити - квиз
1.1 6 Упит SELECT - спајање - задаци
1.1 7 Упит SELECT - спајање - квиз
1.1 8 Упит SELECT - нерешени задаци
1.2 1 База података за библиотеку - креирање базе
1.2 2 БП Библиотека - Упит SELECT - упит из једне табеле - задаци
1.2 3 БП Библиотека - Упит SELECT - упит из једне табеле - нерешени задаци
1.2 4 БП Библиотека - Упит SELECT - спајање - задаци
1.2 5 БП Библиотека - Упит SELECT - спајање - нерешени задаци
1.2 6 БП Библиотека - Упит SELECT - функције и подупити - задаци
1.2 7 БП Библиотека - Упит SELECT - функције и подупити - нерешени задаци
1.3 1 База података за возачке дозволе - креирање базе
1.3 2 БП Возачке дозволе - Дијаграм и подаци - практичан рад
1.3 3 БП Возачке дозволе - Упит SELECT - задаци
1.3 4 БП Возачке дозволе - Упит SELECT - нерешени задаци
1.4 1 БП Филмови - Креирање базе - практични рад
1.4 2 БП Филмови - Дијаграм и подаци - практични рад
1.4 3 БП Филмови - Упит SELECT - задаци
1.4 4 БП Филмови - Упит SELECT - нерешени задаци
2 Писање програма унутар система за управљање базама података
2.0 1 Процедуре и команда INSERT
2.0 2 Процедуре и команде UPDATE и DELETE
2.0 3 Процедуре и команде INSERT, UPDATE, и DELETE - квиз
2.0 4 Процедуре и тестирање програма
2.0 5 Процедуре и упит SELECT
2.0 6 Процедуре и курсор за упит SELECT
2.1 1 Функције и упит SELECT
2.1 2 Процедуре и функције са упитом SELECT - квиз
2.1 3 Процедуре и функције са упитом SELECT из једне табеле - задаци
2.1 4 Процедуре и функције са упитом и групним функцијама - задаци
2.1 5 Процедуре и функције са упитом SELECT са спајањем табела - задаци
2.1 6 Процедуре и функције са упитом - нерешени задаци
2.1 7 Формат XML
2.2 1 База података за библиотеку - Процедуре, функције и поређење различитих решења
2.2 2 Процедуре, функције и поређење различитих решења
2.2 3 Процедуре и функције са упитом SELECT из једне табеле - вежбање
2.2 4 Процедуре и функције са упитом SELECT са спајањем табела - вежбање
2.2 5 Процедуре и функције са упитом и групним функцијама и подупитима - вежбање
2.2 6 Процедуре и функције са упитом SELECT - нерешени задаци
2.3 1 База података за возачке дозволе - процедуре и функције са упитом SELECT - вежбање
2.3 2 База података за возачке дозволе - процедуре и функције - нерешени задаци
2.4 1 База података за филмове - процедуре и функције са упитом SELECT - вежбање
2.4 2 База података за филмове - процедуре и функције - нерешени задаци
3 Писање програма у програмским језицима вишег нивоа
3.0 1 Писање програма у развојном окружењу Visual Studio
3.0 2 Писање програма у развојном окружењу Visual Studio - практичан рад
3.0 3 Писање програма у развојном окружењу Visual Studio - процедуре
3.0 4 Писање програма у развојном окружењу Visual Studio - квиз
3.1 1 Угнежђени упит SELECT унутар програма
3.1 2 Угнежђени упит SELECT унутар програма - задаци
3.1 3 Позив процедуре унутар програма
3.1 4 Позив креиране функције унутар програма
3.1 5 Програм са угнежђеним командама у развојном окружењу Visual Studio - квиз
3.1 6 Програм са угнежђеним упитом SELECT из једне табеле - вежбање
3.1 7 Програм са угњежђеним упитом и групним фунцкијама - вежбање
3.1 8 Програм са угнежђеним упитом SELECT са спајањем табела - вежбање
3.1 9 Програм са класом
3.1 10 Програм са угнежђеним упитом - нерешени задаци
3.1 11 Програм са угнежђеним командама INSERT, UPDATE, и DELETE
3.2 1 База података за библиотеку - програм са угнежђеним упитом SELECT из једне табеле - задаци
3.2 2 База података за библиотеку - програм са угнежђеним упитом SELECT - вежбање
3.2 3 База података за библиотеку - програм са угнежђеним упитом - нерешени задаци
3.3 1 База података за возачке дозволе - програм са угнежђеним упитом SELECT - вежбање
3.3 2 База података за возачке дозволе - програм са угнежђеним упитом - нерешени задаци
3.4 1 База података за филмове - програм са угнежђеним упитом SELECT - вежбање
3.4 2 База података за филмове - програм са угнежђеним упитом - нерешени задаци
4 Друга софтверска решења - СУБП Oracle
4.0 1 Oracle Apex и језик PL/SQL
4.0 2 Језик PL/SQL - задаци
4.0 3 Језик PL/SQL - квиз
4.0 4 Језик PL/SQL – нерешени задаци
4.0 5 Наредбе гранања
4.0 6 Наредбе гранања - нерешени задаци
4.0 7 Наредбе циклуса
4.0 8 Наредбе циклуса - нерешени задаци
4.1 1 База података за библиотеку - практичан рад
4.1 2 Наредба SELECT INTO
4.1 3 Наредба SELECT INTO - zadaci
4.1 4 Наредба SELECT INTO - квиз
4.1 5 Наредба SELECT INTO - вежбање
4.1 6 Наредба SELECT INTO - нерешени задаци
4.2 1 Курсори - Узимање података из више редова
4.2 2 Курсори - задаци
4.2 3 Различити начини да се реши проблем
4.2 4 Курсори - нерешени задаци
4.2 5 Курсор са параметром
4.2 6 Курсор са параметром - задаци
4.2 7 Курсор са параметром - нерешени задаци
4.2 8 Курсори - квиз
4.2 9 Курсори и гранање - задаци
4.2 10 Курсори - вежбање
4.2 11 Тренутне позајмице члана - пример
4.2 12 Спискови књига - пример
4.3 1 Процедуре и функције у СУБП-у Oracle Apex
4.3 2 Процедуре и функције - задаци
4.3 3 Процедуре и функције - нерешени задаци
4.3 4 Позајмице једне књиге - пример
4.3 5 Тренутне позајмице - пример
4.3 6 Процедуре и друге SQL команде
4.3 7 Тригери
4.3 8 Списак свих објеката у бази података
4.4 1 Креирање апликације помоћу алата App Builder
4.4 2 Додатне опције App Builder алата
4.4 3 Покретање апликације
4.4 4 Креирање нових страница у апликацији
4.4 5 Покретање раније креиране процедуре
4.4 6 Алат App Builder и XML
4.5 1 База података за салон аутомобила у СУБП-у Oracle Apex - 1. део
4.5 2 База података за салон аутомобила у СУБП-у Oracle Apex - 2. део
4.5 3 База података за салон аутомобила у СУБП-у Oracle Apex - 3. део
4.5 4 База података за продавницу - нерешени пројектни рад

Програм са класом

Комплетан програм најчешће има развијене класе и користи различите структуре података. Податке из базе можемо да учитамо у објекте класа које креирамо. Следе примери како се пишу такви програми.

Многе од задатака који следе касније током овог поглавља можете да решите и на овај начин. Могуће је објединити и више једноставнијих задатака у већи пројекат који ће имати више класа које ће одговарати структури релационе базе. За креирање таквих великих пројеката је потребно да се примени стечено знање Објектно оријентисаног програмирања из трећег разреда гимназије за ученике са посебним способностима за рачунарство и информатику:

Написаћемо програм који приказује садржај табеле autori употребом објеката класе Autor коју ћемо да напишемо.

Када се покрене развојно окружење Visual Studio Community, потребно је да се креира нови пројекат избором опције Create a new project. Изабрани језик треба да буде С#, а врста пројекта Windows Forms App, апликација са графичким корисничким интерфејсом.

Пројекту треба да додамо базу података. У прозору Solution Explorer је потребно да се кликне десни тастер миша над називом пројекта, а затим да се изабере Add/Existing Item… са менија који се појави. База података коју смо креирали се већ налази на рачунару и потребно је пронаћи и изабрати фајл Biblioteka_knjige.mdf у којем је сачувана. Тачна локација може да се провери у систему SQL Server Management Studio у којем смо креирали базу.

Програму додајемо нову класу тако што изаберемо* Add/New Item…* са менија који се појави када се у прозору Solution Explorer кликне десни тастер миша над називом C# програма испод назива пројекта.

../_images/slika_315a.jpg

Класа Autor ће имати три приватна атрибута који редом одговарају идентификационом броју, имену и презимену. Сваки од ових приватних атрибута ће имати јавно својство које има само методу get и којом се дозвољава читање, али не и измена одговарајућег атрибута. Конструктор ће креирати објекат на основу садржаја једног реда. Поред тога ћемо имати и методу за приказ објекта. Ово је најједноставнији облик класе. Класа, за неке сложеније пројекте, ће сигурно имати још метода.

class Autor
{
    private int id_autora;
    private string ime;
    private string prezime;

    public int Id_autora
    {
        get { return id_autora; }
    }

    public string Ime
    {
        get { return ime; }
    }

    public string Prezime
    {
        get { return prezime; }
    }

    public Autor(DataRow dr)
    {
        this.id_autora = (int)dr["id_autora"];
        this.ime = (string)dr["ime"];
        this.prezime = (string)dr["prezime"];
    }

    public override string ToString()
    {
        return String.Format("{0} - {1} {2}",
            this.id_autora, this.ime, this.prezime);
    }
}

У програму ћемо формирати листу и њен садржај ћемо приказати у контроли ListBox, коју можемо да превучемо из прозора Toolbox.

Класе које су нам потребне за читање података из базе и њихов приказ у програму се налазе у именском простору System.Data.SqlClient, који није аутоматски укључен у нови пројекат. Потребно је да додамо следећи ред на врх документа са програмским кодом.

using System.Data.SqlClient;

Приликом писања програма потребно је да се употреби конекциони стринг који је формиран у ранијим примерима, а односи се на повезивање програма на базу података Biblioteka_knjige.mdf.

Следи комплетан програмски код.

private void Form1_Load(object sender, EventArgs e)
    {
        SqlConnection con = new SqlConnection(KONEKCIONI_STRING);
        string cmdText = "SELECT * FROM autori";

        SqlCommand cmd = new SqlCommand(cmdText, con);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        cmd.Connection.Open();
        da.Fill(dt);
        cmd.Connection.Close();

        List<Autor> lista = new List<Autor>();
        foreach (DataRow dr in dt.Rows)
            lista.Add(new Autor(dr));

        foreach (Autor autor in lista)
            listBox1.Items.Add(autor.ToString());
    }

Све је спремно да се покрене апликација кликом на дугме Start и да се тестира прва опција коју смо испрограмирали. На следећој слици се види покренут програм.

../_images/slika_315b.jpg

Програм можемо да зауставимо тако што затворимо прозор у којем је покренут и вратимо се у развојно окружење. Можемо да додамо два поља за унос текста тако да имамо могућност да претражујемо списак по имену или по презимену. Података нема много и цео садржај табеле можемо да учитамо у листу. Претрага листе је ефикаснија од поновног читања базе за свако име или презиме које нам треба.

Података у бази има често много више него што може да се учита у програм, тако да треба користити неке од опција које ограничавају број редова које узимамо из базе.

Следи комплетан програмски код.

List<Autor> lista;

    private void Form1_Load(object sender, EventArgs e)
    {
        SqlConnection con = new SqlConnection(KONEKCIONI_STRING);
        string cmdText = "SELECT * FROM autori";

        SqlCommand cmd = new SqlCommand(cmdText, con);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        cmd.Connection.Open();
        da.Fill(dt);
        cmd.Connection.Close();

        lista = new List<Autor>();
        foreach (DataRow dr in dt.Rows)
            lista.Add(new Autor(dr));

        foreach (Autor autor in lista)
            listBox1.Items.Add(autor.ToString());
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        textBox2.Text = String.Empty;

        if (textBox1.Text != String.Empty)
        {
            listBox1.Items.Clear();
            foreach (Autor autor in lista)
                if (autor.Ime.StartsWith(textBox1.Text))
                    listBox1.Items.Add(autor.ToString());
        }
    }

    private void textBox2_TextChanged(object sender, EventArgs e)
    {
        textBox1.Text = String.Empty;

        if (textBox2.Text != String.Empty)
        {
            listBox1.Items.Clear();
            foreach (Autor autor in lista)
                if (autor.Prezime.StartsWith(textBox2.Text))
                    listBox1.Items.Add(autor.ToString());
        }
    }

На следећој слици се види како можемо да претражујемо списак након што покренемо апликацију кликом на дугме Start.

../_images/slika_315c.jpg

Креираћемо нови програм у којем ћемо направити класу Knjiga. У објекте ове класе ћемо угњежденим упитом учитати податке из неколико табела. Свака књига има назив, назив издавача и број примерака.

class Knjiga
{
    private string naziv;
    private string izdavac;
    private int brojPrimeraka;

    public string Naziv
    {
        get { return naziv; }
    }

    public string Izdavac
    {
        get { return izdavac; }
    }

    public int BrojPrimeraka
    {
        get { return brojPrimeraka; }
    }

    public Knjiga(DataRow dr)
    {
        this.naziv = (string)dr["naziv_knjige"];
        this.izdavac = (string)dr["naziv_izdavaca"];
        this.brojPrimeraka = (int)dr["broj_primeraka"];
    }

    public override string ToString()
    {
        return String.Format("{0} - {1}, broj primeraka = {2}",
            this.naziv, this.izdavac, this.brojPrimeraka);
    }
}

У апликацији ћемо приказати списак књига. Користићемо и објекат класе Chart да прикажемо графикон на којем се виде књиге и бројеви примерака.

../_images/slika_315d.jpg

Следи комплетан програмски код решења.

private void Form1_Load(object sender, EventArgs e)
    {
        SqlConnection con = new SqlConnection(KONEKCIONI_STRING);
        string cmdText = "SELECT knjige.naziv naziv_knjige, " +
            "izdavaci.naziv naziv_izdavaca, " +
            "COUNT(inventarski_broj) broj_primeraka " +
            "FROM primerci JOIN knjige " +
            "ON(primerci.id_knjige=knjige.id_knjige) " +
            "JOIN izdavaci " +
            "ON(knjige.id_izdavaca=izdavaci.id)" +
            "GROUP BY knjige.naziv, izdavaci.naziv";

        SqlCommand cmd = new SqlCommand(cmdText, con);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        cmd.Connection.Open();
        da.Fill(dt);
        cmd.Connection.Close();

        List<Knjiga> lista = new List<Knjiga>();
        foreach (DataRow dr in dt.Rows)
            lista.Add(new Knjiga(dr));

        foreach (Knjiga knjiga in lista)
            listBox1.Items.Add(knjiga.ToString());

        chart1.DataSource = dt;
        chart1.Series["Series1"].XValueMember = "naziv_knjige";
        chart1.Series["Series1"].YValueMembers = "broj_primeraka";
        chart1.Series["Series1"].IsValueShownAsLabel = true;
    }

На следећој слици се види како ради програм након што га покренемо кликом на дугме Start.

../_images/slika_315e.jpg
(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+