WebElektronika

NoSQL adatbázis alkalmazása C# nyelven

person access_time 2017.12.12.
Egyre több helyen alkalmaznak NoSQL adatbázisokat, ideje tehát nekünk is megnézni a használatát. A C.R.U.D. műveletekre fogunk fókuszálni, azaz, létrehozunk egy adatbázist (illetve rekordokat), lekéréseket hajtunk végre, módosítani fogjuk az egyik rekordnak az értékét, illetve törölni is fogunk az adatbázisból.


Az NoSQL adatbázisok egyre nagyobb teret nyernek a mobil- és a kisebb webes alkalmazásoknál. Ideális, mert nincs szükségünk adatbázisszerver telepítésére. Ebben a cikkben a C.R.U.D. (Create, Read, Updated, Delete) műveleteket fogjuk megvalósítani, de nem az ADO.NET-et fogjuk alkalmazni, hanem a LINQ-t hívjuk segítségül.

Indítsuk el a Visual Studio Community-t és hozzunk létre egy Console alkalmazást ConsoleLiteDB néven (1. ábra).

kep
1. ábra   Console alkalmazás létrehozása
 

Ahhoz, hogy a LiteDB-t használni tudjuk .NET környezetben, a nuget.org oldalról le kell töltenünk egy nuget-et. Kattintsunk ide, és töltsük le a nuget-et.

Ezt a nuget-et "telepítenünk" kell, ehhez a "Package Manager Console" ablakban a következő sort kell beírni és futtatni (a cikk írásakor volt ez, a legfrissebb a nuget oldalán található):

Install-Package LiteDB -Version 4.0.0-beta2

 

A "Package Manager Console" ablak a Visual Studio Tools/Nuget Package Manager almenüjében található (2. ábra).

kep
2. ábra   A Package Manager Console indítása
 

A LiteDB szerelvény sikeres "telepítése" után a Solution Explorer ablak References könyvtárában megtaláljuk a LiteDB-t névteret (3. ábra).

kep
3. ábra   A Solution Explorer-ben ablak
 

Hozzuk most létre az adatbázisunkat, amelynek a neve legyen "book.db". Ehhez egy osztályt kell létrehoznunk. Tároljuk el az ismerőseink nevét, telefonszámát és az email címét. Ezért az osztályunk (amelyet hozzá kell adnunk a projektünkhöz) neve legyen "contact", és vegyük fel a "ID", "Name", "Phone" és az "Email" propertiket.

class contact
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Phone { get; set; }
        public string Email { get; set; }
    }

 

Ezután módosítsuk a következő példa szerint a Program.cs file-ban található Program osztályt.

class Program
    {
        static void Main(string[] args)
        {
            using (var db = new LiteDatabase("book.db"))
            {
                var contacts = db.GetCollection<contact>("contacts");

                var person = new contact
                {
                    //ID = 1,
                    Name = "Teszt Elek",
                    Phone = "+36-1-1234567890",
                    Email = "link@elek.com"
                };

                contacts.Insert(person);

                var query = contacts.FindAll();
                Console.WriteLine("Rekordok száma : {0}", contacts.Count());
                Console.WriteLine("Min rekordsorszám : {0}", contacts.Min());
                Console.WriteLine("Max rekordsorszám : {0}", contacts.Max());

                foreach (var item in query)
                {

                    Console.WriteLine(item.ID + "\t" + item.Name + "\t" 
                        + item.Phone + "\t" + item.Email);
                }
            }
            Console.ReadLine();
        }
    }

 

Az "using" blokkal nyitjuk meg az adatbázisunkat (book.db, ezt le is zárjuk majd a using blokk végén), ha még nem létezne, akkor létre is hozzuk. Ha már létezik, akkor a tartalma nem kerül módosításra.

A LiteDatabase osztályt tartalmazó névtér még nem szerepel a szerelvények között, ezért vegyük fel a LiteDB-t (4. ábra).

kep
4. ábra   LiteDB szerelvény felvétele a Program.cs file szerelvényei közé
 

Példányosítsuk a contact osztályt person néven, és a példányosítás során a propertiknek adjunk értéket! Az ID értékadása elhagyható, mert automatikusan indul egytől a számozása.

Anoním típusként hozzuk létre a "contacts"-ot, amely különböző metódusokat, tuladonságokat fog tartalmazni (5. ábra).

kep
5. ábra   A contacts változó
 

Itt találjuk az Insert() metódust, amely kétszeres túlterheléssel rendelkezik. Megadhatjuk az Insert() metódus paramétereként egy, de akár több contact típusú paramétert, amelye(ke)t szerenénk eltárolni rekordként a book.db-ben.

kep
6. ábra   Egy (contact) paraméter megadása
 

kep
7. ábra   contact típusú gyűjtemény megadása (gyűjtemény beírása az adatbázisba)
 

Az Insert() metódus segítségével eltároltuk az első rekordunkat a book adatbázisban. Azután a programban szerepel egy LINQ-s lekérés (var query = contacts.FindAll();). A query gyűjteményben lekérjük az összes (első futtatásnál még csak egy) rekordunkat, amelyet megjelenítünk úgy, hogy a gyűjteményt bejárjuk a foreach ciklussal. A bejárás előtt kiíratjuk a gyűjtemény néhány tulajdonságát (8. ábra).

