You are on page 1of 32

03.

Adatbáziskezelés
Adatbázisok
Az adatbázisokban a fő adathordozó a tábla. Ez egy kétdimenziós mátrix, amelynek a sorai tartalmazzák a az információkat. Pl. a vevők (Customers) táblája:

A példában minden vevőnek vannak attribútumai (tulajdonságai). A képen a táblában: CustomerID, CompanyName, ContactName, stb. Ezek a mátrix oszlopai. Egy sor az egy vevőről szóló információkat tartalmazza. Egy adatbázis állhat több táblából (néhánytól néhány ezerig). A táblák legtöbbször kapcsolódnak egymáshoz. Ezek a kapcsolatok a relációk. Az ADO (ActiveX Data Object) egy .net technológia, amelyik lehetővé teszi a munkát különböző formátumú adatbázisokkal. Része a .NET Framework környezetnek, ami nagyszámú előre elkészített osztály beépítésével valósul meg. Példa hat lépésben: Ehhez fel kell használni az internetről letöltött adatbázist - C:\BAZIS\NWIND.MDB. Létre kell hozni egy Windows Application típusú új projektumot. 1. Először hozzá kell adni az adatforrást (Data Source) a projektumhoz. Ez tulajdonképpen kapcsolat a használni kívánt adatbázishoz. Különböző típusú adatbázist lehet használni, de ekkor típustól függően telepíteni kell a megfelelő meghajtót (driver), de mindig alkalmazható a Microsoft Access és az SQL Server. A Data menüből ki kell választani az Add New Data Source tételt. Ezzel elindul a Data Source Configuration varázsló. Az első ablakból "Choose a Data Source Type" válaszd ki a DataBaset, és utána Next. 2. Ebben a párbeszédben hozzá kell adni a kapcsolatot (Connection) az adatbázis felé, és ki kell választani a megfelelő típusú adatbázist. Kattints a New Connection gombra. Kinyílik az Add Connection párbeszéd.Az alapértelmezett a Microsoft Sql Server. Ennek megváltoztatásához kattints a Change gombra.

1

A Change Data Source párbeszéd során válaszd ki a Microsoft Access Database File, és utána OK.

3. Visszakerülünk az előző párbeszédbe, ahol a Browse gombra kell kattintani, hogy megtaláljuk a keresett adatbázist. Következik az OK, és ezáltal létrejön a kapcsolat az Nwind.mdb adatbázissal, majd Next a következő lépés felé. Ezután még egy No válasz következik, hogy ne másoljuk át az adatbázist a projektum mappájába.

4. A következő lépés a "Save connection string...", amelynek ebben a pillanatban nincs jelentősége, és ezért következik a Next. 5. Ebben a lépésben "Choose your database objects" ki kell választani egy vagy több táblát, amelyekkel dolgozni akarsz. Ehhez a + mellett be kell jegyezni a táblát. Válaszd ki a Customers táblát. Végül pedig Finish amivel befejezzük az adatforrás kiválasztását.

2

6. A kijelölt adatforrás adatainak kiírása a képernyőre. A tábálázatok kiírására legtöbbször a DataGridView vezérlőt alkalmazzák, amelyik az eszköztár Data szakaszában található. A Properties ablakban a DataSource tulajdonság arra szolgál, hogy a vezérlőt összekössük az adatforrással, és így a végrehajtás során megjeleníthetőek legyenek a bázis adatai. Nyisd ki a lenyíló menüt a DataSource tulajdonság mellett. Látható, hogy hozzáadódtak még más objektumok is, és a DataGridView vezérlőben az egyes oszlopok fejléceiban megjelennek a Customers tábla attributumai.

Az alkalmazás elindítása után megkapjuk az adatbázisból kiválasztott adatokat egy táblázat formájában:

