Példák SQL lekérdezésekre a MySQL adatbázisban. A T-SQL alapjai. DML Sql lekérdezés rekordok beszúrásához fájlból

Az INSERT utasítás új rekordokat szúr be egy táblába. Ebben az esetben az oszlopértékek lehetnek szó szerinti állandók, vagy egy segédlekérdezés végrehajtásának eredménye. Az első esetben külön INSERT utasítást használunk az egyes sorok beszúrására; a második esetben annyi sor kerül beszúrásra, amennyit az allekérdezés visszaad.

Az operátor szintaxisa a következő:

    BESZÁLLÍTÁS: [ (,...) ]

    (ÉRTÉKEK(,…))

  1. | (ALAPÉRTELMEZETT ÉRTÉKEK)

Amint a bemutatott szintaxisból látható, az oszlopok listája nem kötelező (a szintaxis leírásában a szögletes zárójelek jelzik ezt). Ha hiányzik, a beszúrt értékek listájának teljesnek kell lennie, azaz a táblázat összes oszlopához meg kell adni az értékeket. Ebben az esetben az értékek sorrendjének meg kell felelnie a CREATE TABLE utasításban megadott sorrendnek ahhoz a táblázathoz, amelybe a sorokat beilleszti. Ezenkívül ezeknek az értékeknek ugyanolyan adattípusúaknak kell lenniük, mint az oszlopoknak, amelyekbe be vannak írva. Példaként fontolja meg egy sor beszúrását a terméktáblázatba, amelyet a következő CREATE TABLE utasítás hozott létre:

    CREATE TABLE termék

    készítő karakter (1) NOT NULL,

    model varchar(4) NOT NULL,

    írja be a varchar(7)-et NOT NULL

Tegyük fel, hogy a B gyártó 1157-es PC-modelljét szeretné hozzáadni ehhez a táblázathoz.

    INSERT INTO Product

    ÉRTÉKEK ("B" , 1157 , "PC" );

Ha megadja az oszlopok listáját, megváltoztathatja azok „természetes” sorrendjét:

    INSERT INTO Termék (típus, modell, gyártó)

    ÉRTÉKEK ("PC" , 1157 , "B" );

Úgy tűnik, hogy ez egy teljesen felesleges funkció, ami csak még bonyolultabbá teszi a tervezést. Azonban akkor nyer, ha az oszlopok alapértelmezett értékekkel rendelkeznek. Tekintsük a következő táblázatszerkezetet:

    TÁBLÁZAT LÉTREHOZÁSA termék_D

    készítő karakter (1) NULL,

    modell varchar(4) NULL,

    típus varchar (7 ) NOT NULL ALAPÉRTELMEZETT "PC"

Vegye figyelembe, hogy itt az összes oszlop értéke alapértelmezett értékkel rendelkezik (az első kettő NULL, az utolsó oszlop pedig a PC típusú). Most írhatnánk:

    INSERT INTO Product_D (modell, gyártó)

    ÉRTÉKEK(1157; "B");

Ebben az esetben a sor beszúrásakor hiányzó értéket az alapértelmezett érték helyettesíti - PC. Vegye figyelembe, hogy ha egy oszlop nem kap alapértelmezett értéket a CREATE TABLE utasításban, és egy NOT NULL megszorítás van megadva, amely megtiltja a NULL használatát az adott táblázatoszlopban, akkor a rendszer a NULL alapértelmezett értékét feltételezi.

Felmerül a kérdés: lehetséges-e nem megadni az oszlopok listáját, és ennek ellenére az alapértelmezett értékeket használni? A válasz igen. Ehhez ahelyett, hogy kifejezetten megadná az értéket, használja a fenntartott DEFAULT szót:

    INSERT INTO Product_D

    ÉRTÉKEK ("B" , 1158 , ALAPÉRTÉKELÉS );

Mivel minden oszlopnak van alapértelmezett értéke, az alapértelmezett értékekkel rendelkező sor beszúrásához írja be:

    INSERT INTO Product_D

    ÉRTÉKEK(ALAPÉRTELMEZETT, ALAPÉRTELMEZETT, ALAPÉRTELMEZETT);

Erre az esetre azonban van egy speciális DEFAULT VALUES konstrukció (lásd operátor szintaxis), amellyel a fenti operátor átírható a formába.

    INSERT INTO Product_D ALAPÉRTELMEZETT ÉRTÉKEK ;

