Oktatóanyag: SQLite-adatbázis használata Windows alkalmazásban

SQLite megbízható, egyszerű adatbázismegoldást biztosít az adatok helyi tárolásához Windows alkalmazásokban. A különálló kiszolgálótelepítéseket és összetett konfigurációkat igénylő hagyományos adatbázisrendszerektől eltérően az SQLite teljes mértékben az alkalmazásfolyamaton belül fut, és egyetlen fájlban tárolja az adatokat a felhasználó eszközén.

Ez az oktatóanyag bemutatja, hogyan integrálhatja az SQLite-t a WinUI-alkalmazásba a Microsoft ajánlott adatelérési kódtárai segítségével. Megtudhatja, hogyan állíthat be adatbázist, hozhat létre táblákat és valósíthat meg alapvető adatműveleteket – mindezt a gyakori biztonsági rések elleni védelemhez ajánlott biztonsági eljárások követésével.

Mit fog elérni?

Ebben az oktatóanyagban megtanulhatja, hogyan:

  • A Windows alkalmazás konfigurálása SQLite használatára a Microsoft.Data.SQLite könyvtárral
  • Helyi adatbázis létrehozása és inicializálása
  • Biztonságos adatbeszúrási és lekérési módszerek implementálása
  • Egyszerű felhasználói felület létrehozása az adatok kezeléséhez

Előfeltételek

Az oktatóanyag elvégzéséhez a következőkre van szüksége:

  • Visual Studio 2026 vagy újabb WinUI alkalmazásfejlesztési munkaterheléssel
  • A C# és az XAML alapszintű ismerete
  • Az alapvető adatbázis-fogalmak ismertetése

A megközelítés fő fejlesztései

Az SQLite használata a Windows-alkalmazásban való helyi adattároláshoz számos előnnyel jár:

  • Egyszerűsített üzembe helyezés: Nincs szükség külön adatbázis-kiszolgáló telepítésére
  • Fokozott biztonság: Az adatok helyiek maradnak a felhasználó eszközén
  • Jobb teljesítmény: A közvetlen fájlhozzáférés kiküszöböli a hálózati késést
  • Csökkentett összetettség: Az egyfájlos adatbázis leegyszerűsíti a biztonsági mentést és a migrálást

Az elsajátított technikák minden olyan Windows alkalmazásra érvényesek, amelyeknek strukturált adatokat kell helyileg tárolniuk, az egyszerű beállítástárolástól az összetett adatkezelési forgatókönyvekig.

Jótanács

Az AI-segítség segítségével elkerülheti az SQL-injektálási támadásokat az SQLite-ben.

Az SQLite előnyei a helyi tároláshoz

✔️ Az SQLite könnyű és önálló. Ez egy kódtár más függőségek nélkül. Nincs mit konfigurálni.

✔️ Nincs adatbázis-kiszolgáló. Az ügyfél és a kiszolgáló ugyanabban a folyamatban fut.

✔️ Az SQLite nyilvános tartományban van, így szabadon használhatja és terjesztheti az alkalmazással.

✔️ Az SQLite platformokat és architektúrákat használ.

Az SQLite-ről itt olvashat bővebben.

Absztrakciós réteg kiválasztása

Javasoljuk, hogy Entity Framework Core vagy a Microsoft által létrehozott nyílt forráskódú SQLite könyvtárat használja.

Entity Framework Core

Az Entity Framework (EF) egy objektum-relációs leképező, amellyel tartományspecifikus objektumok használatával dolgozhat relációs adatokkal. Ha már használta ezt a keretrendszert más .NET-alkalmazások adatainak kezelésére, ugyanazt a kódot használhatja a WinUI-alkalmazásban, és az a connection string megfelelő módosításokkal fog működni.

A kipróbálásához tekintse meg az EF Core használatának első lépéseit.

SQLite-kódtár

A Microsoft.Data.Sqlite kódtár a System.Data.Common névtérben implementálja a felületeket. A Microsoft aktívan fenntartja ezeket az implementációkat, és intuitív burkolót biztosítanak az alacsony szintű natív SQLite API körül.

Az útmutató további része segítséget nyújt a kódtár használatához.

A megoldás beállítása a Microsoft.Data.SQLite kódtár használatára

Először egy alapszintű WinUI-projekttel kezdjük, majd telepítjük az SQLite NuGet-csomagot. Az első WinUI-projekt létrehozásához tekintse meg a WinUI-alkalmazás létrehozásával kapcsolatos utasításokat.

Az Windows összes támogatott verziója támogatja az SQLite-t, így az alkalmazásnak nem kell SQLite-kódtárakat csomagolnia. Ehelyett az alkalmazás használhatja a Windows telepített SQLite-verziót. Ez segít néhány módon.

✔️ Csökkenti az alkalmazás méretét, mert nem kell letöltenie az SQLite bináris fájlt, majd az alkalmazás részeként kell csomagolnia.