kep
8. ábra   A book.db adatbázis tartalma, illetve néhány tulajdonsága
 

Futtassuk néhányszor újra a programot úgy, hogy különböző értékeket adunk meg a contact osztály példányosításakor (9. ábra). Látjuk a következő ábrán, hogy két ismerősünknek is ugyanaz az email címe, ezt fogjuk majd később átírni.

kep
9. ábra   Ötször futtattuk az alkalmazásunkat
 

Az adatbázisunk jelenleg öt rekordot tartalmaz, hajtsunk most végre ezen különböző műveleteket! Először kérjük le annak az ismerősünknek az adatait, amelyiknek a sorszáma 1. Ehhez módosítani kell a programunkban a LINQ-s (na jó, igazából ez egy lambda....) lekérésünket.

var query = contacts.Find(q => q.ID == 1);

 

Látjuk a programunk futtatásakor (10. ábra, kommenteljük ki a példányosítást, hogy újabb rekordok ne legyenek), hogy a Teszt Eleknek az email címe nem jó, hiszen ez egy másik ismerősünkhöz tartozik (9. ábra).

kep
10. ábra   Első rekordunk kiíratása a konzolra, látjuk, nem jó az email címe Teszt Eleknek
 

Ahhoz, hogy meggyőződjünk arról, hogy Link Elek ismerősünk is ezt az email címet használja, módosítsük a lekérésünket:

var query = contacts.Find(q => q.Email.Contains("link"));

 

Ezzel a lekéréssel kiíratjuk az összes olyan rekordot, ahol az email cím tartalmazza a "link" szót. Látjuk a 11. ábrán, hogy két emberhez tartozik ugyanaz az email cím, tehát Teszt Elek email címét módosítanunk kell.

kep
11. ábra   Két felhasználónak ugyanaz az email címe
 

Ahhoz, hogy Teszt Eleknek az email címét megváltoztassuk, írjuk át a programunkat a következők szerint:

class Program
    {
        static void Main(string[] args)
        {
            using (var db = new LiteDatabase("book.db"))
            {
                var contacts = db.GetCollection<contact>("contacts");

                var query = contacts.Find(q => q.ID == 1);
                
                var updated = new contact
                {
                    ID = 1,
                    Name = query.Single().Name,
                    Email = "teszt@elek.hu",
                    Phone = query.Single().Phone
                };

                contacts.Update(updated);
                
                Console.WriteLine("Rekordok száma : {0}", contacts.Count());
                Console.WriteLine("Min rekordsorszám : {0}", contacts.Min());
                Console.WriteLine("Max rekordsorszám : {0}", contacts.Max());
                
                foreach (var item in query)
                {
                    Console.WriteLine(item.ID + "\t" + item.Name + "\t" 
                        + item.Phone + "\t" + item.Email);
                }
            }
            Console.ReadLine();
        }
    }

 

Először lekérjük a Teszt Elek rekordját (ID=1), majd ezután módosítjuk contact osztály példányosításakor (updated) a propertik értékeit. Tekintettel arra, hogy csak egy darab ID=1 rekord van, ezért a query gyűjtemény csak egy elemet tartalmaz, tehát a Single() metódus alkalmazható erre a gyűjteményre. A "contacts"-nál most az Update() metódust hívjuk meg az "updated" paraméterrel.
Futtassuk újra azt a lekérésünket, amely az ID=1 rekord összes tulajdonságát lekérjük. Látjuk a 12. ábrán, hogy a Teszt Elek rekordjánál az Email tulajdonság felülírásra került.

kep
12. ábra   Sikeres az Update() metódus meghívása, az email cím módosításra került
 

Töröljük most az egyik rekordot az adatbázisból! Legyen ez a rekord a 3., tehát azt töröljük ki, ahol az ID=3.
Módosítsuk most a következők szerint a programunkat:

class Program
    {
        static void Main(string[] args)
        {
            using (var db = new LiteDatabase("book.db"))
            {
                var contacts = db.GetCollection<contact>("contacts");

                contacts.Delete(3);

                var query = contacts.FindAll();

                Console.WriteLine("Rekordok száma : {0}", contacts.Count());
                Console.WriteLine("Min rekordsorszám : {0}", contacts.Min());
                Console.WriteLine("Max rekordsorszám : {0}", contacts.Max());
                
                foreach (var item in query)
                {
                    Console.WriteLine(item.ID + "\t" + item.Name + "\t" 
                        + item.Phone + "\t" + item.Email);
                }
            }
            Console.ReadLine();
        }
    }

 

Látjuk, hogy már a contact osztály példányosítása elmaradt,  a GetCollection() metódussal lekérjük az összes rekordot a contacts gyűjteménybe. Azután meghívjuk ennek a gyűjteménynek a Delete() metódusát. A Delete() metódus meghívásakor át kell adnunk annak a rekordnak a sorszámát, amelyet törölni szeretnénk.
Jelenítsük meg végül a book.db adatbázis rekordjait (13. ábra), ehhez a FindAll() metódus meghívása szükséges.

kep
13. ábra   Kitöröltük a ID=3 rekordot az adatbázisból