Vegye figyelembe, hogy amikor egy sort beszúr egy táblázatba, a táblára vonatkozó összes korlátozás be van jelölve. Ezek lehetnek elsődleges kulcs vagy egyedi index megszorítások, CHECK kényszerek vagy hivatkozási integritási megszorítások. Ha bármely megszorítás megsértődik, a sorbeszúrást a rendszer elutasítja. Tekintsük most egy segédlekérdezés használatának esetét. Tegyük fel, hogy be kell szúrnunk a Product_D táblába a Product tábla összes személyi számítógép-modelljeivel kapcsolatos sorát (type = 'PC'). Mivel a szükséges értékek már megtalálhatók néhány táblázatban, a beszúrt sorok manuális generálása egyrészt nem hatékony, másrészt beviteli hibákat is megengedhet. Egy segédlekérdezés az alábbi problémákat oldja meg:

Ebben az esetben indokolt a „*” szimbólum használata a részlekérdezésben, mivel az oszlopok sorrendje mindkét tábla esetében azonos. Ha ez nem így lenne, akkor az INSERT utasításban, az allekérdezésben vagy mindkettőben oszloplistát kell alkalmazni, amely megfelel az oszlopok sorrendjének:

Itt, mint korábban, nem minden oszlopot adhat meg, ha a meglévő alapértelmezett értékeket szeretné használni, például:

Ebben az esetben a Product_D tábla típusoszlopát az összes beszúrt sornál az alapértelmezett PC értékkel helyettesítjük.

Ne feledje, hogy predikátumot tartalmazó részlekérdezés használatakor csak azok a sorok kerülnek beszúrásra, amelyeknél a predikátum értéke IGAZ (nem UNKNOWN !). Más szóval, ha a Termék tábla típusoszlopa NULL lenne, és ez az érték több sorban szerepelne, akkor ezek a sorok nem kerülnek be a Product_D táblába.

Az UNION ALL záradékkal sort képező részlekérdezés mesterséges technikája lehetővé teszi, hogy leküzdje az INSERT utasításban egy sor beszúrásának korlátozását, ha a VALUES záradékban a sorkonstruktort használja. Tehát ha több sort kell beszúrnunk egy INSERT utasítással, akkor ezt írhatjuk:

    INSERT INTO Product_D

    SELECT "B" AS gyártó, 1158 AS modell, "PC" AS típus

    UNION ALL

    SELECT "C", 2190, "Laptop"

    UNION ALL

    KIVÁLASZTÁS "D" , 3219 , "Nyomtató" ;

Az UNION ALL használata akkor is előnyösebb, mint az UNION, még akkor is, ha az ismétlődő sorok hiánya garantált, mivel ebben az esetben nem történik ellenőrzés a duplikációk kiküszöbölésére.

Meg kell jegyezni, hogy több sor beszúrása a sorkonstruktor segítségével már megvalósult Relációs adatbázis-kezelő rendszer (DBMS), amelyet a Microsoft Corporation fejlesztett ki.Strukturált lekérdezési nyelv) egy univerzális számítógépes nyelv, amelyet relációs adatbázisokban lévő adatok létrehozására, módosítására és kezelésére használnak. SQL szerver 2008. Ennek a lehetőségnek a birtokában az utolsó lekérdezés a következőképpen írható át:

    INSERT A termék_D ÉRTÉKEIBE

    ("B", 1158, "PC"),

    ("C", 2190, "Laptop"),

Bejegyzések törlése

Rekordok táblából való törléséhez használja a DELETE operátort:

DELETE FROM Tablename WHERE feltétel;

Ez az operátor eltávolítja azokat a rekordokat (nem az egyes oszlopértékeket) a megadott táblából, amelyek megfelelnek a megadott feltételnek. A feltétel egy logikai kifejezés, amelynek különféle konstrukcióit korábbi laborokban tárgyaltuk.

A következő lekérdezés törli azokat a rekordokat az Ügyfél táblából, ahol az Lname oszlop értéke "Ivanov":

TÖRLÉS AZ Ügyféltől

WHERE Lname = "Ivanov"

Ha a táblázat több Ivanov vezetéknevű ügyfélről tartalmaz információkat, akkor mindegyik törlődik.