✔️ Megakadályozza, hogy leküldje az alkalmazás új verzióját a felhasználóknak abban az esetben, ha az SQLite kritikus javításokat tesz közzé az SQLite hibáihoz és biztonsági réseihez. Az SQLite Windows verzióját a Microsoft SQLite.org koordinálva tartja fenn.

✔️ Az alkalmazásbetöltési idő gyorsabb lehet, mert valószínűleg az SQLite SDK-verziója már betöltődik a memóriába.

Először adjunk hozzá egy DataAccess nevű osztályt a projekthez. Ha meg szeretné osztani az adatelérési logikát más ügyfélkódokkal, használhat egy .NET osztálykódtár-projektet az adatelérési kód használatára, de a példánkban nem használunk egyet.

  1. Kattintson a jobb gombbal a megoldásra, majd kattintson a Megoldás nuGet-csomagjainak kezelése parancsra.

    A Visual Studio Solution Explorer képernyőképe, amelyen a projektre a jobb gombbal kattintott, és a NuGet-csomagok kezelése lehetőség ki van emelve.

    Ezen a ponton van egy választás. Használhatja a Windows részét képező SQLite-verziót, vagy ha van valamilyen oka az SQLite egy adott verziójának használatára, az SQLite-kódtárat is belefoglalhatja a csomagba. A Windows tartalmazott SQLite-verziót fogjuk használni.

  2. Válassza a Tallózás lapot, keresse meg a Microsoft.Data.SQLite csomagot, majd telepítse a legújabb stabil verziót.

    SQLite NuGet-csomag

Adatok hozzáadása és lekérése SQLite-adatbázisban

A következő műveleteket hajtjuk végre:

1️⃣ Az adatelérési osztály előkészítése.

2️⃣ Inicializálja az SQLite-adatbázist.

3️⃣ Adatok beszúrása az SQLite-adatbázisba.

4️⃣ Adatok lekérése az SQLite-adatbázisból.

5️⃣ Egyszerű felhasználói felület hozzáadása.

Az adatelérési osztály előkészítése

Nyissa meg az DataAccess osztályt a projektben, és állítsa statikussá az osztályt.

Megjegyzés:

Bár a példa statikus osztályba helyezi az adatelérési kódot, ez egy tervezési lehetőség, és teljesen opcionális.

public static class DataAccess
{
}

Adja hozzá a következő using utasításokat a fájl elejéhez.

using Microsoft.Data.Sqlite;
using System.Collections.Generic;

Az SQLite-adatbázis inicializálása

Adjon hozzá egy metódust az DataAccess SQLite-adatbázist inicializáló osztályhoz.

public async static void InitializeDatabase()
{ 
    await ApplicationData.Current.LocalFolder
            .CreateFileAsync("sqliteSample.db", CreationCollisionOption.OpenIfExists);
    string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path,
                                 "sqliteSample.db");
    using (var db = new SqliteConnection($"Filename={dbpath}"))
    {
        db.Open();

        string tableCommand = "CREATE TABLE IF NOT " +
            "EXISTS MyTable (Primary_Key INTEGER PRIMARY KEY, " +
            "Text_Entry NVARCHAR(2048) NULL)";

        var createTable = new SqliteCommand(tableCommand, db);

        createTable.ExecuteReader();
    }
}

Megjegyzés:

A fenti, tagokat használó ApplicationData kód csak az alkalmazástárolóban futó csomagolt alkalmazásokhoz fog működni. Minden más Windows-alkalmazásnak hozzá kell férnie ApplicationData tagokhoz a ApplicationDataManager osztályon keresztül.

Ez a kód létrehozza az SQLite-adatbázist, és az alkalmazás helyi adattárában tárolja.

Ebben a példában elnevezzük az adatbázist sqlliteSample.db , de bármilyen nevet használhat, amíg ezt a nevet használja az összes példányosított SqliteConnection-objektumban . Éles alkalmazásokban a kapcsolati adatokat, például az adatbázis fájlnevét az alkalmazáskonfigurációban kell tárolni, nem pedig közvetlenül beágyazva (lásd: Az Azure App Configuration hozzáadása Visual Studio csatlakoztatott szolgáltatások használatával).

A projekt App.xaml.cs fájljának konstruktorában hívja meg az InitializeDatabaseDataAccess osztály metódusát. Ez biztosítja, hogy az adatbázis az alkalmazás minden indításakor létrejön vagy meg legyen nyitva.

public App()
{
    this.InitializeComponent();

    DataAccess.InitializeDatabase();
}

Adatok beszúrása az SQLite-adatbázisba

Adjon hozzá egy metódust az DataAccess osztályhoz, amely adatokat szúr be az SQLite-adatbázisba. Ez a kód paramétereket használ a lekérdezésben az SQL-injektálási támadások megelőzésére.

