Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
SQLite fournit une solution de base de données fiable et légère pour stocker les données localement dans les applications Windows. Contrairement aux systèmes de base de données traditionnels qui nécessitent des installations de serveur distinctes et des configurations complexes, SQLite s’exécute entièrement dans votre processus d’application et stocke les données dans un seul fichier sur l’appareil de l’utilisateur.
Ce tutoriel vous montre comment intégrer SQLite à votre application WinUI à l’aide des bibliothèques d’accès aux données recommandées par Microsoft. Vous allez apprendre à configurer une base de données, créer des tables et implémenter des opérations de données de base, tout en suivant les bonnes pratiques de sécurité pour vous protéger contre les vulnérabilités courantes.
Ce que vous allez accomplir
Ce didacticiel vous montre comment effectuer les opérations suivantes :
- Configurer votre application Windows pour utiliser SQLite avec la bibliothèque Microsoft.Data.SQLite
- Créer et initialiser une base de données locale
- Implémenter des méthodes d’insertion et de récupération de données sécurisées
- Créer une interface utilisateur simple pour interagir avec vos données
Prerequisites
Pour suivre ce didacticiel, vous avez besoin des éléments suivants :
- Visual Studio 2022 ou version ultérieure avec la charge de travail de développement d’applications WinUI
- Connaissance de base de C# et XAML
- Compréhension des concepts fondamentaux de la base de données
Améliorations clés de cette approche
L’utilisation de SQLite pour le stockage de données local dans votre application Windows offre plusieurs avantages :
- Déploiement simplifié : aucune installation de serveur de base de données distincte requise
- Sécurité renforcée : les données restent locales sur l’appareil de l’utilisateur
- Amélioration des performances : l’accès direct aux fichiers élimine la latence du réseau
- Complexité réduite : la base de données à fichier unique simplifie la sauvegarde et la migration
Les techniques que vous allez apprendre s’appliquent à n’importe quelle application Windows qui doit stocker des données structurées localement, du stockage de paramètres simples aux scénarios de gestion des données complexes.
Conseil / Astuce
Vous pouvez utiliser l’assistance IA pour éviter les attaques par injection SQL dans SQLite.
Avantages de SQLite pour le stockage local
✔️ SQLite est non activable et autonome. Il s’agit d’une bibliothèque de codes indépendante. Tout est déjà configuré.
✔️ Il n’existe aucun serveur de base de données. Le client et le serveur s’exécutent dans le même processus.
✔️ SQLite étant dans le domaine public, son utilisation et sa distribution avec votre application sont libres.
✔️ SQLite fonctionne sur différentes plateformes et architectures.
Vous trouverez davantage d’informations sur SQLite ici.
Choisir une couche d’abstraction
Nous vous recommandons d’utiliser Entity Framework Core ou la bibliothèque SQLite open source générée par Microsoft.
Entity Framework Core
Entity Framework (EF) est un mappeur relationnel objet qui vous permet de travailler avec des données relationnelles en utilisant des objets propres au domaine. Si vous avez déjà utilisé cette infrastructure pour utiliser des données dans d’autres applications .NET, vous pouvez utiliser le même code dans votre application WinUI et utiliser les modifications appropriées apportées à la chaîne de connexion.
Pour l’essayer, consultez Bien démarrer avec EF Core.
Bibliothèque SQLite
La bibliothèque Microsoft.Data.Sqlite implémente les interfaces dans l’espace de noms System.Data.Common. Microsoft gère activement ces implémentations, qui fournissent un wrapper intuitif autour de l’API SQLite native de bas niveau.
Le reste de ce guide vous aide à utiliser cette bibliothèque.
Configurer votre solution pour utiliser la bibliothèque Microsoft.Data.SQLite
Nous allons commencer par un projet WinUI de base, puis installer le package NuGet SQLite. Consultez Créer une application WinUI pour obtenir des instructions sur la création de votre premier projet WinUI.
Toutes les versions prises en charge de Windows prennent en charge SQLite. Votre application n’a donc pas besoin d’empaqueter des bibliothèques SQLite. Au lieu de cela, elle peut utiliser la version de SQLite qui est installée avec Windows. Cette solution est particulièrement intéressante.
✔️ Réduit la taille de votre application, car vous n’êtes pas obligé de télécharger le fichier binaire SQLite puis de l’empaqueter dans votre application.
✔️ Vous évite d’avoir à envoyer (par push) une nouvelle version de votre application aux utilisateurs dans le cas où SQLite publie des correctifs critiques pour les bogues et failles de sécurité dans SQLite. La version Windows de SQLite est gérée par Microsoft en coordination avec SQLite.org.
✔️ Le temps de chargement des applications est potentiellement plus rapide, car le plus souvent, la version du SDK de SQLite est déjà chargée en mémoire.
Commençons par ajouter une classe à votre projet nommé DataAccess. Si vous envisagez de partager votre logique d’accès aux données avec un autre code client, vous pouvez utiliser un projet de bibliothèque de classes .NET pour contenir votre code d’accès aux données, mais nous n’en utiliserons pas dans notre exemple.
Cliquez avec le bouton droit sur la solution, puis cliquez sur Gérer les packages NuGet pour la solution.
À ce stade, vous avez plusieurs possibilités. Vous pouvez utiliser la version de SQLite fournie avec Windows. Si vous avez besoin d’utiliser une version spécifique de SQLite, vous pouvez inclure la bibliothèque SQLite dans votre package. Nous allons utiliser la version de SQLite incluse dans Windows.
Choisissez l’onglet Parcourir, recherchez le package Microsoft.Data.SQLite, puis installez la dernière version stable.
Ajouter et récupérer des données dans une base de données SQLite
Nous allons effectuer les opérations suivantes :
1️⃣ Préparer la classe d’accès aux données.
2️⃣ Initialiser la base de données SQLite.
3️⃣ Insérer des données dans la base de données SQLite.
4️⃣ Récupérer des données dans la base de données SQLite.
5️⃣ Ajouter une interface utilisateur de base.
Préparer la classe d’accès aux données
Ouvrez la classe DataAccess dans votre projet, puis rendez cette classe statique.
Note
Bien que l’exemple place votre code d’accès aux données dans une classe statique, il s’agit d’un choix de conception et est complètement facultatif.
public static class DataAccess
{
}
Ajoutez les instructions using suivantes en haut de ce fichier.
using Microsoft.Data.Sqlite;
using System.Collections.Generic;
Initialiser la base de données SQLite
Ajoutez à la classe DataAccess une méthode qui initialise la base de données SQLite.
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();
}
}
Note
Le code ci-dessus qui utilise des membres ApplicationData fonctionne uniquement pour les applications empaquetées s’exécutant dans un conteneur d’applications. Toutes les autres applications Windows doivent accéder aux membres ApplicationData par le biais de la classe ApplicationDataManager.
Ce code crée la base de données SQLite et la stocke dans le magasin de données local de l’application.
Dans cet exemple, nous appelons la base de données sqlliteSample.db, mais vous pouvez choisir le nom que vous souhaitez tant que vous l’utilisez dans tous les objets SqliteConnection que vous instanciez. Dans une application de production, les informations de connexion comme le nom de fichier de la base de données doivent être stockées dans la configuration de l’application plutôt que codées en dur (consultez Ajout d’Azure App Configuration à l’aide de Visual Studio Connected Services).
Dans le constructeur du fichier App.xaml.cs de votre projet, appelez la méthode InitializeDatabase de la classe DataAccess. Ainsi, la base de données est créée ou ouverte à chaque démarrage de l’application.
public App()
{
this.InitializeComponent();
DataAccess.InitializeDatabase();
}
Insérer des données dans la base de données SQLite
Ajoutez à la classe DataAccess une méthode qui insère des données dans la base de données SQLite. Ce code utilise les paramètres de la requête afin d’empêcher les attaques par injection de code SQL.
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();
}
}
Récupérer des données dans la base de données SQLite
Ajoutez une méthode qui obtient toutes les lignes de données de la table dans notre base de données SQLite.
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;
}
La méthode Read avance dans les lignes de données retournées. Elle retourne true s’il reste des lignes ; sinon, elle retourne false.
La méthode GetString retourne la valeur de la colonne spécifiée sous forme de chaîne. Elle accepte une valeur entière qui représente l’ordinal de colonne de base zéro des données que vous voulez. Vous pouvez utiliser des méthodes similaires comme GetDataTime et GetBoolean. Choisissez une méthode basée sur le type de données contenues dans la colonne.
Le paramètre ordinal n’est pas aussi important dans cet exemple, car nous allons sélectionner toutes les entrées d’une même colonne. Toutefois, si plusieurs colonnes font partie de votre requête, utilisez la valeur ordinale pour obtenir la colonne de laquelle vous souhaitez extraire des données.
Ajouter une interface utilisateur de base
Dans le fichier MainWindow.xaml du projet, ajoutez le code XAML suivant.
<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>
Cette interface utilisateur de base fournit à l’utilisateur un TextBox qu’il peut utiliser pour entrer une chaîne que nous ajouterons à la base de données SQLite. Nous allons connecter le Button de cette interface utilisateur à un gestionnaire d’événements qui va récupérer des données dans la base de données SQLite, puis les afficher dans le ListView.
Dans le fichier MainWindow.xaml.cs, ajoutez le gestionnaire suivant. Il s’agit de la méthode que nous avons associée à l’événement Click de Button dans l’interface utilisateur.
private void AddData(object sender, RoutedEventArgs e)
{
DataAccess.AddData(Input_Box.Text);
Output.ItemsSource = DataAccess.GetData();
}
Nous voulons également nous assurer que toutes les données existantes sont chargées au démarrage de l’application. Ajoutez une ligne de code au constructeur MainWindow pour appeler GetData().
public MainWindow()
{
this.InitializeComponent();
Output.ItemsSource = DataAccess.GetData();
}
C’est terminé. Explorez Microsoft.Data.Sqlite pour découvrir ce que vous pouvez faire d’autre avec votre base de données SQLite. Consultez les liens ci-dessous pour en savoir plus sur les autres façons d’utiliser des données dans vos applications Windows.
Éviter les attaques par injection SQL
Le code de cet exemple utilise des requêtes paramétrables pour empêcher les attaques par injection SQL. Ne concaténer jamais l’entrée utilisateur dans une chaîne de requête SQL. Utilisez toujours les paramètres. Vous pouvez demander à Copilot d’obtenir des conseils supplémentaires sur l’évitement des attaques par injection sql.
Le texte suivant montre un exemple de prompt pour Copilot :
Can you provide some best practices to avoid SQL injection attacks when writing SQLite queries in C# code?
Copilot est alimenté par l’IA, donc les surprises et les erreurs sont possibles. Pour plus d’informations, consultez les QUESTIONS fréquentes (FAQ) copilot.
Contenu connexe
Connecter votre application directement à une base de données SQL Server
Consultez Utiliser une base de données SQL Server dans une application Windows.
Partager du code entre différentes applications sur différentes plateformes
Consultez Partager du code entre une application de bureau et une application UWP.
Ajouter des pages maître/détail avec les back-ends Azure SQL
Consultez Exemple de base de données de commandes des clients.
Windows developer