A WHERE utasítás tartalmazhat egy részlekérdezést az adatok kiválasztásához (SELECT utasítás). A DELETE utasításban lévő segédlekérdezések pontosan ugyanúgy működnek, mint a SELECT utasításban. A következő lekérdezés eltávolítja az összes ügyfelet Moszkva városából, míg a város egyedi azonosítóját egy segédlekérdezés adja vissza.

TÖRLÉS AZ Ügyféltől

WHERE IdCity IN (SELECT IdCity FROM City WHERE CityName = "Moszkva")

A Transact-SQL kiterjeszti a szabványos SQL-t azáltal, hogy lehetővé teszi egy további FROM záradék használatát a DELETE utasításban. Ez a bővítmény, amely egy összekapcsolást ad meg, használható a WHERE záradékban szereplő részlekérdezés helyett a törölni kívánt sorok megadásához. Lehetővé teszi adatok megadását a második FROM-ból, és a megfelelő sorok eltávolítását a táblázatból az első FROM záradékban. Konkrétan az előző lekérdezés a következőképpen írható át

TÖRLÉS AZ Ügyféltől

Ügyféltől k BELSŐ CSATLAKOZÁS

A rekordok táblából való törlése veszélyes abból a szempontból, hogy az SQL kifejezés megfogalmazása során fellépő szemantikai (de nem szintaktikai) hibák visszafordíthatatlan adatvesztésének kockázatával járnak. A gondok elkerülése érdekében a rekordok törlése előtt ajánlott először a megfelelő kiválasztási lekérdezés futtatása, hogy megtudja, mely rekordok törlődnek. Így például a korábban tárgyalt törlési lekérdezés végrehajtása előtt nem ártana lefuttatni a megfelelő kiválasztási lekérdezést.

KIVÁLASZTÁS *

Ügyféltől k BELSŐ CSATLAKOZÁS

Város c ON k.IdCity = c.IdCity ÉS c.CityName = "Moszkva"

Ha az összes rekordot törölni szeretné egy táblából, egyszerűen használja a DELETE utasítást a WHERE kulcsszó nélkül. Ebben az esetben maga a tábla a benne definiált összes oszloppal mentésre kerül, és készen áll az új rekordok beszúrására. Például a következő lekérdezés törli az összes termék rekordját.

TÖRLÉS A termékből

Önálló munkavégzési feladat: Fogalmazzon meg egy lekérdezést SQL-ben az összes olyan rendelés törléséhez, amely nem tartalmaz egyetlen terméket (vagyis az összes üres rendelést).

A korábban tárgyalt SELECT utasításon kívül a Data Manipulation Language (DML) további három utasítást tartalmaz: INSERT, UPDATE és DELETE. A SELECT utasításhoz hasonlóan ez a három utasítás táblákon vagy nézeteken működik. Ez a cikk az INSERT utasítással foglalkozik, a másik két utasítással pedig a következő cikk.

INSERT nyilatkozat sorokat (vagy sorrészeket) szúr be egy táblázatba. Ennek az utasításnak két különböző formája van:

BESZÁLLÍTÁS tab_name [(col_list)] ALAPÉRTELMEZETT ÉRTÉKEK | ÉRTÉKEK (( ALAPÉRTELMEZETT | NULL | kifejezés ) [ ,...n]) INSERT INTO lap_neve | view_name [(col_list)] (select_statement | execute_statement) Szintaxis konvenciók

Az utasítás első formája lehetővé teszi egy sor (vagy annak egy részének) beszúrását a táblázatba. Az INSERT utasítás második formája pedig lehetővé teszi, hogy egy SELECT utasítás eredményhalmazát vagy egy EXECUTE utasítás által végrehajtott tárolt eljárást beszúrjon egy táblába. A tárolt eljárásnak vissza kell adnia a táblázatba beillesztendő adatokat. Az INSERT utasítással együtt használva a SELECT utasítás választhat értékeket egy másik vagy ugyanabból a táblából, amelybe az adatokat beszúrja, feltéve, hogy a megfelelő oszlopok adattípusai kompatibilisek.

Mindkét űrlap esetében az egyes beszúrt értékek adattípusának kompatibilisnek kell lennie a megfelelő táblázatoszlop adattípusával. Minden karakterláncot és ideiglenes adatot idézőjelbe kell tenni; A numerikus értékeket nem kell idézőjelbe tenni.

Egyetlen sor beszúrása

