1. ZADATAK .rs
4041775-16764000lefttop00Univerzitet u Novom SaduTehni?ki fakultet ?Mihajlo Pupin?ZrenjaninSEMINARSKI RADPredmet: Programski prevodiociTema: Kreiranje objektno-orjentisane C# desktop aplikacije uz samostalno kreiranje biblioteke klasa i analiza ispravnosti programskog koda primenom Visual Studio NET okru?enja- Evidencija knjiga u knji?ari– (TIP 2)Predmetni nastavnik: Prof. dr Ljubica KaziStudent: Miljana Beli?Broj indeksa: SI 9/17Zrenjanin, 2020.godina Sadr?aj TOC \o "1-3" \h \z \u 1. ZADATAK PAGEREF _Toc48667459 \h 32. OPIS POSLOVNOG KONTEKSTA REALIZOVANOG PRIMERA PAGEREF _Toc48667460 \h 43. KRATAK OPIS RAZVOJNOG OKRU?ENJA PAGEREF _Toc48667461 \h 53.1. Microsoft Visual Studio 2019 PAGEREF _Toc48667462 \h 53.1.1. Namena alata PAGEREF _Toc48667463 \h 53.1.2. Izgled ekrana alata PAGEREF _Toc48667464 \h 53.1.3. Opis na?ina kori??enja PAGEREF _Toc48667465 \h 63.2. Microsoft SQL Server Management Studio 18 PAGEREF _Toc48667466 \h 93.2.1. Namena alata PAGEREF _Toc48667467 \h 93.2.2. Izgled ekrana alata PAGEREF _Toc48667468 \h 93.2.3. Opis na?ina kori??enja PAGEREF _Toc48667469 \h 104. Korisni?ko upustvo razvijene aplikacije PAGEREF _Toc48667470 \h 114.1. Namena aplikacije i osnovne funkcije PAGEREF _Toc48667471 \h 114.2. Ekrani i na?in kori??enja PAGEREF _Toc48667472 \h 115. Klju?ni elementi implementacije PAGEREF _Toc48667473 \h 145.1. SQL Script PAGEREF _Toc48667474 \h 145.2. Klju?ni delovi programskog koda sa obja?njenjem PAGEREF _Toc48667475 \h 156. Gre?ke programskog koda PAGEREF _Toc48667476 \h 166.1. Segmenti programskog koda sa gre?kama i korekcija PAGEREF _Toc48667477 \h 176.2. Pravila i EBNF prikaz gramati?ki ispravnog programskog koda PAGEREF _Toc48667478 \h 197. Prikaz primene alata u detektovanju gre?aka PAGEREF _Toc48667479 \h 207.1. Ekranski prikaz izve?taja kompajlera nad neispravnim kodom i nakon popravke PAGEREF _Toc48667480 \h 207.2. Ekranski prikaz reakcije na run-time gre?ke PAGEREF _Toc48667481 \h 217.2.1. Prvi primer run-time gre?ke PAGEREF _Toc48667482 \h 217.2.2. Drugi primer run-time gre?ke PAGEREF _Toc48667483 \h 228. Zaklju?ak PAGEREF _Toc48667484 \h 239. Literatura PAGEREF _Toc48667485 \h 2410. Listing PAGEREF _Toc48667486 \h 2510.1. Listing korisni?kog interfejsa PAGEREF _Toc48667487 \h 2510.2. Listing biblioteke KlasePodataka PAGEREF _Toc48667488 \h 2810.3. Listing biblioteke SQLDBUtils PAGEREF _Toc48667489 \h 331. ZADATAKKreirati desktop aplikaciju C# sa primenom gotove biblioteke SQL DB Utils. Kreirati biblioteku KlasePodataka koja radi sa podacima iz baze podataka i primenjuje SQLDBUtils (rad sa jednom tabelom iz baze podataka).?Kreirati u kodu namerne gre?ke 4 tipa – leksi?ku, sintaksnu, semanti?ku i run-time. Pustiti kompajler da detektuje gre?ke i?prikazati izve?taj koji daje u vezi gre?aka i prikaz ispravnog rada.2. OPIS POSLOVNOG KONTEKSTA REALIZOVANOG PRIMERAU ovom seminarskom radu opisana je desktop aplikacija za evidenciju knjiga u knji?ari. Aplikacija omogu?ava unos podataka za nove knjige, kao i prikaz ve? postoje?ih knjiga u knji?ari. Za svaku knjigu su dati slede?i podaci: naziv knjige, autor, izdava?, koli?ina, cena, uzrast za koji je knjiga namenjena kao i ?arn, kao i datum unosa evidencije. Tako?e, omogu?eno i pretra?ivanje pomo?u filtera. Postoji mogu?nost i eksport podataka u XML formatu.3. KRATAK OPIS RAZVOJNOG OKRU?ENJA3.1. Microsoft Visual Studio 20193.1.1. Namena alataMicrosoft Visual Studio 2019 je Majkrosoftovo integrisano razvojno okru?enje (IDE- Integrated development enviroment). Koristi se za razvoj kompjuterskih programa, sajtova, veb sajtova, veb aplikacija kao i mobilnih aplikacija. Visual Studio koristi razli?ite platforme za kreiranje projekata, poput Windows Forms Application i Class Library. Podr?ava 36 rali?itih programskih jezika. Visual Studio uklju?uje debugger koji radi i kao ispravlja? gre?aka na nivou izvora i kao ispravlja? na nivou ma?ine.3.1.2. Izgled ekrana alataSlika 1. Izgled alata Microsoft Visual Studio 2019 nakon u?itavanja projekta desktop aplikacijeNa slici 1.prikazan je zavr?ni izgled aplikacije u razvojnom okru?enju Microsoft Visual Studio 2019. Sa leve strane nalazi se ToolBox, koji omogu?ava lak?e postavljanje grafi?kih kontrola (dugmad, labele, textbox, itd). Sa desne strane se nalazi Solution Explorer, koji daje pregled fajlova uklju?enih u ovaj projekat. Preko Solution Explorer ->References uklju?ujemo na?e biblioteke klasa, KlasePodataka i SQLDBUtils.Zatim ispod Solution Explorer-a nalazi se prozor Properties, gde se pode?avaju karakteristike (pozicija, naziv, tekst koji se prikazuje, itd) vezane za grafi?ke kontrole.3.1.3. Opis na?ina kori??enjaKada otvorimo alat u kojem pravimo na?u aplikaciju, izgled ekrana je slede?i (Slika 2.):Slika 2. Kreiranje novog projekta u alatu Microsoft Visual Studio 2019Kada se pritisne na kreiranje novog projekta, dobija se slede?i prozor u kojem se pomo?u filtera bira programski jezik, platforma, kao i koju vrstu aplikacije ?elimo da pravimo. U na?em slu?aju biramo programski jezik C#, platforma je Windows, aplikacija je Desktop. Zatim nam program da koje sve vrste aplikacija mo?emo praviti, biramo Windows Forms App (.NET Framework), prikazano na slici 3.Slika 3. Kreiranje Windows Forms App (.NET Framework)Kao poslednji korak pri kreiranju projekta, jeste davanje naziva projektu i njegovu lokaciju gde ?e biti sa?uvan na na?em ra?uanru (Slika 4.).Slika 4. Dodavanje naziva i lokaciju projektaNakon pritiska na dugme Create, dobijamo grafi?ki dizajn korisni?kog interfejsa, a zatim u programskom kodu dodajemo odre?ene akcije. Kada se kreira grafi?ki dizajn korisni?kog interfejsa, treba kodirati funkcionalnosti vezane za na?u aplikaciju. Te funkcionalnosti mo?emo dobiti na dva na?ina:Na?in – Preko prozora Properties, pritiskom na ?munju“, mogu se dodeliti doga?aji koje ?elimo za odre?enu alatku. (npr.za dugme ?elim doga?aju ?klik“).Slika 5.Slika 5. Opcija za dodelu doga?aja grafi?kom objektuNa?in – da se pozicioniramo na odre?eni alat kojem ?elimo da dodelimo neki doga?aj i da kliknemo dva puta na njega. Ovo je kra?i put ako ?elimo da nam doga?aj bude ?klik“.Po?to na? projekat zahteva biblioteke klasa, da bi se one kreirale biramo poseban projekat Class Library. Pri otavranju tog projekta dobijamo klasu, koju sami modifikujemo u odnosu na na?e potrebe. Ako ?elimo jo? klasa u datom projektu, biramo opciju Project -> Add class... (ili pre?icom preko tastature, Shift+Alt+C).Da bi koristili funkcionalnosti tih klasa, moramo da ih priklju?imo na?oj aplikaciji. Pored standardnih biblioteka koje na?a aplikacija automatski koristi, mi biramo i na?e biblioteke koje smo napravili. Te biblioteke su KlasaPodataka i SQLDBUtils. Dodaju se preko References, koji se nalazi u Solution Explorer-u. Desni klik na References -> Add references, ili Project -> Add references. Biramo .dll fajlove. Kada smo uspe?no dodali u references, moramo ga napomenuti i u kodu, ta?nije u USING delu koda, da bi nam program prepoznao biblioteku (slika 6.)Slika 6. Dodavanje biblioteke klasa KlasePodataka u aplikacijuBiblioteku klasa SQLDBUtils dodajemo kao referencu (biblioteku) u projekat u kom se nalaza KlasePodataka, u njima se nalaze metode potrebne za konekciju sa bazom, ?itanje iz baze, a?uriranje baze itd. Dok biblioteku KlasePodataka dodajemo kao referencu (biblioteku) u samoj aplikaciji.3.2. Microsoft SQL Server Management Studio 183.2.1. Namena alata SQL Server Management Studio (SSMS) je softverska aplikacija koja se koristi za konfigurisanje, upravljanje i administraciju svih komponenti u Microsoft SQL Serveru. Alat uklju?uje ure?iva?e skripti i grafi?ke alate koji rade sa objektima i komponentama servera.3.2.2. Izgled ekrana alataSlika 7. Izgled ekrana alata Microsoft SQL Server Management Studio 17Na sliki 7. mo?emo videti izgled tabele Knjiga, iz baze podataka Knji?ara, na slici se vidi kolone u datoj tabeli u sredini ekrana. Sa leve strane gore tekst predstavlja ime servera koji je potreban za konekciju na?e aplikacije sa bazom podataka. Tako?e sa leve strane se vidi baza podataka Knji?ara i tabela Knjiga.3.2.3. Opis na?ina kori??enjaSlika 8. Po?etni ekran pokretanja Microsoft SQL Server Management Studio 17Pri pokretanju Microsoft SQL Server Management Studio-a dobija se prozor prikazan na slici 8. Pre kreiranja baze prvo se moramo konektovati na server, ukoliko je naziv servera dobar, konekcija ?e biti uspe?na.Zatim, kada se uspe?no konektujemo, pozicioniramo se na na? naziv servera i kliknemo na New Query, dobi?emo prazno polje prikazan na slici 9.Jedan od na?ina pravljenja baze podataka je kucanje koda, koriste?i sintaksu SQL jezika. Pisani kod pri kreiranju baze Knji?ara dat je na slici 10. Kada je kod napisan pravilno klikne se na Execute, i ako takva baza ne postoji, baza podataka ?e biti uspe?no napravljena (kao ?to se mo?e videti na slici 7.).Slika 9. Postupak pravljenja baze podatakaSlika 10. Kod za pravljenje baze podataka4. Korisni?ko upustvo razvijene aplikacije4.1. Namena aplikacije i osnovne funkcijeOsnovna namena desktop aplikacije je evidencija knjiga u knji?ari.Osnovne funkcije:Tabelarni prikaz svih knjiga u knji?ariUnos novih knjigaFiltriranje podatakaOdustajanje od unosa novih knjigaEksport trenutnih podataka koji se nalaze u bazi podataka (u vidu .xml fajla)4.2. Ekrani i na?in kori??enjaKada se pokrene aplikacija dobija se izgled sli?an kao u dizajneru, prazan i bez podataka. Kada izaberemo opciju PRIKAZI SVE EVIDENCIJE, koji se nalazi ispod prozora predvi?enog za tabelarni prikaz podataka, dobijamo ekran prikazan na slici 11.Slika 11. Prikaz podataka nakon izabrane opcije PRIKAZI SVE EVIDENCIJEZatim kada popunimo sve podatke koji se tra?e, dobijamo slede?i ekran, prikazan na slici 12.Slika 12. Ekran nakon popunjenih podatakaKada se posle popunjavanja klikne na opciju SNIMI, dobija se poruka o snimanju podataka, i ti podaci se ubacuju u tabelu, slika 13.Slika 13. Ekran nakon pritiska na opciju SNIMIIzgled ekrana nakon poruke o snimanju, slika 14. Kao ?to se vidi na slici, podaci su uspe?no dodati u bazu i prikazani u tabeli.Slika 14. Ekran nakon uspe?no snimljenih podataka i njihov prikaz u tabeliI na kraju, prikaz ekrana nakon opcije Eksport u XML, slika 15.Slika 15. Ekran nakon opcije Ekspport u XML, sa porukom o uspe?nosti5. Klju?ni elementi implementacije5.1. SQL Script5.2. Klju?ni delovi programskog koda sa obja?njenjemUklju?ivanje biblioteke klasa:using KlasePodataka;Po?etni doga?aj koji se automatski izvr?ava na po?etku (slika 16.).Slika 16. Pokretanje doga?ajaKao ?to je dato na slici 16. napravljeni su objekti datih klasa, i ovo se prvo izvr?ava, kada se pokrene kod.Preuzimanje podataka sa korisni?kog interfejsa:Slika 17. Preuzimanje podataka unetih preko tastatureSnimanje podataka:Slika 18. Snimanje unetih podatakaTabelarni prikaz:Slika 19. Kod za tabelrani prikaz podatakaEksport podataka:Da bi ovo bilo mogu?e neophodno je da dsEvindencija bude globalna promenljiva na nivou cele forme, da bi ?uvala vrednost izme?u raznih doga?aja (snimi, svi, filter, ...).Globalne promenljive su definisane na po?etku koda u korisni?kom interfejsu:Slika 20. Definicija globalnih promenljiviKod eksporta iz DataSet-a koji se puni na raznim daga?ajima:Slika 21. Eskport podataka6. Gre?ke programskog kodaPostoje tri glavne gre?ke koje kompajler mo?e detektovati, a to su:Sintaksa gre?kaLeksi?ka gre?kaSemati?ka gre?kaPostoji i takozvana run-time gre?ka, koju kompajler ne mo?e da detektuje, ali ona mo?e da se uvidi pri pokretanju koda, obi?no je to pogre?na putanja do baze, nepostoje?a tabela, ili kolona u tabeli i sli?no.6.1. Segmenti programskog koda sa gre?kama i korekcijaSINTAKSNE GRE?KENEISPRAVNOISPRAVNOOBJA?NJENJE GRE?KENedostaje ;Kada se poziva metoda, mora imati ’()’.LEKSI?KE GRE?KENEISPRAVNOISPRAVNOOBJA?NJENJE GRE?KENije dobro napisan tip podatkaVarijabla txtZar ne postoji, gre?ka pri kucanju.SEMATI?KE GRE?KENEISPRAVNOISPRAVNOOBJA?NJENJE GRE?KEPromenljiva txbZarn je tipa string, ne mo?e da prima tip int.U pitanju je kori??enje promenljive koja nije inicijalizovana. RUN-TIME GRE?KEDa bi videli run-time gre?ke, treba uneti pogre?ne podatke unutar koda korisni?kog interfejsa. Kompajler se ne?e buniti, jer je sve dobro napisano i nema gore navedenih gre?aka, ali kod ?e “pu?i” kada poku?amo da unesemo pogre?an put do baze podataka ili kada poku?amo da upi?emo u tabelu koja se ne nalazi u datoj bazi podataka. Na slede?im primerima prikazan je ispravan i neispravan kod. NEISPRAVNOISPRAVNOU prograsmkom kodu biblioteke klasa, KlasaPodataka, u klasi clsEvidencijaDB postavljena je fiksna putanja za konekciju sa bazom. Promenljiva objSqlTabela predstavlja objekat koji se instancira pomo?u konstruktora koji prima dva parametara, konekciju ka bazi podataka, kao prvi parametar, i kao drugi naziv tabele u datoj bazi.Da bi napravili run-time gre?ku, da?emo naziv tabele pogre?an.NEISPRAVNOISPRAVNO6.2. Pravila i EBNF prikaz gramati?ki ispravnog programskog kodaPRAVILO: Evidencija uvek ima ; na kraju.EBNF:<naredba>::=<telo_naredbe>”;”PRAVILO: Procedura ima zagrade.EBNF:<procedura>::=<modifikator_pristupa><tip<naziv_procedure>”(“[<parameter>]”)”PRAVILO: String promenljiva uvek dobija string vrednost.EBNF:<string_promenljiva>::=” “ ”<vrednost_promenljive>” “ ”7. Prikaz primene alata u detektovanju gre?aka7.1. Ekranski prikaz izve?taja kompajlera nad neispravnim kodom i nakon popravkePrilikom pokretanja Build opcije iz Menu-a (Build -> Build Solution), dobijamo izve?taj kompajlera u okviru Error Liste, kao ?to je prikazano na slici 22.Slika 22. Error lista pri pokretanju Build opcijeError lista pored detaljnog opisa gre?ke daje nam ta?no mesto gde se gre?ka pojavila, zna?i ta?an naziv projekta, fajl u kome se javila i liniju koda. Time nam olak?ava njeno tra?enje, a samim tim i njeno otklanjanje.Postoji i jo? jedan na?in za pronalazak gre?ke u kodu, a to je, da prilikom gre?ke, kod ?e biti podvu?en drugom bojom kako bi bio vidljiv da se tu nalazi gre?ka. I ako s pre?e mi?em preko te gre?ke, sam program nam nudi potencijalne ispravke. Pore toga, dobijamo detaljan opis gre?ke (slika 23.).Slika 23. Drugi na?in za detektovanje gre?ke u koduNakon popravki gre?aka, dobijamo Izve?taj: Error = 0, Build succeeded.Slika 24. Izgled ekrana nakon ispravljanja gre?ki7.2. Ekranski prikaz reakcije na run-time gre?ke7.2.1. Prvi primer run-time gre?keSlika 25. Prikaz prozora za prvu run-time gre?kuGre?ka se nalazi u SQL upitu. Umesto re?i frm treba da stoji form.NEISPRAVNOISPRAVNO 7.2.2. Drugi primer run-time gre?keSlika 26. Prikaz ekrana posle druge run-time gre?keDruga run-time gre?ka predstavlja, NullReferenceException, koja zna?i da poku?avamo da pristupimo ?lanu ?ija je vrednost jednaka nuli. To se de?ava kada ne damo referentni tip, odnosno promenljive su deklarisane ali nisu instancirane.8. Zaklju?akCilj ovog seminarskog rada je da predstavi izradu aplikacije u Microsoft Visual Studio 2019 .NET framework, kao i povezivanje aplikacije sa bazom podataka, a alat kori??en za izradu baze je Microsoft SQL Server. Poseban akcenat ovog seminarskog rada je na objektnom- orijentisanom programiranju. Rad je ra?en iz predmeta Programski prevodioci, i kao takav sadr?i gre?ke koje nam prijavljuje kompajler (prevodilac), pored gre?aka, u radu je prikazano i njihovo otklanjanje. Na kraju, aplikacija je funkcionalna i bez gre?aka.Postoji mogu?nost dorade same aplikacije, kao na primer, dodavanje opcija za izmenu i brisanje podataka koji se unose u aplikaciju. Jo? jedna od mogu?nosti jeste i omogu?avanje da se pre prikazivanja glavnog prozora, omogu?i prijavljivanje korisnika, zavisno od toga da li je radnik u knji?ari ili kupac koji ?eli da kupi (naru?i) knjigu. Ovo su samo neki od na?ina pobolj?anja date aplikacije.9. Literatura [1] [2] [3] [4] . Listing10.1. Listing korisni?kog interfejsausing System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;//using KlasePodataka;namespace DesktopApp_KorisnickiInterfejs{ public partial class frmEvidencija : Form { // atributi private clsEvidencija objEvidencija; private clsEvidencijaLista objEvidencijaLista; private clsEvidencijaDB objEvidencijaDB; private DataSet dsEvidencija; // METODE // konstruktor public frmEvidencija() { InitializeComponent(); } // nase metode private void NapuniGrid(DataSet dsPodaciZaGrid) { dgvSpisakKnjiga.DataSource = dsPodaciZaGrid.Tables[0]; dgvSpisakKnjiga.Refresh(); } private void IsprazniKontrole() { txbNazivKnjige.Text = ""; txbAutorKnjige.Text= ""; txbIzdavac.Text = ""; txbKolicina.Text= ""; txbCena.Text = ""; txbUzrast.Text = ""; txbZarn.Text = ""; } // dogadjaji private void frmEvidencija_Load(object sender, EventArgs e) { // inicijalizacija globalnih promenljivih na nivou stranice dsEvidencija = new DataSet(); objEvidencija = new clsEvidencija(); objEvidencijaLista = new clsEvidencijaLista(); objEvidencijaDB = new clsEvidencijaDB("MILJANA\\SQLEXPRESS", "Knjizara"); } private void btnSvi_Click(object sender, EventArgs e) { txbFilterNazivKnjige.Text = ""; dsEvidencija = objEvidencijaDB.DajSveEvidencije(); NapuniGrid(dsEvidencija); } private void btnFilter_Click(object sender, EventArgs e) { if (txbFilterNazivKnjige.Text.Equals("")) { MessageBox.Show("Niste uneli kriterijum filtriranja!"); txbFilterNazivKnjige.Focus(); return; } else { dsEvidencija = objEvidencijaDB.DajEvidencijuPremaNazivu(txbFilterNazivKnjige.Text); NapuniGrid(dsEvidencija); } } private void btnSnimi_Click(object sender, EventArgs e) { // 1. provera popunjenosti if (txbNazivKnjige.Text.Equals("")) { MessageBox.Show("Niste uneli naziv knjige!"); txbNazivKnjige.Focus(); return; } if (txbAutorKnjige.Text.Equals("")) { MessageBox.Show("Niste uneli autora!"); txbAutorKnjige.Focus(); return; } if (txbIzdavac.Text.Equals("")) { MessageBox.Show("Niste uneli izdavaca!"); txbIzdavac.Focus(); return; } if (txbKolicina.Text.Equals("izaberite")) { MessageBox.Show("Niste uneli kolicinu!"); txbKolicina.Focus(); return; } if (txbCena.Text.Equals("")) { MessageBox.Show("Niste uneli cenu!"); txbCena.Focus(); return; } if (txbUzrast.Text.Equals("")) { MessageBox.Show("Niste uneli uzrast!"); txbUzrast.Focus(); return; } if (txbZarn.Text.Equals("")) { MessageBox.Show("Niste uneli zarn!"); txbZarn.Focus(); return; } // 2.preuzimanje podataka sa KI objEvidencija.NazivKnjige = txbNazivKnjige.Text; objEvidencija.AutorKnjige = txbAutorKnjige.Text; objEvidencija.IzdavacKnjige = txbIzdavac.Text; objEvidencija.Kolicina = int.Parse(txbKolicina.Text); objEvidencija.Cena = int.Parse(txbCena.Text); objEvidencija.Uzrast = txbUzrast.Text; objEvidencija.Zarn = txbZarn.Text; objEvidencija.DatumEvidencije = dtpDatumEvidencije.Value; //3. izvrsavanje snimanja bool uspeh = false; string porukaGreske = ""; objEvidencijaDB.SnimiNovuEvidenciju(objEvidencija, out uspeh, out porukaGreske); // 4. poruka uspesnosti i ostale aktivnosti if (uspeh) { MessageBox.Show("USPESNO SNIMLJENI PODACI!"); dsEvidencija = objEvidencijaDB.DajSveEvidencije(); NapuniGrid(dsEvidencija); IsprazniKontrole(); } else { MessageBox.Show("Greska snimanja novog zapisa:" + porukaGreske); } } private void cmbZarn_SelectedIndexChanged(object sender, EventArgs e) { txbZarn.Text = cmbZarn.SelectedItem.ToString(); } private void cmbUzrast_SelectedIndexChanged(object sender, EventArgs e) { txbUzrast.Text = cmbUzrast.SelectedItem.ToString(); } private void btnOdustani_Click(object sender, EventArgs e) { IsprazniKontrole(); } private void btnExportXML_Click(object sender, EventArgs e) { dsEvidencija.WriteXml("SpisakEvidencije.XML"); MessageBox.Show("Uspesno snimljen spisak evidencije u XML!"); } }}10.2. Listing biblioteke KlasePodatakaclsEvidencijausing System;using System.Collections.Generic;using System.Linq;using System.Text;namespace KlasePodataka{ public class clsEvidencija { // atributi private string _NazivKnjige; private string _AutorKnjige; private string _IzdavacKnjige; private int _Kolicina; private int _Cena; private string _Uzrast; private string _Zarn; private DateTime _DatumEvidencije; // konstruktor public clsEvidencija() { // inicijalizacija atributa _NazivKnjige = ""; _AutorKnjige = ""; _IzdavacKnjige = ""; _Kolicina = 0; _Cena = 0; _Uzrast = ""; _Zarn = ""; _DatumEvidencije = DateTime.Now; } // public public string NazivKnjige { get { return _NazivKnjige; } set { _NazivKnjige = value; } } public string AutorKnjige { get { return _AutorKnjige; } set { _AutorKnjige = value; } } public string IzdavacKnjige { get { return _IzdavacKnjige; } set { _IzdavacKnjige = value; } } public int Kolicina { get { return _Kolicina; } set { _Kolicina = value; } } public int Cena { get { return _Cena; } set { _Cena = value; } } public string Uzrast { get { return _Uzrast; } set { _Uzrast = value; } } public string Zarn { get { return _Zarn; } set { _Zarn = value; } } public DateTime DatumEvidencije { get { return _DatumEvidencije; } set { _DatumEvidencije = value; } } }}clsEvidencijaListausing System;using System.Collections.Generic;using System.Linq;using System.Text;namespace KlasePodataka{ public class clsEvidencijaLista { // atributi private List<clsEvidencija> pListaEvidencija; // property public List<clsEvidencija> ListaEvidencija { get { return pListaEvidencija; } set { if (this.pListaEvidencija != value) this.pListaEvidencija = value; } } // konstruktor public clsEvidencijaLista() { pListaEvidencija = new List<clsEvidencija>(); } // privatne metode // javne metode public void DodajElementListe(clsEvidencija objNovaKnjiga) { pListaEvidencija.Add(objNovaKnjiga); } public void ObrisiElementListe(clsEvidencija objKnjigaZaBrisanje) { pListaEvidencija.Remove(objKnjigaZaBrisanje); } public void ObrisiElementNaPoziciji(int pozicija) { pListaEvidencija.RemoveAt(pozicija); } public void IzmeniElementListe(clsEvidencija objStaraKnjiga, clsEvidencija objNovaKnjiga) { int indexStareKnjige = 0; indexStareKnjige = pListaEvidencija.IndexOf(objNovaKnjiga); pListaEvidencija.RemoveAt(indexStareKnjige); pListaEvidencija.Insert(indexStareKnjige, objNovaKnjiga); } }}clsEvidencijaDBusing System;using System.Collections.Generic;using System.Linq;using System.Text;//using SqlDBUtils;using System.Data;namespace KlasePodataka{ public class clsEvidencijaDB { // atributi private clsSqlKonekcija objSqlKonekcija; private clsSqlTabela objSqlTabela; private DataSet dsEvidencija; // konstruktor public clsEvidencijaDB(string MSSQLInstanca, string NazivBazePodataka) { objSqlKonekcija = new clsSqlKonekcija(MSSQLInstanca, "", NazivBazePodataka); objSqlKonekcija.OtvoriKonekciju(); objSqlTabela = new clsSqlTabela(objSqlKonekcija, "Knjiga"); dsEvidencija = new DataSet(); } // javne metode public DataSet DajSveEvidencije() { dsEvidencija = objSqlTabela.DajPodatke("Select * from Knjiga"); return dsEvidencija; } public DataSet DajEvidencijuPremaNazivu(string knjigaFilter) { dsEvidencija = objSqlTabela.DajPodatke("Select * from Knjiga where Naziv ='" + knjigaFilter + "'"); return dsEvidencija; } public void SnimiNovuEvidenciju(clsEvidencija objNovaEvidencija, out bool Uspeh, out string tekstGreske) { // 1. transformacija ulazne vrednosti string strDatumEvidencije= objNovaEvidencija.DatumEvidencije.Month.ToString() + "/" + objNovaEvidencija.DatumEvidencije.Day.ToString() + "/" + objNovaEvidencija.DatumEvidencije.Year.ToString(); // 2. priprema SQL upita tipa insert string sqlInsertUpit = "INSERT INTO Knjiga VALUES('" + objNovaEvidencija.NazivKnjige + "','" + objNovaEvidencija.AutorKnjige + "', '" + objNovaEvidencija.IzdavacKnjige + "', " + objNovaEvidencija.Kolicina + "," + objNovaEvidencija.Cena + ", '" + objNovaEvidencija.Uzrast + "', '" + objNovaEvidencija.Zarn + "','" + strDatumEvidencije + "')"; // 3. izvrsavanje SQL upita tipa insert try { Uspeh = objSqlTabela.IzvrsiAzuriranje(sqlInsertUpit); tekstGreske=""; } catch (Exception greska) { Uspeh = false; tekstGreske = greska.Message; } } }}10.3. Listing biblioteke SQLDBUtilsclsSqlKonekcijausing System;using System.Collections.Generic;using System.Linq;using System.Text;//using System.Data.SqlClient; namespace SqlDBUtils{ public class clsSqlKonekcija { #region Atributi private SqlConnection pKonekcija; // private string pPutanjaSQLBaze; private string pNazivBaze; private string pNazivSQL_DBMSinstance; private string pStringKonekcije; #endregion #region Konstruktor public clsSqlKonekcija(string nazivSQL_DBMSInstance, string putanjaSqlBaze, string NazivBaze) { // preuzimanje vrednosti u privatne atribute pPutanjaSQLBaze = putanjaSqlBaze; pNazivBaze = NazivBaze; pNazivSQL_DBMSinstance = nazivSQL_DBMSInstance; pStringKonekcije = ""; pStringKonekcije = FormirajStringKonekcije(); } // preklapajuci konstruktor, kada dobijemo spolja string konekcije public clsSqlKonekcija(string noviStringKonekcije) { pStringKonekcije = noviStringKonekcije; } // preklapajuci konstruktor, bez stringa konekcije public clsSqlKonekcija() { } #endregion #region Privatne metode private string FormirajStringKonekcije() { string mStringKonekcije=""; if (pPutanjaSQLBaze.Length.Equals(0) || pPutanjaSQLBaze == null) { mStringKonekcije = "Data Source=" + pNazivSQL_DBMSinstance + " ;Initial Catalog=" + pNazivBaze + ";Integrated Security=True"; } else { mStringKonekcije = "Data Source=.\\" + pNazivSQL_DBMSinstance + ";AttachDbFilename=" + pPutanjaSQLBaze + "\\" + pNazivBaze + ";Integrated Security=True;Connect Timeout=30;User Instance=True"; } return mStringKonekcije; } #endregion #region Javne metode public string StringKonekcije { get { return pStringKonekcije; } set { pStringKonekcije = value; } } public bool OtvoriKonekciju() { bool uspeh; pKonekcija = new SqlConnection(); pKonekcija.ConnectionString = pStringKonekcije; try { pKonekcija.Open(); uspeh = true; } catch { uspeh = false; } return uspeh; } public SqlConnection DajKonekciju() { return pKonekcija; } public string DajStringKonekcije() { return pStringKonekcije; } public void ZatvoriKonekciju() { pPutanjaSQLBaze = ""; pKonekcija.Close(); pKonekcija.Dispose(); } #endregion }}clsSqlTabelausing System;using System.Collections.Generic;using System.Linq;using System.Text;//using System.Data.SqlClient; namespace SqlDBUtils{ public class clsSqlTabela { #region Atributi private string pNazivTabele; private clsSqlKonekcija pKonekcija; private SqlDataAdapter pAdapter; private System.Data.DataSet pDataSet; #endregion #region Konstruktor public clsSqlTabela(clsSqlKonekcija Konekcija, string NazivTabele) { pKonekcija = Konekcija; pNazivTabele = NazivTabele; } #endregion #region Privatne metode private void KreirajAdapter(string SelectUpit, string InsertUpit, string DeleteUpit, string UpdateUpit) { SqlCommand mSelectKomanda, mInsertKomanda, mDeleteKomanda, mUpdateKomanda; mSelectKomanda = new SqlCommand(); mandText = SelectUpit; mSelectKomanda.Connection = pKonekcija.DajKonekciju(); mInsertKomanda = new SqlCommand(); mandText = InsertUpit; mInsertKomanda.Connection = pKonekcija.DajKonekciju(); mDeleteKomanda = new SqlCommand(); mandText = DeleteUpit; mDeleteKomanda.Connection = pKonekcija.DajKonekciju(); mUpdateKomanda = new SqlCommand(); mandText = UpdateUpit; mUpdateKomanda.Connection = pKonekcija.DajKonekciju(); pAdapter = new SqlDataAdapter(); pAdapter.SelectCommand = mSelectKomanda; pAdapter.InsertCommand = mInsertKomanda; pAdapter.UpdateCommand = mUpdateKomanda; pAdapter.DeleteCommand = mDeleteKomanda; } private void KreirajDataset() { pDataSet = new System.Data.DataSet(); pAdapter.Fill(pDataSet, pNazivTabele); } private System.Data.DataTable KreirajDataTable(System.Data.DataSet noviDataSet) { return noviDataSet.Tables[0]; } private void ZatvoriAdapterDataset() { pAdapter.Dispose(); pDataSet.Dispose(); } #endregion #region Javne metode public System.Data.DataSet DajPodatke(string SelectUpit) // izdvaja podatke u odnosu na dat selectupit { KreirajAdapter(SelectUpit, "", "", ""); KreirajDataset(); return pDataSet; } public int DajBrojSlogova() { int BrojSlogova = pDataSet.Tables[0].Rows.Count; return BrojSlogova; } public bool IzvrsiAzuriranje(string Upit) // izvrzava azuriranje unos/brisanje/izmena u odnosu na dati i upit { // bool uspeh = false; SqlConnection mKonekcija; SqlCommand Komanda; SqlTransaction mTransakcija = null; try { mKonekcija = pKonekcija.DajKonekciju(); // aktivan kod // povezivanje Komanda = new SqlCommand(); Komanda.Connection = mKonekcija; Komanda = mKonekcija.CreateCommand(); // pokretanje mTransakcija = mKonekcija.BeginTransaction(); Komanda.Transaction = mTransakcija; mandText = Upit; Komanda.ExecuteNonQuery(); mit(); uspeh = true; } catch { mTransakcija.Rollback(); uspeh = false; } return uspeh; } // preklapajuca metoda kada dobijemo vise upita da se izvrsi u transakciji public bool IzvrsiAzuriranje(List<string> ListaUpita) // izvrzava azuriranje unos/brisanje/izmena { // bool uspeh = false; SqlConnection mKonekcija; SqlCommand Komanda; SqlTransaction mTransakcija = null; try { mKonekcija = pKonekcija.DajKonekciju(); // aktivan kod // povezivanje Komanda = new SqlCommand(); Komanda.Connection = mKonekcija; Komanda = mKonekcija.CreateCommand(); string Upit=""; mTransakcija = mKonekcija.BeginTransaction(); Komanda.Transaction = mTransakcija; for (int i = 0; i < ListaUpita.Count(); i++) { Upit = ListaUpita[i]; mandText = Upit; Komanda.ExecuteNonQuery(); } mit(); uspeh = true; } catch { mTransakcija.Rollback(); uspeh = false; } return uspeh; } #endregion }} ................
................
In order to avoid copyright disputes, this page is only a partial summary.
To fulfill the demand for quickly locating and searching documents.
It is intelligent file search solution for home and business.