public static void AddData(string inputText)
{
    string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path,
                                 "sqliteSample.db");
    using (var db = new SqliteConnection($"Filename={dbpath}"))
    {
        db.Open();

        var insertCommand = new SqliteCommand();
        insertCommand.Connection = db;

        // Use parameterized query to prevent SQL injection attacks
        insertCommand.CommandText = "INSERT INTO MyTable VALUES (NULL, @Entry);";
        insertCommand.Parameters.AddWithValue("@Entry", inputText);

        insertCommand.ExecuteReader();
    }

}

Adatok lekérése az SQLite-adatbázisból

Adjon hozzá egy metódust, amely lekéri az összes adatsort egy táblából az SQLite-adatbázisban.

public static List<string> GetData()
{
    var entries = new List<string>();
    string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path,
                                 "sqliteSample.db");
    using (var db = new SqliteConnection($"Filename={dbpath}"))
    {
        db.Open();
        var selectCommand = new SqliteCommand
            ("SELECT Text_Entry from MyTable", db);

        SqliteDataReader query = selectCommand.ExecuteReader();

        while (query.Read())
        {
            entries.Add(query.GetString(0));
        }
    }

    return entries;
}

Az olvasási módszer halad végig a visszaadott adatok sorain. Akkor ad true vissza, ha vannak hátrasorok, ellenkező esetben ad vissza false.

A GetString metódus a megadott oszlop értékét adja vissza sztringként. Egy egész számértéket fogad el, amely a kívánt adatok nullaalapú oszlop-sorszámát jelöli. Hasonló módszereket is használhat, mint például a GetDataTime és a GetBoolean. Válasszon egy metódust az oszlopban található adatok típusa alapján.

A sorszám paraméter ebben a példában nem olyan fontos, mert egyetlen oszlopban lévő összes bejegyzést kiválasztjuk. Ha azonban több oszlop is része a lekérdezésnek, a sorszámérték használatával szerezze be azt az oszlopot, amelyből adatokat szeretne lekérni.

Egyszerű felhasználói felület hozzáadása

A projekt MainWindow.xaml fájljában adja hozzá a következő XAML-t.

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <StackPanel>
        <TextBox x:Name="Input_Box"/>
        <Button Click="AddData">Add</Button>
        <ListView x:Name="Output">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding}"/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackPanel>
</Grid>

Ez az alapszintű felhasználói felület lehetővé teszi a felhasználó TextBox számára, hogy beírjon egy karakterláncot, amelyet hozzáadunk az SQLite-adatbázishoz. A felhasználói felületet egy eseménykezelőhöz csatlakoztatjuk Button , amely adatokat kér le az SQLite-adatbázisból, majd megjeleníti az adatokat a ListView.

A MainWindow.xaml.cs fájlban adja hozzá a következő kezelőt. Ez az a módszer, amelyet a felhasználói felület Click eseményéhez társítottunk Button.

private void AddData(object sender, RoutedEventArgs e)
{
    DataAccess.AddData(Input_Box.Text);

    Output.ItemsSource = DataAccess.GetData();
}

Azt is szeretnénk, hogy az alkalmazás indításakor minden meglévő adat be legyen töltve. Adjon hozzá egy kódsort a MainWindow konstruktorhoz, hogy meghívja GetData()-t.

public MainWindow()
{
    this.InitializeComponent();

    Output.ItemsSource = DataAccess.GetData();
}

Ennyi az egész. A Microsoft.Data.Sqlite segítségével megtudhatja, milyen egyéb műveleteket végezhet az SQLite-adatbázissal. Tekintse meg az alábbi hivatkozásokat, amelyekből megtudhatja, hogyan használhatja az adatokat az Windows-alkalmazásokban.

Sql-injektálási támadások elkerülése

A példában szereplő kód paraméteres lekérdezéseket használ az SQL-injektálási támadások megelőzésére. Soha ne fűzse össze a felhasználói bemenetet SQL-lekérdezési sztringgel. Mindig használjon paramétereket. Kérhet további tippeket a Copilottól az SQL-injektálási támadások elkerüléséhez.

Az alábbi szöveg egy példautasítást jelenít meg a Copilot számára.

Can you provide some best practices to avoid SQL injection attacks when writing SQLite queries in C# code?

Copilot mesterséges intelligencián alapuló, így meglepetések és hibák is lehetségesek. További információ: Copilot GYIK.

Az alkalmazás csatlakoztatása közvetlenül egy SQL Server-adatbázishoz

Lásd: Az SQL Server-adatbázis használata Windows alkalmazásban.

Kód megosztása különböző alkalmazások között különböző platformokon

Lásd: Kód megosztása asztali és UWP között.

Mesteroldalak hozzáadása Azure SQL háttérrendszerrel

Lásd: Customer Orders Adatbázisminta.