Az INSERT utasítás mindkét formája esetén az oszloplista explicit megadása nem kötelező. Az oszlopok listázása nem ugyanaz, mint az összes oszlop megadása a táblázatban.

DEFAULT VALUES paraméter beszúrja az alapértelmezett értékeket az összes oszlophoz. A TIMESTAMP adattípussal vagy IDENTITY tulajdonsággal rendelkező oszlopok alapértelmezés szerint a rendszer által automatikusan generált értékekkel kerülnek beszúrásra. Más adattípusok oszlopaihoz a megfelelő nem nulla alapértelmezett értéket szúrja be, ha elérhető, vagy NULL értéket máskülönben. Ha egy oszlop nem engedélyezi a NULL értékeket, és nincs megadva alapértelmezett érték, az INSERT utasítás meghiúsul, és egy üzenet jelenik meg.

Az alábbi példa sorokat szúr be a SampleDb adatbázis Employee táblájába, bemutatva az INSERT utasítás használatát kis mennyiségű adat beszúrására az adatbázisba:

HASZNÁLATA SampleDb; INSERT INTO Alkalmazotti ÉRTÉKEK (34990, "Andrey", "Batonov", "d1"); INSERT INTO Munkavállalói ÉRTÉKEK (38640, "Alexey", "Vasin", "d3");

Kétféle módon lehet értékeket beszúrni egy új sorba. Az alábbi példában az INSERT utasítás kifejezetten a NULL kulcsszót használja, és egy NULL értéket szúr be a megfelelő oszlopba:

HASZNÁLATA SampleDb; INSERT INTO Munkavállalói ÉRTÉKEK (34991, "Andrey", "Batonov", NULL);

Ha értékeket szeretne beszúrni egy táblázat néhány (de nem az összes) oszlopába, általában kifejezetten meg kell adnia ezeket az oszlopokat. A nem meghatározott oszlopoknak vagy NULL értékeket kell engedélyezniük, vagy alapértelmezett értéket kell megadniuk.

HASZNÁLATA SampleDb; INSERT INTO Munkavállaló(Id, Keresztnév, Vezetéknév) ÉRTÉKEK (34992, "Andrey", "Batonov");

Az előző két példa egyenértékű. Az Employee táblában az egyetlen oszlop, amely engedélyezi a NULL értékeket, a DepartmentNumber oszlop, az összes többi oszlopot pedig letiltotta a CREATE TABLE utasítás NOT NULL záradéka.

Értékrend ben VALUES ajánlat Az INSERT utasítások eltérhetnek a CREATE TABLE utasításban megadott sorrendtől. Ebben az esetben a sorrendjüknek meg kell egyeznie azzal a sorrenddel, amelyben a megfelelő oszlopok szerepelnek az oszloplistában. Az alábbiakban egy példa látható az adatok eredetitől eltérő sorrendben történő beszúrására:

HASZNÁLATA SampleDb; INSERT INTO Employee(Részlegszám, Vezetéknév, Id, Keresztnév) ÉRTÉKEK ("d1", "Batonov", 34993, "Andrey");

Több sor beszúrása

Az INSERT utasítás második formája egy vagy több, egy részlekérdezés által kiválasztott sort szúr be a táblába. Az alábbi példa bemutatja, hogyan lehet sorokat beszúrni egy táblázatba az INSERT utasítás második formájával. Ebben az esetben egy lekérdezést hajtanak végre a Moszkvában található osztályok számának és nevének kiválasztásához, és az eredményül kapott eredménykészlet betöltődik egy korábban létrehozott új táblába.

A fenti példában létrehozott új MoscowDepartment tábla ugyanazokat az oszlopokat tartalmazza, mint a meglévő osztálytáblázat, kivéve a hiányzó Hely oszlopot. Az INSERT utasításban található részlekérdezés kijelöli a Részleg tábla összes sorát, amelynél a Hely oszlop értéke "Moszkva", amelyeket ezután beszúr a lekérdezés elején létrehozott új táblába.

Az alábbi példa egy másik módot mutat be sorok beszúrására egy táblázatba az INSERT utasítás második formájával. Ebben az esetben egy lekérdezés kerül végrehajtásra a személyzeti számok, a projektszámok és a projekt kezdési dátumának kiválasztásához minden „menedzser” beosztású alkalmazott számára, aki a p2 projekten dolgozik, majd betölti az eredményhalmazt egy új, a projekt elején létrehozott táblázatba. a lekérdezés:

