U prethodnim odjeljcima, pogledali smo rad preuzimanja podataka iz unaprijed kreiranih tabela. Sada je vrijeme da shvatimo kako možemo kreirati/brisati tabele, dodati nove zapise i izbrisati stare. Za ove namjene u SQL Postoje operateri kao što su: CREATE- kreira tabelu, ALTER- menja strukturu tabele, DROP- briše tabelu ili polje, INSERT- dodaje podatke u tabelu. Počnimo se upoznavati sa ovom grupom operatora od operatora INSERT.
Kao što ime govori, operater INSERT koristi se za umetanje (dodavanje) redova u tabelu baze podataka. Dodavanje se može izvršiti na nekoliko načina:
Dakle, da bismo dodali novi red u tabelu, moramo da navedemo ime tabele, navedemo imena kolona i navedemo vrednost za svaku kolonu koristeći konstrukciju INSERT INTO table_name (polje1, polje2 ...) VRIJEDNOSTI (vrijednost1, vrijednost2...). Pogledajmo primjer.
INSERT INTO Sellers (ID, Adresa, Grad, Seller_name, Country) VRIJEDNOSTI("6", "1st Street", "Los Angeles", "Harry Monroe", "USA")
Također možete promijeniti redoslijed naziva kolona, ali u isto vrijeme morate promijeniti redoslijed vrijednosti u parametru VRIJEDNOSTI.
U prethodnom primjeru, kada koristite operator INSERT eksplicitno smo označili nazive kolona tabele. Koristeći ovu sintaksu, možemo preskočiti neke kolone. To znači da unosite vrijednosti za neke kolone, ali ih ne dajete za druge. na primjer:
INSERT INTO Sellers (ID, City, Seller_name) VRIJEDNOSTI("6", "Los Angeles", "Harry Monroe")
IN u ovom primjeru nismo naveli vrijednost za dvije kolone Adresa I Država. Neke kolone možete isključiti iz izjave INSERT INTO, ako to dozvoljava definiciju tabele. U ovom slučaju mora biti ispunjen jedan od uslova: ova kolona je definirana kao važeća NULL(odsustvo bilo koje vrijednosti) ili specificirana zadana vrijednost u definiciji tablice. To znači da ako nije navedena vrijednost, koristit će se zadana vrijednost. Ako vam nedostaje kolona iz tabele koja ne dozvoljava da se vrednosti pojavljuju u svojim redovima NULL i nema definiranu zadanu vrijednost, DBMS će generirati poruku o grešci i red neće biti dodan.
U prethodnim primjerima ubacili smo podatke u tabele, unoseći ih ručno u upit. Međutim, operater INSERT INTO omogućava nam da automatizujemo ovaj proces ako želimo da ubacimo podatke iz druge tabele. U tu svrhu u SQL-u postoji takva konstrukcija kao INSERT IN... SELECT .... Ovaj dizajn vam omogućava da istovremeno odaberete podatke iz jedne tabele i ubacite ih u drugu. Pretpostavimo da imamo još jedan sto Sellers_EU sa listom prodavaca naše robe u Evropi i moramo ih dodati u opštu tabelu Prodavci. Struktura ovih tabela je ista (isti broj kolona i ista imena), ali su podaci različiti. Da bismo to uradili, možemo napisati sljedeći upit:
INSERT INTO Sellers (ID, Adresa, Grad, Seller_name, Country) SELECTID, Adresa, Grad, Ime_prodavca, Država FROM Sellers_EU
Morate obratiti pažnju da se vrijednosti internih ključeva ne ponavljaju (polje ID), inače će doći do greške. Operater SELECT može uključivati i prijedloge GDJE za filtriranje podataka. Također treba napomenuti da DBMS ne obraća pažnju na nazive kolona sadržanih u naredbi SELECT, važan joj je samo redosled kojim su poređani. Dakle, podaci u prvoj navedenoj koloni koja je odabrana zbog SELECT, će se u svakom slučaju popuniti u prvoj koloni tabele Prodavci, naveden nakon operatora INSERT INTO, bez obzira na naziv polja.
Često kada radite sa bazama podataka, postoji potreba da se kreiraju kopije bilo koje tabele u svrhu pravljenja rezervne kopije ili modifikacije. Da biste napravili potpunu kopiju tablice, SQL daje poseban izraz SELECT INTO. Na primjer, trebamo napraviti kopiju tabele Prodavci, moraćete da napišete zahtev na sledeći način:
SELECT * INTO Sellers_new FROM Sellers
Za razliku od prethodnog dizajna INSERT IN... SELECT ... kada se dodaju podaci postojeća tabela, konstrukcija kopira podatke u novu tabelu. Takođe možete reći da prva konstrukcija uvozi podatke, a druga izvozi. Kada koristite dizajn ODABIR ... U ... IZ ... Treba uzeti u obzir sljedeće:
Opća sintaksa:
a) ubacivanje jednog nova linija do stola:
INSERT<таблица>[(kolone)]
VRIJEDNOSTI
b) Umetanje jednog ili više redova u tabelu preuzetu iz izvora navedenog u potupitu:
INSERT<таблица>[(kolone)]
pravila:
Broj elemenata u odjeljku "Kolone" mora odgovarati broju elemenata u odjeljku "Vrijednosti"; tipovi podataka moraju odgovarati ili dozvoliti implicitnu konverziju;
U slučaju da ne postoji odeljak „Kolone“, odeljak „Vrijednosti“ mora sadržavati isti broj vrijednosti kao i ukupan broj kolona u tabeli koja se uređuje, osim toga, vrijednosti moraju biti navedene u istom redosled kojim su kolone tabele deklarisane; Stoga se preporučuje da uvijek eksplicitno navedete listu kolona u koje će se dodati nove vrijednosti;
Kada se koristi sintaksa (b), SELECT potupit se može adresirati ili na istu tabelu, ili na drugu tabelu u bazi podataka, ili na drugu bazu podataka na serveru;
Ako je za određenu kolonu tabele specificirana zadana vrijednost, a želite da koristite upravo tu vrijednost u dodanom zapisu, tada u odjeljak “Vrijednosti” za ovu kolonu trebate napisati ključna riječ DEFAULT.
Primjeri :
INSERT INTO detail (detail_name)
VRIJEDNOSTI
INSERT INTO opskrba (supplier_id, supply_quantity, supply_cost,
nabavka_datum, detalj_id)
VRIJEDNOSTI (4, 177, 453.45, "25.09.2009", 1)
INSERT dobavljača (vrsta_dobavljača, ime_dobavljača)
VRIJEDNOSTI (ZADANO, "Smirnov S. S.")
Opća sintaksa:
UPDATE<таблица>
SET<столбец> = <значение> [, <столбец> = <значение>]
Primjeri :
SET težina = 210
SET material_name = "Kin"
WHERE material_id = 2
SET department_id = NULL,
isporuke_datum = datum_isporuke + 1 /*povećavamo datum isporuke za jedan dan
WHERE delivery_id = 1 OR department_id > 3
SET detail_name = detail_name + "!!!"
GDJE detail_name LIKE "_a%" I težina IZMEĐU 6 I 10
Opća sintaksa:
IZBRIŠI<таблица>
<условие>
Primjeri :
GDJE detail_id IN (2, 5, 8)
GDJE je težina NULL
vježba:
Popunite bazu podataka koristeći ManagementStudio.
Opća sintaksa odabira upita<список столбцов>
SELECT<таблица(-ы) источник>
OD
Primjeri implementacije upita
Najjednostavniji upiti:
1. Odaberite naziv i težinu dijelova
Rice. 5.1. Rezultati upita br. 1
2. Odaberite sve informacije iz tabele materijala
Rice. 5.2. Rezultati upita br. 2
Jedinstvenost DISTINCT
3. Izaberite jedinstvene kodove dobavljača iz tabele snabdevanja
Rice. 5.3. Rezultati upita br. 3
Ograničenje WHERE
Rice. 5.4. Rezultati upita br. 4
5. Odaberite imena dobavljača sa kodovima 1, 4 i 6
Rice. 5.5. Rezultati upita br. 5
6. Odaberite sve informacije o isporukama do 01.10.2009
Rice. 5.6. Rezultati upita br. 6
7. Odaberite sve informacije o dijelovima koji ne počinju slovom “B” (u svakom slučaju) i čija je težina manja od 50
Rice. 5.7. Rezultati upita br. 7
8. Odaberite naziv i šifru materijala za dijelove težine od 5 do 10 g ili koji imaju slovo “n” na trećem mjestu u nazivu
Rice. 5.8. Rezultati upita br. 8
9. Odaberite imena dobavljača ne duža od 15 znakova
Rice. 5.9. Rezultati upita br. 9
10. Odaberite mjesece i godine isporuke dijelova
Rice. 5.10. Rezultati upita br. 10
Sortiranje ORDER BY
11. Prvo sortirajte isporuke po šifri dobavljača, a zatim po datumu isporuke
Rice. 5.11. Rezultati upita br. 11
12. Odaberite nazive dobavljača sa šiframa 4, 6, 8, 9, poredane abecednim redom obrnutim redoslijedom
Rice. 5.12. Rezultati upita br. 12
Agregacija i grupisanje GROUP BY
Rice. 5.13. Rezultati upita br. 13
14. Odrediti prosječnu težinu dijelova od materijala sa šifrom 2
Rice. 5.14. Rezultati upita br. 2
15. Od isporuka izvršenih prije 1. oktobra 2009. godine odaberite najveću i najmanju isporuku
Rice. 5.15. Rezultati upita br. 15
16. Za dobavljače sa šiframa u rasponu od 5 - 8, izračunajte ukupan broj dijelova koje su oni isporučili
Rice. 5.16. Rezultati upita br. 16
Rice. 5.17. Rezultati upita br. 17
Ograničenja za IMATI grupe
18. Odaberite materijale za koje ukupna težina dijelova napravljenih od njih nije veća od 20
Rice. 5.18. Rezultati upita br. 18
19. Od isporuka u 2008. godini odaberite dijelove koji su isporučeni više puta
Rice. 5.19. Rezultati upita br. 19
Type ConversionCAST
20. Primite informacije o rokovima isporuke u tekstualnom obliku
Rice. 5.20. Rezultati upita br. 20
21. Dobijte informacije iz tabele dijelova u obliku redova “Dio X ima težinu Y”
Rice. 5.21. Rezultati upita br. 21
AlternativeCASE
22. Podijelite dijelove na lake (težine do 20), srednje (između 20 i 50) i teške
Rice. 5.22. Rezultati upita br. 22
Rukovanje NULL vrijednostima
23. Dobijte informacije o dijelovima i njihovim težinama, a ako težina dijela nije navedena, upišite -100 umjesto NULL
Rice. 5.23. Rezultati upita br. 23
Funkcija postojanja POSTOJI
24. Odaberite naziv i šifru materijala samo onih dijelova koji su ikada bili isporučeni
Rice. 5.24. Rezultati upita br. 24
25. Odaberite nazive onih materijala od kojih nije napravljen niti jedan dio
Rice. 5.25. Rezultati upita br. 25
Podupiti
26. Dobijte informacije o najnovijoj (po datumu) isporuci
Rice. 5.26. Rezultati upita br. 26
27. Primite sve isporuke delova od materijala šifra 2
Rice. 5.27. Rezultati upita br. 27
28. Za svakog dobavljača dobiti informacije o prvoj (po datumu) isporuke
Rice. 5.28. Rezultati upita br. 28
29. Za svakog dobavljača navedite njegovo ime i datum posljednje narudžbe
Rice. 5.29. Rezultati upita br. 29
Spajanje tablica sa JOIN
30. Dobiti tabelu obrasca: naziv dijela, naziv materijala od kojeg je ovaj dio napravljen
Rice. 5.30. Rezultati upita br. 30
31. Nabavite tabelu kao što je: dobavljač, naziv dijela, količina i datum isporuke za dijelove koji imaju određenu težinu
Rice. 5.31. Rezultati upita br. 31
32. Odaberite sve informacije o onim dijelovima koji su ikada bili isporučeni
Rice. 5.32. Rezultati upita br. 32
Rice. 5.33. Rezultati upita br. 33
34. Odaberite nazive materijala i dijelova napravljenih od njih
Rice. 5.34. Rezultati upita br. 34
35. Dobijte sve podatke o dobavljačima, zalihama i dijelovima
Rice. 5.35. Rezultati upita br. 35
Spajanje UNION tabela
36. Nabavite tabelu naziva i težine delova, a poslednji red tabele treba da sadrži zbrojeve u obliku ukupne težine svih delova
Rice. 5.36. Rezultati upita br. 36
37. Dobijte tabelu od dva polja, gdje je prvo polje naziv dijela, materijala, dobavljača ili datum isporuke, a drugo polje je dužina reda iz prvog polja
Rice. 5.37. Rezultati upita br. 37
SQL INSERT INTO i INSERT SELECT izrazi se koriste za umetanje novih redova u tablicu. Postoje dva načina korištenja instrukcija:
sintaksa:
INSERT INTO table_name VRIJEDNOSTI (vrijednost1, vrijednost2, vrijednost3,...); table_name: ime tabele. vrijednost1, vrijednost2,.. : vrijednosti prve kolone, druge kolone,... za novi zapis
sintaksa:
INSERT INTO table_name (kolona1, kolona2, kolona3,..) VRIJEDNOSTI (vrijednost1, vrijednost2, vrijednost3,...); table_name: ime tabele. stupac1: naziv prve kolone, druge kolone... vrijednost1, vrijednost2,.. : vrijednosti prve kolone, druge kolone,... za novi zapis
Zahtjevi:
Metoda 1 ( ubacivanje samo vrijednosti):
UMETNI U VRIJEDNOSTI učenika ("5","HARSH","WEST BENGAL","8759770477","19");
Rezultat :
Nakon upotrebe INSERT INTO SELECT, tabela učenika će sada izgledati ovako:
ROLL_NO | NAME | ADRESA | TELEFON | Starost |
1 | Ram | Delhi | 9455123451 | 18 |
2 | RAMESH | GURGAON | 9562431543 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
4 | SURESH | Delhi | 9156768971 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
2 | RAMESH | GURGAON | 9562431543 | 18 |
5 | HARSH | WEST BENGAL | 8759770477 | 19 |
Metoda 2 ( umetanje vrijednosti samo u određene kolone):
INSERT INTO Student (ROLL_NO, NAME, Age) VRIJEDNOSTI ("5","PRATIK","19");
Rezultat :
Studentska tabela će sada izgledati ovako:
ROLL_NO | NAME | ADRESA | TELEFON | Starost |
1 | Ram | Delhi | 9455123451 | 18 |
2 | RAMESH | GURGAON | 9562431543 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
4 | SURESH | Delhi | 9156768971 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
2 | RAMESH | GURGAON | 9562431543 | 18 |
5 | PRATIK | null | null | 19 |
Imajte na umu da su kolone za koje nisu navedene vrijednosti postavljene na null.
Možete koristiti MySQL INSERT SELECT izraz da kopirate redove iz jedne tabele i umetnete ih u drugu.
Korištenje ove izjave je slično korištenju INSERT INTO. Razlika je u tome što se izraz SELECT koristi za odabir podataka iz druge tablice. Ispod su razne načine koristeći INSERT INTO SELECT :
sintaksa:
INSERT INTO first_table SELECT * FROM second_table; first_table: ime prve tablice. second_table: ime druge tabele.
Koristili smo naredbu SELECT za kopiranje podataka iz jedne tablice i naredbu INSERT INTO da bismo ih umetnuli u drugu.
sintaksa:
INSERT INTO first_table(column_names1) SELECT column_names2 FROM second_table; first_table: ime prve tablice. second_table: ime druge tabele. col_names1: nazivi stupaca odvojeni zarezom(,) za tablicu 1. col_names2: nazivi stupaca odvojeni zarezom(,) za tablicu 2.
Koristili smo naredbu SELECT da kopiramo podatke samo iz odabranih stupaca druge tablice i MySQL INSERT INTO SELECT izraz da ih ubacimo u prvu tablicu.
sintaksa:
Tabela 2: LateralStudent
ROLL_NO | NAME | ADRESA | TELEFON | Starost |
7 | SOUVIK | DUMDUM | 9876543210 | 18 |
8 | NIRAJ | NOIDA | 9786543210 | 19 |
9 | SOMESH | ROHTAK | 9687543210 | 20 |
Zahtjevi:
Metoda 1 ( umetnite sve redove i kolone):
INSERT INTO Student SELECT * FROM LateralStudent;
Rezultat :
Ovaj upit će umetnuti sve podatke iz tabele LateralStudent u tabelu Student. Nakon upotrebe SQL INSERT INTO SELECT, Studentska tabela će izgledati ovako:
ROLL_NO | NAME | ADRESA | TELEFON | Starost |
1 | Ram | Delhi | 9455123451 | 18 |
2 | RAMESH | GURGAON | 9562431543 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
4 | SURESH | Delhi | 9156768971 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
2 | RAMESH | GURGAON | 9562431543 | 18 |
7 | SOUVIK | DUMDUM | 9876543210 | 18 |
8 | NIRAJ | NOIDA | 9786543210 | 19 |
9 | SOMESH | ROHTAK | 9687543210 | 20 |
Metoda 2 ( ubacivanje pojedinačnih kolona):
INSERT INTO Student(ROLL_NO,NAME,Age) SELECT ROLL_NO, NAME, Age FROM LateralStudent;
Rezultat :
Ovaj upit će umetnuti podatke iz kolona ROLL_NO, NAME i Age iz tabele LateralStudent u tabelu Student. Preostale kolone Studentske tabele biće postavljene na null. Nakon upotrebe SQL INSERT SELECT, tabela će izgledati ovako:
ROLL_NO | NAME | ADRESA | TELEFON | Starost |
1 | Ram | Delhi | 9455123451 | 18 |
2 | RAMESH | GURGAON | 9562431543 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
4 | SURESH | Delhi | 9156768971 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
2 | RAMESH | GURGAON | 9562431543 | 18 |
7 | SOUVIK | Null | null | 18 |
8 | NIRAJ | Null | null | 19 |
9 | SOMESH | Null | null | 20 |
Rezultat :
Ovaj upit će odabrati samo prvi red iz tabele LateralStudent za umetanje u tabelu Student. Nakon upotrebe INSERT SELECT, tabela će izgledati ovako:
ROLL_NO | NAME | ADRESA | TELEFON | Starost |
1 | Ram | Delhi | 9455123451 | 18 |
2 | RAMESH | GURGAON | 9562431543 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
4 | SURESH | Delhi | 9156768971 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
2 | RAMESH | GURGAON | 9562431543 | 18 |
7 | SOUVIK | DUMDUM | 9876543210 | 18 |
Ova publikacija je prijevod članka “SQL INSERT INTO Statement”, koji je pripremio prijateljski projektni tim
Upiti za promjenu se koriste za dodavanje (INSERT INTO), brisanje (DELETE) i ažuriranje (UPDATE) zapisa u tablicama.
Naredba INSERT INTO se može koristiti za dodavanje jednog ili više zapisa na kraj tabele.
Sintaksa naredbe INSERT INTO je sljedeća:
INSERT INTO Ime_tabele [(Ime_polja)] VRIJEDNOSTI (Vrijednosti_podataka);
Na primjer, stavimo u tabelu "Grupe" zapis koji sadrži podatke (1, BF-16a, 1, 1) u odgovarajućim kolonama (šifra grupe, naslov, predmet, semestar).
Da biste to učinili, zatražite u formatu:
INSERT INTO Groups (šifra grupe, naziv, predmet, semestar) VRIJEDNOSTI (1, BF-16a, 1, 1);
unesite upit na obrazac tako što ćete izvršiti naredbu "Kuery Builder" na kartici "Creation", u "SQL Mode" modu iz menija Pogled.
Sačuvajte zahtjev pod imenom "Add_1_records". Kao rezultat toga, nepovezani objekt će se pojaviti u "Navigation Area" - "Add_1_records" (Sl. 1.).
Rice. 1.
Nakon pohranjivanja zahtjeva, morate izvršiti ovaj zahtjev klikom na ikonu “Run”. Kao rezultat izvršavanja naredbe “Add_1_records”, prvi zapis će se pojaviti u praznoj tabeli (slika 2.)
Rice. 2.
Naredba UPDATE dizajnirana je za promjenu postojećih zapisa u stupcima tablice, što vam omogućava da ažurirate vrijednosti u navedenim stupcima tablice.
Sintaksa naredbe UPDATE je sljedeća:
UPDATE Table_Name SET Column_Name = New_Value WHERE Uslov_odabira;
SET klauzula specificira imena stupaca čije podatke treba promijeniti. Klauzula WHERE je opciona, ali se može koristiti za specificiranje samo onih redova u kolonama (tabelama) koje je potrebno ažurirati.
Kreirajmo zahtjev za promjenu zapisa u tabeli "Grupe" baze podataka sql_training_st.mdb.
Na primjer, hajde da se već promijenimo postojeći unos za prvi ID polja ključa u koloni "Ime" u tabeli "Grupe".
Zahtjev u formatu:
UPDATE Grupe Naziv SET ="BF-16b" WHERE ID=1;
Sačuvajte zahtjev pod imenom "Change_record_1". Kao rezultat, objekat “Change_record_1” će se pojaviti u “Tranzicionoj oblasti” (slika 3.).
Rice. 3.
Nakon pohranjivanja zahtjeva, morate izvršiti ovaj zahtjev klikom na ikonu “Run”. Kao rezultat izvršavanja naredbe “Change_record_1”, pojavit će se dijaloški okvir u koji morate unijeti vrijednost parametra ID=1 i kliknuti OK. Nakon ovih koraka, u tabeli „Grupe“ unos u polju „Naziv“ će se promeniti iz BF-16a u BF-16b (slika 4.).
Rice. 4.
Naredba DELETE je dizajnirana za brisanje zapisa iz tabele.
Format zahtjeva za brisanje zapisa:
DELETE FROM Table_Name WHERE Odabir_Stanje;
Kreirajmo zahtjev za promjenu zapisa u tabeli "Grupe" baze podataka sql_training_st.mdb.
Na primjer, izbrišemo postojeći zapis za prvi ID polja ključa u svim kolonama (poljima) tabele "Grupe".
Da biste to učinili, zatražite u formatu:
IZBRIŠI IZ grupa GDJE ID=1;
kreirajte upit na obrascu tako što ćete izvršiti naredbu "Kuery Builder" na kartici "Creation", u modu "SQL Mode" iz izbornika View.
Zahtjev pohranjujemo pod nazivom “Delete_record_1”. Kao rezultat, objekat “Delete_record_1” će se pojaviti u “Transition Area” (slika 5.).
Rice. 5.
Nakon pohranjivanja zahtjeva, morate izvršiti ovaj zahtjev klikom na ikonu “Run”. Kao rezultat izvršavanja naredbe “Delete_record_1”, pojavit će se dijaloški okvir u koji morate unijeti vrijednost parametra ID=1 i kliknuti OK. Nakon ovih koraka otvorit će se dijaloški okvir “Potvrdi brisanje zapisa”. Nakon potvrde, podaci u svim poljima će biti obrisani u tabeli "Grupe", tj. unos je obrisan (slika 6.).
Rice. 6.
Treba napomenuti da je za brisanje podataka u određenim poljima tabele preporučljivo koristiti naredbu UPDATE i zamijeniti vrijednosti u potrebnim poljima s Null. Ako trebate da izbrišete tabelu kao celinu, trebalo bi da koristite operator DROP TABLE (sintaksa operatora: DROP TABLE Table_Name;).
Vratimo prvi zapis u tabeli "Grupe" izvršavanjem naredbe "Add_1_records", kao rezultat toga ćemo vratiti prvi zapis (slika 7.).
Rice. 7.
Ponekad programeri imaju goruću želju da pročitaju nešto iz baze podataka. Programeri postaju nervozni i razdražljivi, gube san i mahnito upiru prstom u tastaturu. Za dobrobit svih i svjetski mir, pogledajmo jednostavno upravljanje bazom podataka iz C# koristeći ADO.NET i OLE DB. Iako ovaj mehanizam podržava različite baze podataka kao što je Oracle, ovdje i sada ćemo koristiti MS SQL Server.
Dva glavna zadatka pri radu sa bazom podataka
2. Izvršavanje SQL naredbe koja radi nešto na poslužitelju (umetanje, ažuriranje, brisanje, pozivanje funkcije ili pohranjene procedure
3. Sekvencijalno čitanje iz odabira red po red. Uglavnom se koristi u web aplikacijama u desktop aplikacijama lakše je preuzeti cijeli izbor odjednom RAM, uštede od čitanja samo potrebnih redova su zanemarljive.
4. Rijedak slučaj. Automatsko ažuriranje tabele u bazi podataka zasnovane na promenama u DataTable (obično se uređuju preko vizuelnog interfejsa). U stvarnom životu, podaci se obično čitaju kroz složeni upit za spajanje hrpe ili prikaz, tako da automatska sinhronizacija nije prikladna.
Glavne klase koje se koriste u ove svrhe: OleDbConnection - veza s bazom podataka, kreirana nizom koji sadrži parametre veze, otvaranje, zatvaranje, OleDbCommand - kreirana instancom veze i sql naredbom, ako samo trebate izvršiti ažuriranje ili dobiti jednu vrijednost, onda je ovo dovoljna klasa, OleDbDataAdapter - kreiran pomoću OleDbCommand-a, specijaliziran je za jednokratno čitanje skupova redova u DataTable-u, može automatski kreirati DataTable stupce na osnovu odabira, prenositi promjene iz DataTable-a u tablicu u baza podataka, OleDbDataReader - sekvencijalno čitanje redova u DataTable-u jedan po jedan (radi interno OleDbDataAdapter), DataTable / DataSet - glavni kontejner za podatke. OleDbType enumeracija pohranjuje tipove podataka baze podataka.
Using System.Data; koristeći System.Data.OleDb; // niz veze, korišteni sistem(Integrirana sigurnost=SSPI;) string connString = "Dobavljač=SQLOLEDB.1;Integrirana sigurnost=SSPI;Persist Security Info=False;Inicijalni katalog=ime baze podataka;Izvor podataka=ime servera"; // alternativni niz povezivanja koristeći autentifikaciju MS SQL Servera // connString = "Provider=SQLOLEDB.1;Persist Security Info=False;Initial Catalog=databaseName;Connect Timeout=20;Data Source=serverName;Uid=userName;Pwd=userPassword ; " OleDbConnection dbConn = nova OleDbConnection(connString); dbConn.Open(); someDataTable = new DataTable(); OleDbDataAdapter dbAdapter = novi OleDbDataAdapter("odaberite COLUMN1, COLUMN2 iz TEST_TABLE ORDER BY COLUMN2", dbConn); // interna struktura prazne tabele će se automatski kreirati na osnovu pročitanih podataka ako je struktura tabele već specificirana (na primer, preko ukucanog skupa podataka), tada će podaci biti upisani u kolone sa podudarnim imenima ili novim; kolone će biti dodan dbAdapter.Fill(someDataTable); // alternativna opcija popuniti tablicu u DataSet-u // dbAdapter.Fill(someDataSet, "someDataTable"); dbConn.Close();
2. Izvršavanje SQL naredbe koja radi nešto na poslužitelju (umetanje, ažuriranje, brisanje, pozivanje funkcije ili pohranjene procedure.
Posebno vrijedni pažnje su problemi s datumima. Implementacija datuma u .Net-u je krajnje kriva - datumi u početku ne mogu biti prazni, ali u stvarnom životu su sve vrijeme prazni. Najviše ispravna odluka- koristite posebnu klasu datuma koja ispravlja greške Microsoft programera. Lazier programeri čuvaju sve datume u kodu kao stringove i pretvaraju ih u DateTime samo kada je to potrebno, na primjer kada pišu u bazu podataka ili DataTable. Nullable DateTime ne pomaže, budući da bi prazan datum u sučelju trebao izgledati kao prazan niz, a kada je upisan u bazu podataka kao DBNull.Value, čak ni banalna null u kodu se ne pretvara u ove vrijednosti bez dodatnog plesanja sa tambura.
Prva opcija uključuje jednostavno spajanje niza upita. Smatra se lošom praksom i posebno opasnom u web aplikacijama jer je podložna hakerskim napadima. Problem sa praznim datumima nije tako lako riješen. Osim toga, pri radu sa datumima pojavljuje se dodatni problem - različiti formati stringova datuma u zavisnosti od regionalnih postavki .Net Frameworka, razvojnog okruženja i sql servera. Možda izgleda nadrealno - isti upit radi u SQL Managment Studio, ali se ruši kada se izvrši iz koda. Djelomično se čuva posebnim formatom niza datuma, međutim, to se često radi u malim programima za internu upotrebu, čije postojanje vanjski svijet nikada neće saznati.
OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "INSERT U TEST_TABLE (INT_COLUMN, VARCHAR_COLUMN, DATETIME_COLUMN) VRIJEDNOSTI (" + intVariable", " + stringVariable" , " + dateTimeVariable.ToString("yyyyMMdd") +""); dbCommand.ExecuteNonQuery();
Ispravna opcija uključuje kreiranje naredbe sa skupom jako otkucanih parametara. Uzmite u obzir da prethodni stav nije postojao.
OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "INSERT U TEST_TABLE (INT_COLUMN, VARCHAR_COLUMN, DATETIME_COLUMN) VRIJEDNOSTI (?, ?, ?)"; dbCommand.Parameters.Add("INT_COLUMN", OleDbType.Integer).Value = intVariable; dbCommand.Parameters.Add("VARCHAR_COLUMN", OleDbType.VarChar).Value = stringVariable; if (stringDate == "") ( dbCommand.Parameters.Add("DATETIME_COLUMN", OleDbType.DateTime).Value = DBNull.Value; ) else ( dbCommand.Parameters.Add("DATETIME_COLUMN", OleDbType.Value). Convert.ToDateTime(stringDate); dbCommand.ExecuteNonQuery();
Pohranjena procedura se poziva na potpuno isti način, radi raznolikosti postoji još jedna opcija za upisivanje vrijednosti u parametre (nije vezana posebno za pohranjenu proceduru):
OleDbCommand someDbComm = novi OleDbCommand("someStoredProcedure", this.dbConn); someDbComm.CommandType = CommandType.StoredProcedure; someDbComm.Parameters.Add("@parameter1", OleDbType.VarChar); someDbComm.Parameters.Add("@parameter2", OleDbType.VarChar); someDbComm.Parameters.Value = " Svaki problem uvijek ima rješenje - jednostavno, zgodno i, naravno, pogrešno"; someDbComm.Parameters.Value = "Henry Louis Mencken"; someDbComm.ExecuteNonQuery(); !}
Proširena verzija opisa parametra koji ukazuje na veličinu polja i vezanje za određeni stupac tablice.
DbCommand.Parameters.Add("VARCHAR_COLUMN", OleDbType.VarChar, 100, "VARCHAR_COLUMN").Value = stringVariable;
Ako ne trebamo da vežemo parametar naredbe za određeno polje DataTable, onda je najbolje da uopće ne specificiramo veličinu, na primjer, ako je string manji od navedene dužine Varchara, onda će dobar .Net framework dodati razmaci nizu do određene dužine, oštećujući podatke koji se prenose na server.
Vrijednost jednog polja se čita metodom ExecuteScalar().
OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "IZABIR TEST_COLUMN IZ TEST_TABLE GDJE ID_COLUMN =?"; dbCommand.Parameters.Add("INT_COLUMN", OleDbType.Integer).Value = intVariable; int rezultat = Convert.ToInt32(dbCommand.ExecuteScalar());
Posebno treba napomenuti da ExecuteScalar vraća Object i ako zahtjev nije vratio ništa, onda će rezultat biti null i konverzija u normalan tip podataka neće uspjeti s greškom. Ako je moguća situacija u kojoj ne dobijemo ništa kao odgovor, onda moramo učiniti sljedeće:
OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "IZABIR TEST_COLUMN IZ TEST_TABLE GDJE ID_COLUMN = ?"; dbCommand.Parameters.Add("INT_COLUMN", OleDbType.Integer).Value = intVariable; objekt resultObj = dbCommand.ExecuteScalar() int rezultat = -1; // zadana vrijednost znači prazan rezultat if(resultObj != null) ( rezultat = Convert.ToInt32(dbCommand.ExecuteScalar()); )
3. Sekvencijalno čitanje iz odabira red po red
Čitanje jednog reda (nekoliko se čita u petlji);
OleDbCommand dbCommand = nova OleDbCommand(odaberite OSOBA_ID, IME, PREZIME iz TEST_TABLE, dbConn); OleDbDataReader dbReader = dbCommand.ExecuteReader(); dbReader.Read(); string name = Convert.ToString(dbReader["NAME"]); string prezime = Convert.ToString(dbReader["PREZIME"]); dbReader.Close();
4. Rijedak slučaj. Automatsko ažuriranje tabele u bazi podataka zasnovano na promenama u DataTable (obično se uređuju preko vizuelnog interfejsa).
Za svaki mogući slučaj potrebno je napisati četiri naredbe za DbAdapter - select, insert, update, delete.
DbAdapter.InsertCommand = novi OleDbCommand("ubaci u TEST_TABLU (NAME, FAMIL, AGE) vrijednosti (?, ?, ?)", dbConnection); dbAdapter.InsertCommand.Parameters.Add("NAME", OleDbType.VarChar, 100, "NAME"); dbAdapter.InsertCommand.Parameters.Add("FAMIL", OleDbType.VarChar, 100, "FAMIL"); // za tipove podataka sa konstantnom dužinom, dužina navedena u naredbi se zanemaruje dbAdapter.InsertCommand.Parameters.Add("AGE", OleDbType.Integer, 100, "AGE"); // dodaj naredbu za ažuriranje dbAdapter.UpdateCommand = new OleDbCommand("ažuriraj TEST_TABLE set NAME = ?, FAMIL = ?, AGE = ? gdje je ID = ?, dbConnection); dbAdapter.UpdateCommand.Parameters.Add("NAME", OleDbType.VarChar,100, "NAME"); dbAdapter.UpdateCommand.Parameters.Add("FAMIL", OleDbType.VarChar, 100, "FAMIL"); dbAdapter.UpdateCommand.Parameters.Add("AGE", OleDbType.Integer, 100, "AGE"); dbAdapter.UpdateCommand.Parameters.Add("ID", OleDbType.Integer, 100, "ID"); // dodaj komandu za brisanje dbAdapter.DeleteCommand = new OleDbCommand("izbriši iz TEST_TABLE gdje je ID =?", dbConnection); dbAdapter.DeleteCommand.Parameters.Add("ID", OleDbType.Integer, 100, "ID"); try ( // prenosi sve promjene iz DataTable u tablicu u bazi podataka dbAdapter.Update(table); ) catch (Greška izuzetka) ( MessageBox.Show("Greška pri spremanju podataka!" + error.Message); return; ) MessageBox . Prikaži("Promjene su sačuvane!");