A futó alkalmazás sok előre beépített funkciót tartalmaz (vízszinte és függőleges scroll, sorbarakás adott mező szerint, ha a fejléc megfelelő mezőjére kattintunk. Az adatbázisok adataihoz való hozzáféréshez ismerni kell az erre a célra kifejlesztett nyelvet. Ez az SQL (Structured Query Language) – struktúrált lekérdezési nyelv. Ez a nyelv nagyon kis mértékben függ az adatbázis típusától.

A tábla elsődleges kulcsa (Primary Key – PK)
Mindegyik táblának van egy fontos objektuma ez az elsődleges kulcsa (Primary Key – PK). Ez lehet egy vagy több oszlop, amelynek az a feladat, hogy egyértelműen azonosítsa a tábla egy oszlopát. Pl. ha az egyetemi hallgatók adatait akarjuk egy táblába foglalni, a legmegfelelőbb elsődleges kulcs a hallgatók indexének a száma. Nem lenne célszerű a vezetéknevet és a nevet választani erre a célra, mert előfordulhatnak ugyanolyan nevű egyének. Néha egy érték nem elegenedő az egyértelmű azonosításhoz. Pl. ha a Szerbia összes egyetemi hallgatójának adatait akarnánk bevinni egy táblába, csak az index száma nem lenne elegendő. Hozzá 3

stb. a FROM után kell beírni a tábla nevét. hogy az SQL parancsokat nagy betűvel írjuk). Miért fontos az elsődleges kulcs? Ha meg akarjuk nézni. amely alapján egyértelműen meg lehetne határozni a tábla sorait (nem lehet megfelelelő elsődleges kulcsot definiálni). A Northwind adatbázisban létezik a Customers tábla. A táblában lévő adattípusok Az alapvető adattípusok: – Szöveges adatok – alfanumerikus szöveg. de íratlan szabály. CompanyName (cég név). amelyik legtöbbször numerikus. DDL (Data Definition Language). hogy melyik felhasználó mit csinálhat az adatokkal. Ebben az esetben mesterségesen hozzá kell adni még egy oszlopot a táblához. hozzáadására. Az SQL alapjai DML (Data Manipulation Language). Data Control Language) segítségével meghatározható. földrajzi adatok (koordináták). stb. változtatni és törölni az adatbázis objektumait. képek. stb. akkor ezt nem tehetnénk meg pontosan ha nem lenne elsődleges kulcs. Az így kialakított elsődleges kulcsot nevezik még kompozit vagy összetett elsődleges kulcsnak. City FROM Customers (A kis. a SELECT lekérdezés a következő: SELECT CustomerID. Adatbázistól függően ezt az oszlopot Autonumber. CompanyName. míg mások meg is változtathatják őket. Ennek az utasításnak az eredménye: 4 . módosítani vagy törölni az adatokat. elsődleges kulcsot definiálni. – Lebegőpontos numerikus adatok – Dátum típusú adatok – Különleges adattípusok – nagy kapacitású szöveg mezők. Ezekkel lehet táblát létrehozni. Ha ezeket az oszlopokat ki akarjuk olvasni a Customers táblából. – Egész típusú numerikus adatok – pozitv és negatív egész számok. A felsorolt oszlopneveknek létezniük kell a táblában. Néha a táblának nincs olyan oszlopa. Az adatok bemutatása Az adatok bemutathatók a SELECT utasítás segítségével. meghatározni az adatok nevét és típusát. Pl. A SELECT utasítás szintaxisa: SELECT az_oszlop_neve FROM a_tábla_neve Az oszlopok nevét vesszővel kell szétválasztani. adatmozgatásra szolgáló utasítások. változtatására és törlésére vonatkozó utasítások. Ide tartoznak az adatok bemutatására. és amelybe az adatbázis legtöbbször saját magától növekvő sorrendben beírja a számokat. különben hiba történik. némelyik felhasználó csak nézheti az adatokat. amely tartalmazza a vevők adatait a következő oszlopokban: CustomerID (vevő sifra). Identity – nek nevezik. City (helység). hangok.kellene adni a város és az egyetem nevét is.és nagy betűk között nincs különbség. DCL (eng. Ennek a segítségével lehet létrehozni.

Ez megtehető egy vagy több oszlop szerint. CompanyName. akkor használhatjuk az ORDER BY bővítményt: SELECT CustomerID. mégpedig A-tól kezdve. akkor a SELECT utasítást a következőképpen kell felírni: SELECT * FROM Customers Íly módon gyorsan megtudhatjuk a tábla oszlopainak a nevét. hogy az adatokat meghatározott sorrendben ábrázoljuk. Ha az adatokat város név szerint szeretnénk sorba rakni. A gyakorlatban gyakran szükség van rá.Ha a tábla összes oszlopát ki akarnánk íratni. City FROM Customers ORDER BY City ASC 5 .

Írjunk egy olyan adat lekérést. SELECT City. és nem kell külön felírni. hogy nem akarjuk a tábla összes sorát kiíratni. Több kritérium is kombinálható ha összkötjük őket az OR és AND operátorokkal.ASC Ascending (növekvő sorrend). Ez a WHERE utasítással érhető el. a lekérdezés a következő: SELECT CustomerID. CompanyName. A függőleges szűrő azt jelenti. DESC – Descending (csökkenő soorend). Pl. Általában az adatbázisok többségében az ASC az alapértelmezett érték. amely sorba rak két oszlop alapján: City és CompanyName. amelynek segítségével definiálhatjuk a kívánt kritériumokat (hasonlít az if utasításhoz). CompanyName FROM Customers ORDER BY City ASC. Pl. a CompanyName szerint pedig csökkenő sorrendben. mégpedig a City szerint növekvő. amelyekre szükségünk van. CompanyName DESC A gyakorlatban általában nincs szükség a tábla összes adatára. A vízszintes szűrő azt jelenti. csak egy adott városhoz tartozó vevőket akarjuk látni. hogy a City mező tartalma szöveges (alfanumerikus). Ha látni akarjuk az összes Londoni vevőt. 6 . Pl. ha csak a vevő kódját és a cég nevét akarjuk kiíratni. hogy nem íratjuk ki egy tábla összes oszlopát. Ezért alkalmazható a függőleges és vízszintes szűrő. City FROM Customers WHERE City = 'London' A WHERE után következik a feltétel. Ez minden adatbázis típus esetén így van. A 'London' aposztrofusok között azt jelenti. hanem csak azokat. akkor a SELECT utasításban csak a szükséges mezőket kell felsorolni.

mint az OR.. Ebben az esetnen fontos betartani az utasítások sorrendjét a lekérdezés során: SELECT ..Ha pl. WHERE (City = 'London' AND CustomerID = 'ALFKI') OR Country = 'Italy' Zárójelek alkalmazásával a megváltoztathatók a prioritások. WHERE City = 'London' AND CustomerID = 'ALFKI' OR Country = 'Italy' Mivel az AND prioritása magasabb.. FROM . mi lenne az eredmény? Válasz: nem kapnánk egy tételt sem. ORDER BY . mégpedig az OR (vagy) operátorra a feltételben. a boole algebra szabályai szerint. City FROM Customers WHERE City = 'London' OR City = 'Berlin' Kérdés: ha az előző példában az OR operátor helyett AND operátort használnák. mert egy vevő sem lehet egyidőben Londonból is és Berlinből is.. A WHERE és ORDER BY utasítások (klauzulák) gyakran kombinálódnak. a Londoni és Berlini vevők is érdekelnek bennünket. SELECT CustomerID... akkor összetett feltételre van szükségünk. CompanyName. hogy az AND magasabb prioritású.. Hogy kell helyesen értelmezni az alábbi kritériumot: ... a fenti feltételt a következőképpen kell olvasni: . hogy figyelembe kell veni. akkor összetett feltételre van szükség.. WHERE .. Például: Ilyen módon létrehozhatók tetszőlegesen összetett feltételek több OR és/vagy AND operátor segítségével azzal.. 7 .

a kritériumban megadottak nélkül.Ha meg akarunk mutatni adatokat. látni akarnánk az összes vevőt a következő városokból London. mint 50. Berlin. CustomerID. ha látni akarjuk az összes vevőt a londoniak kivételével: SELECT CustomerID. amelyek ára (UnitPrice) nagyobb. Pl. akkor használhatjuk a NOT tagadás (negáció) operátort. Pl. Pl. szeretnénk látni az összes olyan terméket. Madrid és Pariz. SELECT ProductID. ProductName. 'Madrid'. City FROM Customers WHERE City IN ('London'. mint eddig azzal. City FROM Customers WHERE NOT City = 'London' Van még egy hasznos rövidítés. UnitPrice FROM Products WHERE UnitPrice> 50 ORDER BY UnitPrice Az IN operátorhoz hasonlóan van még egy féle rövidített írásmódja a feltételeknek. 'Berlin'. feltételt rövidítve így írhatnánk fel: SELECT ContactName. 'Paris') Ha a feltételben szereplő mezők numerikusak. hogy a mező értékét nem kell aposztrofusok közé írni. akkor használhatjuk az IN oprátort. Ha látni akarjuk azokat a termékeket. Ha ugyanarra a mezőre több OR operátorral összekötött feltétel van. a feltételt ugyanúgy kell írni. amelyek ára 50 és 100 között (beleértve ezeket az értékeket is) szabályos a következő írásmód: 8 . és az eredmény sorba akarjuk rakni ennek a mezőnek az alapján. CompanyName. CompanyName.

Data névtérhez tartoznak.Data.Data. és szerkezetének esetleges különlegességét. régi DBF típusú adatbázisoknál. A System. Ez a driver lehetővé teszi az összes tevékenység végrehajtását az adatbázison.Data. amelyeket két névtérbe (name spaces) osztottak: System. UnitPrice FROM Products WHERE UnitPrice BETWEEN 50 AND 100 Fontos szem előtt tartani.OleDb névtér osztályait. Az OleDb technológia használatos az Access. FoxPro. Hasonlóan a videokártyához. ProductName. Az eddigiekhez hasonlóan célszerű kihasználni a using direktivát. azaz a System.OleDb névtér pedig az egyéb adatbázisokhoz szükséges osztályokat tartalmazza.SqlClient névtér tartalmazza a Microsoft SQL Server adatbázisokkal történő munkához szükséges osztályokat. Pl.Data. hogy az adatbázisokkal történő munka csak néhány apróságban különbözik az egyes adatbázis típusoknál. Ezért egy alkalmazás egyformán jól fog működni különböző adatbázisokkal.NET környezet nagy számú előre elkészített osztállyal könnyíti meg ezt a munkát. Mivel Access adatbázist használunk a példákban.OleDb Hierarchia tekintetében a System.Data. hogy lerövidítsük az írást a kódolás alkalmával. az Oracle és a MySql lehetővé teszi ezt az OleDb vagy a . Mindig ugyanolyan osztályokról van szó. hogy a BETWEEN operátor alkalmazásakor mindig be kell kapcsolni az intervellum alsó és felső határát is. az adatbázisok esetén is szükség van programra. ProductName.SELECT ProductID. amely kapcsolatot teremt az adatbázis és az adott fejlesztői környezet között.Data-ra. az OleDb drivereket kell használni. de elrejti annak összetettségét. a <= a"kisebb vagy egyenlő"-t jelenti. A feltétel írást lerövidíthetjük a BETWEEN operátorral: SELECT ProductID. A System. A "Windows Application" sablon már eleve hivatkozik a System. amelyek mind saját driverekkel rendelkezik. Ennek az elvnek az óriási előnye.NET technológiában. Történelmileg több féle technológia létezik. UnitPrice FROM Products WHERE UnitPrice >= 50 AND UnitPrice <= 100 A >= operátor a "nagyobb vagy egyenlő"-t. Fontos megérteni az "adatbázis driver" fogalmát.SqlClient System. Az adatbázis gyártók a honlapjaikról lehetővé teszik ezeknek a driver-eknek az átvételét. Adatbázisok alkalmazása a C# programokban Névterek és vezérlő programok Az adatbázisokkal történő munka során a C# és általába a . tehát nincs szükség újabb hivatkozásra. 9 .

nélkülözhetetlen a kapcsolat (Connection) az adatbázis felé.ConnectionString = @"Provider=Microsoft.OLEDB. …stb.4. User id=Admin. 2. hogy a \ jelet ugyanúgy kezelje.).OleDb névtér).OLEDB. Pl. Az elválasztójel a pontosvessző (. figyelembe kell venni a C# jellegzetes string kezelését.4.OLEDB. Erre feltétlenül szükség van. hogy minden \ jel után odaírunk még egyet: Obj. paraméter_név1=paraméter_érték1.mdb" 10 . A \ (back slash) különleges jelentése van a string-en belül – ez az ún. Az osztály alapvető tulajdonsága. Ezt az OleDbConnection osztály biztosítja. A munka befejezése után be kell zárni a kapcsolatot az adatbázis irányában. Az Access bázis driver-ének a neve mindig Microsoft.4.Az adatbáziskezelésshez szükséges osztályok A már említett két névtér ugyanazokat az osztályokat tartalmazza. Ez egy string típusú tulajdonság. paraméter_név2=paraméter_érték2. Kapcsolat Minden esetben. az Open() metódus hibát generál a program végrehajtása során. ne terhelje a hálózatot.4. Ebben az esetben a ConnectionString a következő: "Provider =Microsoft. akkor meg kell adni a felhasználói nevet és a hozzátartozó jelszót is. Ha ezeket összefűzzük: "Provider= Microsoft.0. Ha az adatbázis valamilyen okból nem hozzáférhető.0. a jelszó pedig 123.0. mint bármelyik másikat: Obj. MEGJEGYZÉS: 1. Ezek csak az előtagjukban (prefix) különböznek.4. amely után leginkább valamilyen különleges formázó jel következik. sérült vagy hálózati probléma van.0.0. SqlConnection (System. Fontos odafigyelni. Data Source=C:\baza\Nwind.Jet.Data Source=C:\\baza\\Nwind. ez a paraméter a file nevét és a hozzá vezető utat tartalmazza.mdb. ahogy a rendszerben regisztrálták. az adatbázis felé még külön meg kell nyitni a kapcsolatot." Data Source – Ha Access bázisról van szó. legyen az adatbázis felhasználója Admin.mdb" A másik megoldás.OLEDB. Pl. A kapcsolódó string végső formája: "Provider =Microsoft. Ezért ha felírjuk.Data Source=C:\baza\Nwind. hogy a bázishoz mások is csatlakozhassonak.Data. A string elé oda lehet írni a @ jelet. Erre két megoldás van. Amikor az OleDbConnection tulajdonságát állítjuk be.SqlClient névtér) és a OleDbConnection (System.OLEDB.Data. A paraméterek és jelentésük a következő: Provider – az adatbázis driver neve. ill. hogy: Obj.0.4. amelyik párokból áll.Jet. Ezért kell még újabb két paraméter: User id és Password.Jet.OLEDB.OLEDB. Password=123". hogy a Data Source és User id paramétereket külön írjuk egy üres hely beiktatásával. argumentum nélkül.Jet.mdb" mindjárt hibaüzenetet kapunk.ConnectionString = "Provider=Microsoft. A mi esetünkben ez C:\bazis\Nwind. az Access adatbázis miatt.Jet.Jet. A továbbiakban az OleDb* objektumokkal dolgozunk. attól függetlenül.mdb".0. Alapesetben ez elegendő. Létre kell hozni a stringet. ami azt jelenti a fordító számára.mdb.Data Source=C:\baza\Nwind.4.ConnectionString = "Provider=Microsoft. Erre szolgál az Open() metódus. Miután beállítottuk a ConnectionString tulajdonságot. Escape vagy vezérlő karakter.Jet. amely meghatározza a kapcsolat paramétereit a ConnectionString. hogy mit csinálunk az adatbázissal. Ha azonban a bázist jelszó védi. Data Source=C:\baza\Nwind.

Mindkét megoldás egyenrangú. hogy a hálózaton keresztül több felhasználó is kapcsolódhasson az Access adatbázishoz. mint egy univerzális tárhely. A parancsot mindig a már meghatározott kapcsolaton (connection) hajtja végre. az adatbázishoz vezető teljes út: \\Server\Adatok\Nwind. Mindegyik SELECT létrehozza a saját mátrixát. Hozzunk létre egy olyan C# alkalmazást. azután egy gombra történő kattintással lássa az eredményt sorok és oszlopok formájában.OLEDB. hogy kapcsolat alapján (melyik adatbázisban) kerül a parancs végrehajtásra. Ez a tulajdonság OleDbCommand típusú.Jet.0. Ha azt szeretnénk. Az OleDbDataAdapter indítja el a parancsot. A felhasználói interface nagyon egyszerű és így néz ki: 11 . A DataSet-nek nincs sem Sql. Parancs Az SQL lekérdezést az adatbázis felé az OleDbCommand objektummal tudjuk megadni. amelyben a felhasználó beírhat egy SQL SELECT kérdést. Pl. A DataSet úgy használódik. A parancsok tulajdonságai és jelentése a következő: A Connection tulajdonság meghatározza. A Fill metódus tölti fel a DataSet-et adatokkal.mdb adatbázis és utána ezt a mappát megosztjuk (share). Az SQL SELECT lekérdezéshez még két objektumra van szükség. Ez a tuladonság objektum típusú mégpedig OleDbConnection. ami tulajdonképpen egy objektum. amelynek nem kell szükségszerűen kapcsolódnia egy adatbázishoz. sem OleDb előtagja (prefixe). vagy listát nyomtatunk. Szabadon lehet választani közülük. továbbítja a SELECT kérdést a kapcsolaton keresztül és végül feltölti a DataSet objektumot a SELECT által visszaadott adatokkal.ConnectionString=@"Provider=Microsoft. Sok saját tulajdonsága és metódusa van.mdb file-ra. hogy a Data Source-ban fel kell írni a teljes hálózati hozzáférési utat. Dataset A DataSet az a memória ahol a SELECT utasítás eredménye kerül tárolásra. akkor az adatbázist egy megosztott mappába kell helyezni.mdb. A többi számítógépről úgy lehet hozzáférni az adatbázishoz. Ehhez szükség van a C:\bazis mappában ott legye az Nwind. amelyeket kiírunk a képernyőre. Ha mindent pontosan csináliunk. mint egy mátrixot. ha Server nevű számítógép.mdb Access adatbázis. 3. Azaz a DataSet lehet egy mátrix sorozat. Adatok nevű mappájába van a Nwind. OleDbDataAdapter Ez az objektum a kapocs a parancs és a DataSet objektum között.mdb" Minden felhasználónak meg kell adni a jogot olvasásra és írásra (read/write) az Nwind. A SelectCommand tulajdonság határozza meg melyik parancsot kell végrehajtani. Elképzelhetjük úgy is.Data Source=\\Server\Adatok\Nwind.4. míg a ConnectionString: Obj. mivel egy paranccsal végrehajthatunk több SELECT kérdezést is. amelynek argumentuma DataSet típusú objektum. A CommandText tulajdonság string típusú és a segítségével tudjuk felírni a lekérdezést. amely sorokból és oszlopokból áll. hogy a DataSet fel van töltve adatokkal. a végeredmény.

A DataSet egy vagy több Table objektumot tárol a memóriában. amelyet kiírathatunk a felhasználó számára a DataGridView vagy valami más vezérlő segítségével. amely egy. a TextBox-ba beírt SELECT eredményeit tartalmazza. Minden alkalommal amikor egy SELECT kérdést akarunk feltenni.A két ismert vezérlő mellett (TextBox és Button). Ennek a táblának az adatait a DataGridView vezérlő segítségével fogjuk kiírni a képernyőre. Hozzunk létre egy új Windows Application-t és a kezdeti formára helyezzük el a kovetkező vezérlőket: TextBox – állítsuk be a MultiLine tulajdonságot True-ra. 12 . amelyik meg tudja jeleníteni a DataSet objektumban tárolt táblák adatait.textBox1. és hagyd meg a kezdeti nevét. Ez egy nagyon hatékony vezérlő. Button – állítsuk be a Text tulajdonságot Start-ra. és ennek eredményeként végül – a Fill metódussal megkapunk egy feltöltött DataSet objektumot. amely sorokból és oszlopokból áll. mint button1. szükség van egy harmadikra is DataGridView. és egy SELECT lekérdezés adatait tartalmazza. egymásközti kapcsolataik és kulcsfontosságú tulajdonságaik: Tiszteletben kell tartani az objektumok sorrendjét. A következő ábrán látható az egyes objektumok létrehozásának a sorrendje. Ezért a ScrollBars tulajdonságot Vertical-ra kell állítani. Tartsd meg a vezérlő kezdeti nevét . hogy a felhasználó begépelhesse az SQL SELECT kérdést. akár több sorban is. az eljárás ugyanaz. A példában csak Table objektum lesz a DataSet-ben. Minden Table objektum egy mátrix.

A textBox1 vezérlőbe beírt szöveget használjuk fel a parancs tulajdonságának úgy.Windows.0. A ConnectionString tulajdonság értékét figyelmesen kell beírni.DataGridView – úgy helyezd el. using System.Data.Connection = Kapcsolat.Drawing.Text. Visszatérve a button1_Click eseményre.Kapcsolat. ami az Anchor tulajdonság bekapcsolásával érhető el. Parancs. using System.Data Source = C:\bazis\Nwind.Collections. using System. using System. A vezérlőt oda kell kötni (Anchor) mind a négy oldalhoz.Text. Parancs – Command OleDbCommand Parancs = new OleDbCommand(). Parancs.Data. de nagyon fontos a szóköz a Data Source paraméterben.4.OLEDB. Szeretnénk. using System. A "Start" gombra kattintva minden végrehajtódik.ComponentModel. hogy az egy SQL SELECT kérdés legyen. A kis és nagy betűk nem fontosak. az előző diagramm alapján be kell írni a következő kódot: Kapcsolat – Connection OleDbConnection Kapcsolat = new OleDbConnection().mdb".CommandText =textBox1. a kapcsolat létrehozásától az adatok hozzákapcsolásáig a DataGridView vezérlőhöz. ami által megtartja a távolságot a forma mind a négy oldalától. ha a vezérlő követné a forma méretváltozásait.Forms.ConnectionString = @"Provider=Microsoft.Jet. using System. A gombra történő dupla kattintás után adjunk a kódhoz még egy using utasítást: using System.Generic. hogy elfoglalja a forma nagyobb részét. 13 CommandText .OleDb. using System.

CommandText = textBox1. Parancs. amelyik létrehoz egy vagy több táblázatot. A DataSet első táblájának bemutatása a DataGridView1 vezérlőben: DataGridView1.Fill(Ds). OleDbDataAdapter Da = new OleDbDataAdapter(). Data Source=C:\bazis\Nwind.DataSet: DataSet Ds = new DataSet().SelectCommand = Parancs. amelynek indexa 0 (Ds.mdb adatbázisban) Kattints a Start gombra. amely azután kinyitja a kapcsolatot és továbbítja az adatbázisnak a kérdés-t.OLEDB. A DataSet töltése: Da.DataSource = Ds. írd be a textBox1 szövegdobozba a következő lekérdezést: SELECT * FROM Customers (A Customers egy tábla az nwind.Tables[0]. Az OleDbDataAdapter osztály Fill metódusát használjuk fel a DataSet töltésére.DataSource = Ds.Fill(Ds). Tulajdonképpen ez a metódus indítja el a SelectCommand parancsot.SelectCommand = Parancs. DataSet Ds = new DataSet().0.4. Létrehozzuk a Da objektumot az OleDbDataAdapter osztály alapján. Da. Da. Létrehozzuk a Ds objektumot a DataSet osztály alapján.mdb". Da. Ha elindítjuk a programot. A click eseményhez tartozó teljes kód: OleDbConnection Kapcsolat = new OleDbConnection(). Kapcsolat. dataGridView1. A kérdés eredménye a DataSet-be kerül.Jet.ConnectionString = @"Provider=Microsoft.Text. OleDbCommand Parancs = new OleDbCommand(). DataAdapter: OleDbDataAdapter Da = new OleDbDataAdapter().Connection = Kapcsolat. A példában az adatforrás a DataSet első (és egyetlen) táblája.Tables[0]). amelyiknek az adatait meg akarjuk mutatni a vezérlőben. Ha mindent rendben van akkor a következő lesz az eredmény: 14 .Tables[0]. Parancs. A DataSource tulajdonság megmutatja melyik az adatforrás.

Melyik táblákat tartalmazza? Adatkötés . Hasonló dolgot lehet elérni a vezérlők nagy részével. és rakd sorba a termék neve szerint) További gyakorlat: Nyisd ki az Nwind. Próbáld ki a következő lekérdezést: SELECT ProductName. UnitPrice FROM Products ORDER BY ProductName (Mutasd ki a képernyőn a termék megnevezését és árát a Products táblából. Ez a kötési mód a simple data binding. A vezérlőket a szükséges táblákhoz kötjük a DataSet objektumban.mdb adatbázist Microsoft Access-ben és elemezd a tartalmát.Data binding Az eddigiekben tulajdonképpen adatkötést hajtottunk végre amikor beállítottuk a DataGridView vezérlő DataSource tulajdonságát. Az adatkötés azt jelenti. Erre két módszer létezik és. Mivel egy SELECT lekérdezés egy vagy több tábla adatait tudja visszaadni. a DataGridView. pl. Egyes vezérlők képesek arra. ez egy rendkívül elegáns mód arra. hogy a felhasználónak minimális programozással mutassuk be az adatokat.Észrevehető. Ebben az esetben elegendő beállítani a DataSource tulajdonságot. hogy egy vezérlőben automatikusan megjelennek egy adatbázis adatai. hogy a DataGridView vezérlőautomatikusn beállítódott (sorok és oszlopok). hogy az adatokat táblázatban mutassák be. a bemutatásra kerülő adatoktól függően (DataSource tulajdonság). legtöbbször valamilyen SELECT eredményeként. 15 . hogy melyiket használjuk az a vezérlő lehetőségeitől függ.

EventArgs e) 16 . "CompanyName"). és az adatokat a Checked tulajdonságához kötni. Access adatbázis és Windows Application projektum segítségével. Label és más hasonlók nem tudnak sorokat és oszlopokat bemutatni.Data. hogy meghatározhatjuk. Ez a complex data binding. Amikor a DataSet-et "megtöltjük" adatokkala az első az aktív rekord (azzala feltétellel. A vezérlő tulajdonságának és a tábla oszlopának (a DataSet objektumból) az összekötése sokféle lehet. Ehhez a következő objektumok szükségesek: – OleDbConnection – OleDbCommand – DataSet – OleDbDataAdapter Az adatok az NWind. amelynek csak igaz/hamis értéke lehet. Itt a TextBox1 vezérlőhöz hozzáadunk egy új kötést úgy. Ds.mdb adatbázisból származnak. ha az adatokat TextBox vezérlőben akarjuk bemutatni. Hogy lerövidíthessük a kód írását. Mindent ami szükséges ahhoz. akkor ezt a Text tulajdonságának a segítségével tesszük meg. UnitPrice.Más vezérlők. amelyben be akarjuk mutatni a már feltöltött DataSet objektumból a "CompanyName" oszlop értékét) TextBox1. hogy a vezérlő melyik tulajdonságához akarjuk kötni az aktív rekord mezőjét (oszlopának értékét). A munka során a felhasználó navigálhat a tételek (rekordok) között. Minden vezérlő. amely tartalmazhat többféle kötést ugyanahhoz a vezérlőhöz. a "CompanyName" oszlophoz kötjük. de ezek közül a gyakorlatban leginkább csak egy használatos. A Form1_Load függvénybe a következő kódot kell beírni: private void Form1_Load(object sender. Pl. a Form_Load eseményben hajtjuk végre. hogy ne kössünk két vagy több adatot a vezérlő ugyanahhoz a tulajdonsághoz. mint a TextBox. hamen bemutatják egy adott tétel (sor) mezőit (oszlop). Ezért be kell vezetni a Current record (aktív tétel) fogalmát. Fontos figyelni arra. logikus lenne a CheckBox vezérlőt használni. amelynek értékeit be akarjuk mutatni egy vezérlőben. ajánlatos a kód elejére beírni: using System. mégpedig a Products tábla következő oszlopai (mezői): – ProductName (a termék neve) – UnitPrice (a termék ára) – Discontinued (hozzáférhető-e a termék) Az adatbázisban alkalmazott SELECT lekérdezés: SELECT ProductName. amelyik bemutatásra kerül az hozzákapcsolt vezérlőkkel. Fontos megemlíteni.Add ("Text". de a leggyakoribb a következő szerkezet: (feltételezzük. Példa: Illusztráció az egyszerű és komplex adatkötéshez (simple és complex data bindigs). amelyik támogatja az adatkötést rendelkezik a DataBindings gyűjteménnyel. és ezáltal változtathatja az aktív rekordot.OleDb. mivel akkor hibaüzenetet kapunk. hogy a a formán van TextBox vezérlő. hogy a Text tulajdonságot a DataSet első táblájából. Discontinued FROM Products ORDER BY ProductName A formára történő dupla kattintásra megkapjuk a Form1_Load eseményt. hogy a forma nyitásakor az adatokat is kiírjuk. Ds név alatt. Ha az adatok között van olyan mező.Tables[0]. DataBindings. hogy egyáltalán léteznek rekordok).

DataSet Ds = new DataSet().Tables[0]. A két TextBox vezérlőben ki akarjuk írni a "ProductName" és "UnitPrice" oszlopok (mezők) tartalmát. Ehhez a következő két sort kell beírni a kódba: textBox1.4.DataSource = Ds. ami lehetővé teszi az egyszerű adatkötést. Parancs.Connection = Kapcsolat. Ds. OleDbCommand Komanda = new OleDbCommand(). Data Source=C:\baza\Nwind.Jet. hanem a "Checked" tulajdonságot.{ OleDbConnection Kapcsolat = new OleDbConnection().Add("Checked". "UnitPrice").mdb".Tables[0]. OleDbDataAdapter Da = new OleDbDataAdapter().DataBindings.OLEDB. "ProductName"). Da.Add("Text". hogy itt nem a "Text" tulajdonságot kötjük.Add("Text".Tables[0]. Ds. Kapcsolat. Discontinued FROM Products ORDER BY ProductName". UnitPrice. } Ezzel előkészítettük a terepet az egyszerű és komplex adatkötésre. Ehhez elegendő a következő sor hozzáadása a kódhoz: dataGridView1.0. textBox2.ConnectionString = @"Provider=Microsoft. 17 .DataBindings.CommandText = "SELECT ProductName. Ds. Parancs. Végül hozzá akarjuk adni a "Discontinued" oszlop értékét a CheckBox vezérlőhöz. Fontos. "Discontinued"). Ehhez a következő sort kell hozzáírni a kódhoz: checkBox1. Da.DataBindings.SelectCommand = Parancs. Most a formára el kell helyezni a felhasználói interface elemeit: – egy DataGridView vezérlőt – két Label vezérlőt – két TextBox vezérlőt – egy CheckBox vezérlőt A Text tulajdonságot Label és CheckBox vezérlőkön a kép alapján helyezzük el: Mutassuk be az adatokat DataGridView1 vezérlőben. Ennek az oszlopnak az értéke csak true vagy false lehet (ezért választottuk a CheckBox vezérlőt).Fill(Ds).Tables[0].

A . Lehetőleg kerülni kell a következő SELECT-et: SELECT * FROM Tábla_név Ezzel egy tábla egész tartalma kerül át a programunkba akár hálózaton keresztül is. egy – egy elszámolási időszak végén. a mi esetünkben a Ds objektum első táblájára. egy havi összegzés elkészítése végett. Az OleDbDataReader osztály Amikor a DataSet osztályt használtuk. Ehhez szükség van az Insert. A tételeken (rekordokon) nem kell előre – hátra sétálni. 18 . ami rendkívül megterhelő is lehet. Ds. automatikusan megváltoznak az alábbi adatok.Ennek eredményeképpen a következő eredmény kapjuk: Ha a táblában megváltoztatjuk az adatokat. hogy csak a ténylegesen szükséges adatokat olvassuk át az adatbázisból a programba. Gyakran több táblából kell egyszerre sok adatot kiolvasni pl. természetes. "ProductName"). Az adatokhoz való hozzáférés sorban (szekvenciálisan) történik. és lelassíthatja az egész rendszer működését. az elsőtől az utolsóig. a termék nevét. Ajánlatos odafigyelni. hogy az adatok változatlanok maradtak. Így a változások automatikusan megjelennek. Ez a hozzáférés a Forward Only (Csak előre). hogy a kiírás szinkronban van. Ha azonban megállítjuk az alkalmazást.Add("Text". Ha a forma címében szeretnénk megjelentetni pl.NET erre az esetre is kínál megoldást. Az átvitt adatok mennyisége a SELECT utasítástól függ. Az összes így létrehozott változás helyi jellegű. jusson eszünkbe. Ha ezek után elindítjuk a példát láthatjuk. gyakorlatilag a bázisból kiszűrt adatokat átvittük a saját programunkba. hogy a forma címe változik az aktív rekord értékétől függően. Írjunk hozzá még egy sort a programhoz: this. Végül próbáljuk ki a következőt: Maga a forma is rendelkezik DataBindings gyűjteménnyel. Szerencsére ez csak aránylag ritkán történik. Mivel minden vezérlő ugyanarra az adatforrásra (DataSource) van kötve.DataBindings. Update és Delete parancsokra.Tables[0]. Az adatbázis nem azsurálódik (aktuálizálódik) automatikusan. hogy magára a formára a this kulcsszóval hívatkozhatunk. és csak a DataSet objektumra vonatkoznak. újraindítás után észrevehetjük.

Az így kapott adatok csak olvashatók (Read Only). Az Ole(Sql)DbDataReader osztállyal történő munka során a következő lépéseket kell megtenni: – Az OleDbConnection osztály objektumainak létrehozása és definiálása. – Végül be kell zárni a kapcsolatot. Az objektumok létrehozásakor nem lehet használni a new konstruktort. A fentemlítettek érvényesek az SqlDbDataReader osztályra is.Data. A Read() metódus első meghívása adja az első rekordot. A gombra történő dupla kattintás után be kell írni a következő kódot: 19 .OleDb. ellenkező esetben pedig False-t. Ez az osztály határozza meg a SELECT SQL kérdést. A using szakaszba be kell írni using System. amely rekordonként beolvassa a megfelelő oszlopokat. hogy az olvasás végére értünk. illetve az SqlDbDataReader osztályok biztosítják. – Az OleDbDataReader osztály objektumainak létrehozása. és be kell fejezni a ciklust. ezt meg kell tenni az indítása előtt. Ennek a metódusnak a meghívása indítja el az egész folyamatot. Az ExecuteReader metódus nem nyitja meg automatikusan a kapcsolatot. – Ezután elindul egy ciklus. – Az OleDbCommand osztály objektumainak létrehozása és definiálása. A rekordokat az OleDbDataReader osztály Read() metódusával lehet elérni. A kapcsolatot az adatbázis felé feltétlenül létre kell hozni. hanem csak deklarálni kell az OleDbDataReader típusú változóként. és amikor megkapja. Ezt az OleDbDataReader. – Az OleDbCommand objektumának ExecuteReader metódusa OleDbDataReader típusú eredményt ad vissza.Nem kerül át az összes adat a server-ről a kliensre. Példa: Egy parancsgombra való kattintással a listbox vezérlőbe írjuk be az összes vevő nevét (CompanyName) a Customers táblából. A gomb neve btnStart. Az OleDbDataReader osztályban kizárólag SELECT kérdést lehet használni. és ezáltal mesemmisítjük az összes létrehozott objektumokat. Ez azt jelenti. a lista neve pedig lstVevok. Egy rekord meghatározott oszlopához a hozzáférés a következő: OleDbDataReader objektum név ["oszlop_név"]. Az adatátvitel rekordonként történik és így egy pillanatban csak egy rekord van jelen a kliensen. mert különben működése közben hibát jelez (run time error). ami tovább gyorsítja az átvitelt és tehermentesíti a server-t. A server metódusa bejelenti a következő rekord iránti igényét. és ezért a kliens és a hálózat terhelése minimális. True értéket ad vissza. amelyek listára vagy képernyőre kerülnek. amely adatokat lehet kérni az adatbázisból.

Text.CommandText = "SELECT CompanyName FROM Customers". hogy nincs több rekord.4.ToString ()). // Az összes felhasznált objektum megsemmisítése Kapcsolat.Read() == true) { // a CompanyName oszlopot átalakítjuk string-é // és hozzáadjuk a listához lstVevok.Dispose().mdb".Jet.// Az OleDbConnection objektum és a kapcsolódás paramétereinek létrehozása OleDbConnection Kapcsolat = new OleDbConnection(). mivel a Read( ) metódus visszaadott értéke false // ami azt jelenti.Dispose(). Az eredmény a következő 20 .Clear (). Parancs. típus és SELECT lekérdezés létrehozása OleDbCommand Parancs = new OleDbCommand().Close().Add (Dr["CompanyName"]. // Az OleDbCommand objektum.Connection = Kapcsolat. // A kapcsolat zárása Kapcsolat.Open ().CommandType = CommandType. Parancs. // A ciklus kezdete // a ciklus mindaddig végrehajtódik. } // a ciklus vége. Parancs. // Az ExecuteReader metódus végrehajtása Dr = Parancs.ExecuteReader().0.Dispose(). Parancs.OLEDB. // és a nemlétezőt akartuk átvenni.ConnectionString = @"Provider=Microsoft. Dr.Items. //A kapcsolat megnyitása – kötelező Kapcsolat.Items. azaz az utlsót is elolvastuk. // A lista tartalmának törlése (ha van tartalma) lstVevok. Kapcsolat. amíg a Read( ) metódus true értéket ad vissza // azaz létezik a következő rekord és az átkerül a klienshez while (Dr.Data Source=C:\bazis\Nwind. // Az OleDbDataReader objektum deklarálása OleDbDataReader Dr.

amelyek az előzőekben felsorolt oszlopokba kerülnek. és az csak a megfelelő értéktípussal tölthető fel. amelyekbe értékeket akarunk írni.Ez a leggyorsabb. Új adatok Az adatbevitel az adatbázisba egy új rekord hozzáadást jelenti egy táblához. amelyhez hozzá akarjuk adni az új tételt. …) VALUES (érték1. érték3. Az oszlopok listájának és az értékek listájának egyforma számú eleme kell. Adattípusok Értékadáskor figyelembe kell venni az oszlop típusát. A VALUES után következik az értékek listája. Pl. a "legolcsóbb" módja nagy mennyiségű adat feldolgozásának. hogy a tábla minden oszlopába értéket akarunk írni. Az SQL utasítás általános alakja INSERT INTO TáblaNév (oszlop1. ha minden adatot egy táblából . többszörös hozzáadás (Multiple Insert). SzuletesiEv) VALUES ('Kovács'. Ha nincs egy eleme sem. akkor magától értetődik. és ami az erőforrásokat illeti. Ezt a lehetőséget nem ajánlatos használni. oszlop2. INSERT INTO Diakok (Vezeteknev. érték2. …) A TáblaNév annak a táblának a neve. 1994) 21 . Nev. Ez a lista szabadon alakítható. Ezután következik az oszlopok listája. Létezik ún.külső file-ból. szöveges file-ból – átviszünk egy másik táblába). oszlop3. amelynél egy utasítással több adatot adunk hozzá (pl. hogy legyen. 'János'.

mint pl. Az értékeket a felhasználói interface adja meg. Az OleDbCommand objektum ExecuteNonQuery metódusa az adott kapcsolatnál egy SQL utasítást indít el. Nev. Pl. INSERT INTO Diakok (Vezeteknev. Ezért az adatbázis létrehozásakor definiálni kell ezeket a szabályokat. amelyek az oszlopba beírandó értékekre vonatkoznak. amellyel végrehajtódik az adatbeírás az adatbázisba. hogy az INSERT utasítás tökéletesen van felírva. CompanyName és City. txtCity néven. amelyek biztosítják. mivel a '300' adat szöveges adatként kerül az adatbázisba. hogy a program írásakor pontosan láthassuk. mert az ellentétes az elsődleges kulcs értékével. … ) és az adat hossza. 15 karakter hosszú és nem kötelező beírni. Ilyen lehet pl. max. 5 karkater hosszú és a Customers tábla elsődleges (primáris) kulcsa. A formán el kell helyezni három TextBox vezérlőt: txtCustomerID.ban Ha lehetővé akarjuk tenni a felhasználó számára az adatbevitelt az adatbázisba. Végül el kell helyezni még egy parancsgombot is. és hibát jelez. Alkalmazás a C# . Ezt a parancsot a CommandText tulajdonság segítségével lehet megadni (ebben az esetben ez az INSERT utasítás). változtatunk vagy törlünk. SzuletesiEv) VALUES ('300'. az adat típusa (szöveg. A TextBox vezérlők elé ki kell írni a megfelelő cimkéket (Label vezérlő). A CommandText tulajdonságot úgy kell kialakítani. először létre kell hozni a a megfelelő felhasználói interface-t ahol be lehet írni vagy ki lehet választani az új adatokat. szám. dátum. amelyik mindegyiknél egyedi érték. max. hogy egy helyes INSERT utasítást kapjunk. txtCompanyName.: a mező értékének kötelező bevitele. 'János'. Előfordulhat. – A City szöveg típusú. Ehhez csak az OleDbConnection és az OleDbCommand objektumokra van szükség. A következő nyilvánvaló feltétel. hogy az adott oszlopba kötelező-e beírni valamilyen értéket.Figyelemre méltó. amelyben három oszlop értékét visszük be: CustomerID. max. hogy melyik mezőbe mit kell beírni. Ezt ajánlatos még az adat adatbázisba való átküldés előtt megtenni. hogy a bázisba csak helyes értékek kerüljönek. Így az adatbázis "saját magáról gondoskodik". hogy a szöveges adatokat aposztrofusok közé kell tenni (SQL – szabvány). – A CompanyName szöveg típusú. 1994) Helyes-e? Igen. de az adatbázis nem engedélyezi az adabevitelt. amelyeket ki kell elégíteni amikor rekordot írunk be. Az összetett feltételekhez tartozik a tábla elsődleges kulcsa (primary key). Ehhez ismerni kell ezeknek az oszlopoknak a tulajdonságait: – A CustomerID szöveg típusú. Példa: A Northwind Access adatbázis Customers táblájában adjunk hozzá egy rekordot. a numerikus értékekhez nem kell semilyen külön jelölés. Az adatbázistól függően felállítható még sok más feltétel is. az igazolvány szám. Feltételek Az adatbázisba felállíthatók feltételek is (Constraints). 22 . Már a gépeléskor végre lehet hajtani az alapvető ellenőrzéseket. hogy melyik értéket melyik oszloba kell beírni. Alapfeltétel az oszlop adattípusa. amelyek jelzik a felhasználónak. 40 karakter hosszú és kötelező valamit beírni.

Trim() == "") { MessageBox.Text. txtPrezime. és utána a következő kód: // A kötelező mezők ellenőrzése if (txtCustomerID. '" + . és így könnyű hibázni.Format ("INSERT INTO Customers (CustomerID. ami nagy figyelmet igényel és jelentős hibaforrás lehet: String InsSql. A megfelelő INSERT utasítás kialakításához össze kell rakni a megfelelő string-eket.Text). txtIme. txtCompanyName.Text) A {0} és {1} helyekre a string-ben txtVezeteknev és txtNev vezérlőkbe beírt szöveg kerül. és nevem {1}". } // Az OleDbConnection objektum és a kapcsolat paramétereinek létrehozása 23 .Text.Format ("Az én vezetéknevem {0}. Dupla klikk a parancsgombra.Trim() == "") { MessageBox.Text. 40 és 15 értékre. CompanyName.A bevitelre kerülő szöveg hosszát a TextBox vezérlő MaxLength tulajdonságával állítjuk be 5. txtCustomerID. City) VALUES ('{0}'. '{1}'. CompanyName. InsSql = "INSERT INTO Customers (CustomerID.Show("Ird be a vevő nevét "). Ezért célszerű használni a string Format metódusát. a következőképpen: string.Show("Ird be a vevő kódját"). A mi esetünkben (példa) a VALUES lista kialakításához az INSERT utasításban az értékeknek aposztrófusok közé kell kerülniük. return. City) VALUES ('" + txtCustomerID.Text. '{2}')". } if (txtCompanyName..Text.Text + "'.) Túl sok az aposztrófus és az idézőjel. return. txtCity. Például: string.. A Format metódus string típusú adatot ad vissza.

0. Parancs.Show("A vevő adatai bekerültek az adatbázisba"). '{2}')". Kapcsolat. a Bevitel gombra kattintva a következő üzenet jelenik meg: 24 .Open(). feltétlenül haszálni kell a try – catch szerkezetet try { Kapcsolat.Data Source=C:\bazis\Nwind. string InsSql. // Üzenet a felhasználónak.Show(ex. A program indítása után ki kell próbálni: Ha mindent jól írtunk be. // A kapcsolat megnyitása és a lekérdezések végrehajtása. utasítást. txtCity.OleDb.Format("INSERT INTO Customers (CustomerID.CommandType = CommandType.txtCustomerID.OleDbConnection Kapcsolat = new OleDbConnection().OLEDB. City) VALUES ('{0}'.'{1}'. InsSql = string. } A using szekcióba feltétlenül hozzá kell adni a using System.ExecuteNonQuery().Jet. Parancs. CompanyName. Parancs.Text.ConnectionString = @"Provider=Microsoft. Parancs.Text. hogy a vevő adatai sikeresn bekerültek az adatbázisba MessageBox.Data. } catch (Exception ex) { // Hiba történt – üzenet kiírása MessageBox. txtCompanyName. // Az OleDbCommand objektum.Text). típus és SELECT lekérdezés létrehozása OleDbCommand Parancs = new OleDbCommand(). // Mivel törtéhet hiba.mdb".Text.4.Connection = Kapcsolat.ToString()).CommandText = InsSql.