HASZNÁLATA SampleDb; CREATE TABLE Manager Team(EmpId INT NOT NULL, ProjectNumber CHAR (4) NOT NULL, EnterDate DATE); INSERT INTO ManagerTeam (EmpId, ProjectNumber, EnterDate) SELECT EmpId, ProjectNumber, EnterDate FROM Works_on WHERE Job = "Manager";

Mielőtt az INSERT utasítással beszúrta volna a sorokat, a MoscowDepartment és a ManagerTeam táblák (a fenti példákban) üresek voltak. Ha a tábla már létezett, és adatsorokat tartalmazott, akkor új sorok kerülnek hozzáadásra.

A módosítási lekérdezések a táblák rekordjainak hozzáadásához (INSERT INTO), törléséhez (DELETE) és frissítéséhez (UPDATE) szolgálnak.

INSERT INTO parancsot

Az INSERT INTO paranccsal egy vagy több rekordot adhatunk a tábla végéhez.

Az INSERT INTO parancs szintaxisa a következő:
INSERT INTO Táblanév [(Mező_név)] ÉRTÉKEK (Adatértékek);

Például helyezzünk el a "Csoportok" táblában egy adatokat (1, BF-16a, 1, 1) tartalmazó rekordot a megfelelő oszlopokban (Csoportkód, Név, Tantárgy, Félév).

Ehhez kérjen a következő formátumban:
INSERT INTO Csoportok (Csoportkód, Cím, Tanfolyam, Félév) ÉRTÉKEK (1, BF-16a, 1, 1);
írja be a lekérdezést az űrlapon a "Létrehozás" fül "Query Builder" parancsának végrehajtásával, a Nézet menü "SQL mód" módjában.

Mentse el a kérést "Add_1_records" néven. Ennek eredményeként egy nem kapcsolódó objektum jelenik meg a „Navigációs terület” - „Add_1_records” (1. ábra).


Rizs. 1.

A kérés mentése után ezt a kérést a „Futtatás” ikonra kattintva végre kell hajtania. Az „Add_1_records” parancs végrehajtása eredményeként az első rekord megjelenik az üres táblában (2. ábra).



Rizs. 2.

UPDATE parancs

Az UPDATE parancs a táblázat oszlopaiban lévő meglévő rekordok módosítására szolgál, ami lehetővé teszi az értékek frissítését a megadott táblázatoszlopokban.

Az UPDATE parancs szintaxisa a következő:
UPDATE Table_Name SET Oszlopnév = Új_Érték WHERE Kiválasztási_feltétel;

A SET záradék határozza meg azoknak az oszlopoknak a nevét, amelyek adatait módosítani kell. A WHERE záradék nem kötelező, de az oszlopokban (táblázatokban) csak azokat a sorokat lehet megadni, amelyeket frissíteni kell.

Hozzon létre egy kérelmet egy rekord módosítására az sql_training_st.mdb adatbázis "Csoportok" táblájában.

Például módosítsunk egy meglévő bejegyzést az első kulcsmező azonosítójához a "Csoportok" táblázat "Név" oszlopában.

Kérés a következő formátumban:
UPDATE Groups SET Name ="BF-16b" WHERE ID=1;

Mentse el a kérést "Change_record_1" néven. Ennek eredményeként a „Change_record_1” objektum megjelenik az „Átmeneti területen” (3. ábra).



Rizs. 3.

A kérés mentése után ezt a kérést a „Futtatás” ikonra kattintva végre kell hajtania. A „Change_record_1” parancs végrehajtása eredményeként megjelenik egy párbeszédpanel, amelyben meg kell adni az ID=1 paraméter értékét, és kattintson az OK gombra. Ezen lépések után a „Csoportok” táblázatban a „Név” mezőben a bejegyzés BF-16a-ról BF-16b-re változik (4. ábra).



Rizs. 4.

DELETE parancs

A DELETE parancs a rekordok táblából való törlésére szolgál.

A rekordok törlésére vonatkozó kérelem formátuma:
DELETE FROM Table_Name WHERE Kiválasztási_feltétel;

Hozzon létre egy kérelmet egy rekord módosítására az sql_training_st.mdb adatbázis "Csoportok" táblájában.

Például töröljük az első kulcsmezőazonosító meglévő rekordját a "Csoportok" tábla összes oszlopában (mezőjében).

Ehhez kérjen a következő formátumban:
TÖRLÉS A csoportokból WHERE ID=1;
hozzon létre egy lekérdezést az űrlapon a "Létrehozás" lap "Query Builder" parancsának végrehajtásával, a Nézet menü "SQL mód" módjában.

A kérelmet „Delete_record_1” néven mentjük. Ennek eredményeként a „Deleting_record_1” objektum megjelenik az „Átmeneti területen” (5. ábra).



Rizs. 5.

A kérés mentése után ezt a kérést a „Futtatás” ikonra kattintva végre kell hajtania. A „Delete_record_1” parancs végrehajtása eredményeként megjelenik egy párbeszédpanel, amelyben meg kell adni az ID=1 paraméter értékét, és kattintson az OK gombra. Ezen lépések után megnyílik a „Rekordok törlésének megerősítése” párbeszédpanel. A megerősítést követően a "Csoportok" táblázatban minden mezőben lévő adat törlődik, pl. a bejegyzést törölték (6. ábra).



Rizs. 6.

Meg kell jegyezni, hogy a táblázat meghatározott mezőiben lévő adatok törléséhez tanácsos az UPDATE parancsot használni, és a kötelező mezőkben lévő értékeket nullára cserélni. Ha egy táblát egészében kell törölnie, használja a DROP TABLE operátort (operátor szintaxisa: DROP TABLE Table_Name;).

Állítsuk vissza a "Csoportok" tábla első rekordját az "Add_1_records" parancs végrehajtásával, ennek eredményeként az első rekordot állítjuk vissza (7. ábra).



Rizs. 7.

A programozók időnként égető vágyat éreznek, hogy olvassanak valamit az adatbázisból. A programozók idegesek és ingerlékenyek lesznek, elalszanak, és kétségbeesetten mutogatják az ujjaikat a billentyűzetre. Mindenki haszna és a világbéke érdekében nézzünk meg néhány egyszerű adatbázis-kezelést C#-ból ADO.NET és OLE DB segítségével. Bár ez a mechanizmus különféle adatbázisokat támogat, például az Oracle-t, itt és most az MS SQL Servert fogjuk használni.

Két fő feladat az adatbázissal való munka során