Ebben az esetben két alapvető lehetőség áll rendelkezésre.Ha még egyszer kattintunk a Bevitel gombra. A másik szempont az adatbázisok létrehozásánál. 25 .ToString()). Ilyenkor egy vagy több rekordot kell eltávolítani. Ha a szülőtáblából (a reláció 1 oldalán álló tábla) kitörölnek egy rekordot. a következő hibaüzenet jeleni meg: Az üzenet szerint megpróbáltunk egy olyan tételt (rekordot – adatsort) beírni az adatbázisba.Show(ex. hogy rekord törlésénél nem csak egy rekord törlődik. A program hibaüzenetet generált és végrehajtotta a MessageBox. mert egy rekord törlésével elvileg újabb rekordok törölhetők a relációs táblákban. Pl. Ezek relációs kapcsolatban vannak és NINCS bekapcsolva a Cascade Delete törlés. Ez egy biztonságos mechanizmus. Ez a művelet végleges. utasítást a Catch blokkban. hogy ha törölni akarunk egy Vevő tételt. és a törölt adatokat nem lehet visszaállítani. A lépcsőzetes törlés azért veszélyes. az adatbázis automatukusan leellenőrzi. mivel a CustomerID a Customers tábla primáris (elsődleges) kulcsa. engedélyezi a törlést. amelynél a CustomerID értéke megegyezik az előző vevőével. Két tábla közötti reláció felállításánál mindig meg kell határozni. kivételes esetektől eltekintve. azoknak a rekordoknak az esetében. Az esetek többségében ez így helyes. hanem sor kerülhet lépcsőzetes törlésre is. ellenkező esetben nem engedélyezi. Ez aszt jelenti. hogy mi történik ha a szülő táblában törölnek egy tételt. amely megakadályozza nagy számú rekord véletlen vagy szándékos törlését. Ez a lépcsőzetes törlés (Cascade delete). akkor automatikusan törlődik az összes rekord a relációs táblából (a reláció N oldalán álló tábla). Az adatok törlése az adatbázisból A törlést nagyon figyelmesen kell végrehajtani. amelyek relációs kapcsolatban álltak a törölt rekorddal. Tilos a rekord törlése a szülő táblából. Ha egy sincs. az Access Nwind adatbázisban jelen van a Customers (Vevők) tábla és az Orders (Megrendelések) tábla. és hibát jelez. ha a relációs táblában van legalább egy kötött rekordja. hogy tartozik-e hozzá legalább egy Megrendelés.

néhol igazolt a lépcsőzetes törlés engedélyezése. a DELETE csak a tábla tételeit törli. Példa: Az ALFKI sifrával rendelkező vevő törlése: DELETE FROM Customers WHERE CustomerID = 'ALFKI' A 10260-as számú megrendelés törlése: DELETE FROM Orders WHERE OrderID = 10260 A 10200-tól 10210-ig terjedő megrendelések törlése (beleértve a kezdő és végső számúakat is): DELETE FROM Orders WHERE OrderID BETWEEN 10200 AND 10210 A C# alkalmazás és példa 26 . hogy a megrendelés törlésével automatikusan törlődnek a tételei. A DELETE utasítás Az SQL DELETE utasítás a következő: DELETE FROM TáblaNév WHERE Feltétel A Feltétel megadása nem kötelező. A feltétel mindig az adott tábla primáris (elsődleges) kulcsának konkrét értéke (vagy intervalluma). Az Nwind adatbázisban lépcsőzetes törlés lehetséges az Orders (Megrendelések) és az Order Details (Megrendelés tételek) táblákon. ezért a gyakorlatban majdnem mindig felírásra kerül a WHERE feltétel. a másodikkal pedig magát a vevőt. és melyek a következményei. magát a táblát nem. A táblát az adataival együtt a DROP TABLE TáblaNév parancs törli. hogy lehet törölni a vevőt (és az összes hozzátartozó megrendelést) ha tényleg azt akarjuk? Ez két SQL utasítással hajtható végre – az elsővel töröljük a vevő összes megrendelését. hogy ez a lehetőség. Ha programból történik a törlés.Felvetődik a kérdés. hogy van beállítva. Esettől függően. A DELETE utasítás NEM törli a táblát mint az adatbázis struktúráját. Ez azt jelenti. de ha nem írják fel akkor a WHERE nélkül az tábla ÖSSZES rekordja törlődik (ha a többi feltétel is megengedi). néhol nem. ismerni kell.

és utána a gombra kattintva végrehajtja a törlést.Open(). majd klikkelj a gombra.OLEDB. Kapcsolat. Érvényes megrendelés számok 10248-tól do 11077-ig.ConnectionString=@"Provider=Microsoft.Data Source=C:\bazis\Nwind.4. Az egész eljárást feltétlenül egy ExecuteNonQuery blokkba kell helyezni.OleDb. és utána végre kell hajtani. A példában a felhasználó beír egy megrendelés számot. Kapcsolat.CommandText = "DELETE FROM Orders WHERE OrderID=" + txtOrderID. Parancs. Létre kell hozni egy megfelelő DELETE parancsot a txtOrderID-be bevitt szöveg alapján.Connection = Kapcsolat.A DELETE utasítás alkalmazásához szükséges a kapcsolat az adatbázishoz (OleDbConnection). A háttérben automatikusan törlődnek a megrendelés tételei is az Order Detailstáblából.Jet.Close(). } Indítsd el a programot. a parancs (OleDbCommand). Parancs.ToString()).Text.Show("A rekord törölve"). amelyet törölni szeretne.ExecuteNonQuery(). Tehát az Orders táblából kell törölni egy tételt.0. Parancs. A TextBox vezérlő név (name) tulajdonsága legyen txtOrderID.Show (hiba. és írd be a megrendelés számát a szövegdobozba. MessageBox. A txtOrderID-be bevitt értéket kell beírni a DELETE utasítás WHERE feltételébe: DELETE FROM Orders WHERE OrderID = txtOrderID_be_bevitt_érték A parancsgomb klikk eseményéhez a következő kódot kell beírni: OleDbConnection Kapcsolat = new OleDbConnection(). OleDbCommand Parancs = new OleDbCommand(). amelynek a primáris (elsődleges) kulcsa az integer típusú OrderID.mdb". amelynek az ExecuteNonQuery metódusát kell használni a DELETE utasítás indításához. A using szekcióba be kell írni: using System. A kezdeti formára el kell helyezni egy TextBox vezérlőt és egy parancsgombot. } catch (Exception hiba) { MessageBox. 27 .Data. try { Kapcsolat.

és amelyek vele együtt törlődnek (az OrderId oszlop – a tábla külső kulcsa). amelyik ekkor akarja változtatni vagy törölni a rekordot. ha egy termelő összes árúcikkének az árát akarjuk megváltoztatni. és vele kapcsolatban ezek a problémák nem jelentkeznek. konfliktus helyzetek állhatnak elő. valójában hány rekordot töröltünk? A válasz: 4-et: egyet a megrendelés az Orders táblából. és így nem törlődött egy rekord sem. Mielőtt nagyobb mennyiségű 28 . A képen az [Order details] tábla három tétele láttható. hogy több rekordot kell megváltoztatni. hibaüzenetet kap. és három tételét az [Order details] táblából a lépcsőzetes (kaszkád) törlés miatt. Az adatok változtatása az adatbázisban tartós jellegű. Minden más felhasználó. Ezért a DELETE és az UPDATE utasítás a többfelhasználós környezetben generálhat hibaüzenetet. Az adatbázis adatainak megváltoztatása A változtatás jellemzően egy rekordra vonatkozik. A többfelhasználós környezet Ha több felhasználó egyidőben használ egy adatbázist. Ha kitöröljtük a 10400-as megrendelést. egy másik pedig pont akkor akarja ugyanazt a rekordot törölni. mert csak a WHERE klauzula nem engedélyezett. Pl. amelyek a 10400-as megrendeléshez kapcsolódnak. hogy valamelyik felhasználónak exkluzív joga van az adott rekordra. hibaüzenetet kap. és nem lehet a változtatást visszavonni. A figyelmetlenül végrehajtott változtatás visszavonhatatlanul megrongálhat nagy mennyiségű adatot. és csak nagyon az összeset. hogy minden rendben van. a program visszaigazolja. Ez technikailag így is van. ezért az adatok változtatását nagyon figyelmesen kell végrehajtani. A rekord változtatásakor az adatbázis automatikusan lezárja (lock) a rekordot. Ilyen szempontból az INSERT utasítás biztonságos. és így jelzi. de előfordulhat. ha egy felhasználó szerkeszt egy rekord. Pl.Ha nem létező megrendelés számot írunk be.

amelyet az adatbázison végre akarunk hajtani vagy végrehajtódik teljes egészében vagy egyáltalán nem hajtódik végre. amelyet az utasítás addig a pillanatig végrehajtott. vagy akár egy SELECT kifejezés skaláris értéke (egy adott érték. Ezzel egy időben egy másik felhasználó elindít egy utasítást. ami változtatást és a törlést illeti. Nincs rá mód. az 1 kulccsal rendelkező árúcikk árát. Bevezetjük a tranzakció fogalmát. A következő lekérdezések nem adnak vissza skaláris értéket: SELECT UnitPrice. az 'ALFKI' primáris kulccsal rendelkező vevőnél.. Nincs "Undo". amely megváltoztat nagyobb számú rekordot. Például: SELECT UnitPrice FROM Products WHERE ProductID=1 Ez a lekérdezés egy skaláris értéket ad vissza. A korszerű adatbázisok megoldják ezeket a veszélyes helyzeteket. . így csak egy rekord vagy egy sem fog megváltozni. hogy melyik rekordok változtak meg. Az elv egyszerű: Minden utasítást. nem tömb vagy mátrix). hogy megállapítsuk. Mivel adott az elsődleges kulcs értéke adott. Mi történik a következő (tipikus) helyzetben: Az első felhasználó változtat egy rekordot. akkor az a rekord zárva van. Ha egy felhasználó változtatja a rekordot. Ebben a helyzetben automatikusan végrehajtódik egy Undo utasítás és az adatok visszakerülnek az utasítás előtti állapotba.. matematikai kifejezés értéke. ajánlatos biztonsági másolatot (Backup) készíteni az adatbázisról. és melyek nem. és elindítottunk egy több ezer rekordot érintő változtatást. Ezen forgatókönyv szerint a hiba megjelnése után maga az adatbázis megsemmisít minden előző akciót. hibaüzenetet kapnak. OszlopNév = Érték2. amelyiket az első éppen változtatja: Mi történik ebben a hekyzetben? A régebbi adatbázisokban a lezárt rekordig megváltoznának a rekordok. és így ha ezekkel a műveletekkel próbálkoznak. az a rekord zárva a többi felhasználó számára.adatot megváltoztatnánk. Quantity FROM Products WHERE ProductID = 1 SELECT UnitPrice 29 . és csak utána megváltoztatni az adatokat. Az UPDATE utasítás Az UPDATE utasítás szintaxisa UPDATE TáblaNév SET OszlopNév1=Érték1. Tehát ebben az esetben a rekordok egy része megváltozna. a másik része nem (Rémálom!). köztük azt is. Address='Nova adresa kupca' WHERE CustomerID = 'ALFKI' Ebben az SQL utasításban a Customers táblában új értéket kell beírni a City és Address oszlopokba (mezőkbe). WHERE Feltétel Például: UPDATE Customers SET City='Beograd'. Az új érték lehet állandó. Figyelembe kell venni a többfelhasználós munkát is. és akkor hibaüzenet keletkezne és megállna a folyamat.

hogy melyik szövegdobozba. Fel kell használni az OleDbCommand osztály ExecuteNonQuery metódusát. Ebben a példában megtapasztalhatjuk. a százalék és az árúkategória részére. amelynek segítségével a felhasználó elindíthatja az UPDATE utasítást.OleDb. Mind a két említett oszlop numerikus egész típusú. hogy a felhasználó tudja. Tehát nagyon óvatosan kell bánni ezzel az utasítással! Minta alkalmazás A Products (Termék) táblában szeretnénk megváltoztatni az árakat (UnitPrice oszlop). be kell írni a következő kódot: 30 . A using szakaszba be kell írni using System. amely ebben az esetben az UPDATE utasítás megfelelő formáját kapja.Data. és később ez alapján küldünk egy üzenetet a felhasználónak a megváltoztatott rekordok számáról. hogy ez a metódus. és az előző példa szerint minden vevőnél a város Beograd lenne. hogy a Products tábla több. és azután végrehajtja az utasítást. mint egy tételt tartalmaz) Mi történne ha az UPDATE utasítást WHERE kritérium nélkül hajtanánk végre? Ebben az esetben minden rekordot megváltoztatnánk. mint értéket. Ebben az esetben az UPDATE uatsítás a következő: UPDATE Products SET UnitPrice = UnitPrice * (1+5/100) WHERE CategoryID = 3 A felhasználó a az interface-en keresztül beírhatja százalékos növekedés (csökkenés) értékét és a termék kategóriát. melyik adatot kell beírnia. Az elve megegyezik azzal. Ezt az értéket egy int típusú változóba helyezzük. Ugyanígy el kell helyezni két címkét is.FROM Products (azzal a feltétellel. Dupla kattintás után a "Változtatás" gombra. minden árúcikknél. amelyek az adott kategóriába tartoznak (CategoryID oszlop). amelyek a 3 kategóriába tartoznak 5%-al meg akarjuk növelni. visszaadja a megváltoztatott (illetve töröl vagy hozzáadott) rekordok számát. amelyet az INSERT és a DELETE utasítások esetében használtunk. és a címük is megegyezne. és parancsgombra. Például minden árúcikk árát. A kezdőformán szükségünk lesz két TextBox vezérlőre. A változás a meglévő árhoz viszonyítva adott százalékkal kisebb vagy nagyobb.

Open(). Parancs. a program nem fog hibát jelezni.Show("Megváltozott " + MegvaltoztatottRekordok. ha minden úgy van beírva ahogy kell.Jet.Show(greska. txtKategoria. OleDbCommand Parancs = new OleDbCommand(). MegvaltoztatottRekordok = Parancs.CommandText = string. Ha a felhasználó ettől ezektől különböző értéket ír be.int MegvaltoztatottRekordok = 0. MessageBox.Close().mdb".Text. A "Változtatás" gombra történő kattintás után.Format("UPDATE Products SET UnitPrice=UnitPrice*(1+({0}/100)) WHERE CategoryID={1}". Kapcsolat. Ha szám helyett a kategóriába egy betűt írunk a "Változtatás" után a következő üzenet jelenik meg: 31 .4. OleDbConnection Kapcsolat = new OleDbConnection().ConnectionString = @"Provider=Microsoft. try { Kapcsolat.ToString() + " rekord").0. a fenti információ fog megjelenni.OLEDB.ToString()). } Az alkalmazás elindítása után Az árúkategória megenegedett értékei 1-től 8-ig vannak. } catch (Exception greska) { MessageBox.ExecuteNonQuery(). Parancs.Connection = Kapcsolat. txtProcenat. de egy árat sem változtat meg.Text). Kapcsolat.Data Source = C:\bazis\Nwind.

mivel szöveget írtunk arra a helyre. A fejlesztés során azonban hasznos az ilyen üzenet.Szemmel láthatóan hiba történt. Ha a kategória mezőbe pl. de mégsem történik hiba. és ezért a tryblokkk catch ágába kerültünk. és ezért kaptuk ezt az üzentet. 32 . mert rávilágíthat a hiba okára. A táblában egy rekord sem elégíti ki ezt a feltételt. tehát egy sem fog megváltozni. ahová számot kellett volna. A gyakorlatban ilyen helyekre felhasználóbarát üzenetet kell írni a rendszerüzenet helyett. a "Változtatás" után a következő üzenet jelenik meg: A 99-es kategória nem létezik. 99-et írunk.