2. Olyan SQL parancs végrehajtása, amely végrehajt valamit a kiszolgálón (beszúr, frissít, töröl, függvényt vagy tárolt eljárást hív meg

3. Szekvenciális leolvasás a kiválasztási menüből soronként. Főleg webes alkalmazásokban használatos, így egyszerűbb a teljes választékot egyszerre letölteni a RAM-ba, a megtakarítás csak a szükséges sorok olvasásából származik;

4. Ritka eset. Egy tábla automatikus frissítése az adatbázisban a DataTable változásai alapján (általában vizuális felületen szerkesztve). A való életben az adatok általában összetett kupac összekapcsolási lekérdezéseken vagy nézeteken keresztül kerülnek beolvasásra, ezért az automatikus szinkronizálás nem megfelelő.

Az erre a célra használt főbb osztályok: OleDbConnection - kapcsolat az adatbázishoz, kapcsolati paramétereket tartalmazó karakterlánccal létrehozva, megnyitás, bezárás, OleDbCommand - kapcsolatpéldánnyal és sql paranccsal létrehozva, ha csak frissítést kell végrehajtani vagy letölteni egyetlen érték, akkor ez elég osztály, az OleDbDataAdapter - OleDbCommanddal készült, DataTable sorhalmazainak egyszeri kiolvasására specializálódott, kijelölés alapján automatikusan képes DataTable oszlopokat létrehozni, a DataTable-ból a változásokat átvinni egy táblába adatbázis, OleDbDataReader - a DataTable sorainak szekvenciális olvasása egyenként (belül működik az OleDbDataAdapter), DataTable / DataSet - az adatok fő tárolója. Az OleDbType felsorolás tárolja az adatbázis adattípusait.

A System.Data használata; a System.Data.OleDb használatával; // kapcsolati karakterlánc, Windows felhasználói rendszer van használva (Integrated Security=SSPI;) string connString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=databaseName;Data Source=serverName"; // alternatív kapcsolati karakterlánc MS SQL Server hitelesítéssel // connString = "Provider=SQLOLEDB.1;Persist Security Info=False;Initial Catalog=databaseName;Connect Timeout=20;Data Source=serverName;Uid=userName;Pwd=userPassword ; " OleDbConnection dbConn = new OleDbConnection(connString); dbConn.Open(); someDataTable = new DataTable(); OleDbDataAdapter dbAdapter = new OleDbDataAdapter("Select COLUMN1, COLUMN2 from TEST_TABLE ORDER BY COLUMN2", dbConn); // a beolvasott adatok alapján automatikusan létrejön egy üres tábla belső szerkezete, ha a táblaszerkezet már meg van adva (például egy begépelt DataSet-en keresztül), akkor az adatok egyező nevű vagy új oszlopokba kerülnek; oszlopok kerülnek hozzáadásra dbAdapter.Fill(someDataTable); // egy alternatív lehetőség egy tábla kitöltésére egy DataSetben // dbAdapter.Fill(someDataSet, "someDataTable"); dbConn.Close();

2. Olyan SQL parancs végrehajtása, amely végrehajt valamit a kiszolgálón (beszúr, frissít, töröl, függvényt vagy tárolt eljárást hív meg.

Különös figyelmet kell fordítani a dátumokkal kapcsolatos problémákra. A dátumok megvalósítása a .Neten rendkívül ferde – kezdetben a dátumok nem lehetnek üresek, de a való életben mindig üresek. A leghelyesebb megoldás egy speciális dátumosztály használata, amely kijavítja a Microsoft programozóinak hibáit. A lustább fejlesztők az összes dátumot karakterláncként tartják meg a kódban, és csak szükség esetén konvertálják DateTime-re, például amikor adatbázisba vagy DataTable-ba írnak. A nullázható DateTime nem segít, mivel a felületen lévő üres dátumnak üres karakterláncnak kell kinéznie, és ha DBNull.Value-ként írják be az adatbázisba, még a kódban lévő banális nullát sem alakítják át ezekre az értékekre anélkül, hogy további táncolást végeznének. egy tambura.

Az első lehetőség egy lekérdezési karakterlánc egyszerű egyesítése. Rossz gyakorlatnak tekinthető, és különösen veszélyes a webes alkalmazásokban, mivel sebezhető a hackertámadásokkal szemben. Az üres dátumok problémája nem olyan könnyen megoldható. Ezenkívül a dátumokkal való munka során egy további probléma is megjelenik - a .Net Framework regionális beállításaitól, a fejlesztői környezettől és az SQL-kiszolgálótól függően eltérő dátumkarakterlánc-formátumok. Szürreálisnak tűnhet – ugyanaz a lekérdezés működik az SQL Managment Studio-ban, de összeomlik, amikor a kódból végrehajtják. Részben megmenti a dátum karakterlánc speciális formátuma Ezt azonban gyakran kisméretű, belső használatra szánt programok teszik meg, amelyek létezéséről a külvilág soha nem fog tudni.

OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "INSERT INTO TEST_TABLE (INT_COLUMN, VARCHAR_COLUMN, DATETIME_COLUMN) VALUES (" + intVariable", " + stringVariable" , " + dateTimeVariable.ToString("yyyyMMdd") +"); dbCommand.ExecuteNonQuery();

A helyes beállítás egy parancs létrehozása erősen begépelt paraméterekkel. Vegye figyelembe, hogy az előző bekezdés nem létezett.

OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "INSERT A TEST_TABLE (INT_COLUMN, VARCHAR_COLUMN, DATETIME_COLUMN) ÉRTÉKEK (?, ?, ?)"; dbCommand.Parameters.Add("INT_COLUMN", OleDbType.Integer).Érték = 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.DateTime).Value). Convert.ToDateTime(stringDate) dbCommand.ExecuteNonQuery();

A tárolt eljárást pontosan ugyanúgy hívják, a sokféleség kedvéért van még egy lehetőség az értékek paraméterekbe írására (ez nem kapcsolódik kifejezetten a tárolt eljáráshoz):

OleDbCommand someDbComm = new OleDbCommand("someStoredProcedure", this.dbConn); someDbComm.CommandType = CommandType.StoredProcedure; someDbComm.Parameters.Add("@parameter1", OleDbType.VarChar); someDbComm.Parameters.Add("@parameter2", OleDbType.VarChar); someDbComm.Parameters.Value = "Minden problémára mindig van megoldás - egyszerű, kényelmes és természetesen rossz"; someDbComm.Parameters.Value = "Henry Louis Mencken"; someDbComm.ExecuteNonQuery(); !}

A paraméterleírás kiterjesztett változata, amely jelzi a mező méretét és egy adott táblázatoszlophoz való kötődést.

DbCommand.Parameters.Add("VARCHAR_COLUMN", OleDbType.VarChar, 100, "VARCHAR_COLUMN").Érték = stringVariable;

Ha nem kell parancsparamétert egy adott DataTable mezőhöz kötnünk, akkor a legjobb, ha egyáltalán nem adjuk meg a méretet, például ha a karakterlánc kisebb, mint a megadott Varchar hosszúság, akkor a jó .Net keretrendszer hozzáadja szóközt a karakterlánchoz a megadott hosszúságig, ami megsérti a szerverre továbbított adatokat.

Egyetlen mező értékét az ExecuteScalar() metódus olvassa be

OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "VÁLASZTÁSA TESZT_OSZLOPOT A TESZT_TÁBLÁZATBÓL, WHERE ID_COLUMN = ?"; dbCommand.Parameters.Add("INT_COLUMN", OleDbType.Integer).Érték = intVariable; int eredmény = Convert.ToInt32(dbCommand.ExecuteScalar());

Külön meg kell jegyezni, hogy az ExecuteScalar visszaadja az Object-et, és ha a kérés egyáltalán nem ad vissza semmit, akkor az eredmény null lesz, és a normál adattípusra való átalakítás hibával meghiúsul. Ha lehetséges olyan helyzet, amikor nem kapunk választ, akkor ezt kell tennünk:

OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "VÁLASZTÁSA TESZT_OSZLOPOT A TESZT_TÁBLÁZATBÓL, WHERE ID_COLUMN = ?"; dbCommand.Parameters.Add("INT_COLUMN", OleDbType.Integer).Érték = intVariable; objektum resultObj = dbCommand.ExecuteScalar() int eredmény = -1; // az alapértelmezett érték üres eredményt jelent if(resultObj != null) ( result = Convert.ToInt32(dbCommand.ExecuteScalar()); )

3. Szekvenciális leolvasás a kiválasztástól soronként
Egy sor olvasása (többet egy ciklusban olvasunk);

OleDbCommand dbCommand = new OleDbCommand(válasszon SZEMÉLYazonosító, NÉV, VEZETÉKNÉV a TEST_TABLE-ból, dbConn); OleDbDataReader dbReader = dbCommand.ExecuteReader(); dbReader.Read(); string name = Convert.ToString(dbReader["NAME"]); string vezetéknév = Convert.ToString(dbReader["VEZETÉKNÉV"]); dbReader.Close();

4. Ritka eset. Egy tábla automatikus frissítése az adatbázisban a DataTable változásai alapján (általában vizuális felületen szerkesztve).

Négy parancsot kell írni a DbAdapter számára minden lehetséges esethez - kijelölés, beszúrás, frissítés, törlés.

DbAdapter.InsertCommand = new OleDbCommand("beszúrás a TEST_TABLE-be (NÉV, CSALÁD, KOR) értékek (?, ?, ?)", dbConnection); dbAdapter.InsertCommand.Parameters.Add("NAME", OleDbType.VarChar, 100, "NAME"); dbAdapter.InsertCommand.Parameters.Add("FAMIL", OleDbType.VarChar, 100, "FAMIL"); // állandó hosszúságú adattípusok esetén a parancsban megadott hosszt figyelmen kívül hagyja dbAdapter.InsertCommand.Parameters.Add("AGE", OleDbType.Integer, 100, "AGE"); // frissítési parancs hozzáadása dbAdapter.UpdateCommand = new OleDbCommand("frissítés TEST_TABLE set NAME = ?, FAMIL = ?, AGE = ? where 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"); // törlési parancs hozzáadása dbAdapter.DeleteCommand = new OleDbCommand("törlés a TEST_TABLE-ból ahol ID = ?", dbConnection); dbAdapter.DeleteCommand.Parameters.Add("ID", OleDbType.Integer, 100, "ID"); try ( // az összes változást átviszi a DataTable-ból az adatbázis táblájába dbAdapter.Update(table); ) catch (Exception error) ( MessageBox.Show("Hiba az adatok mentésekor!" + error.Message); return; ) MessageBox Show("Változások mentve!");




Top