SQLite 提供可靠、輕量級的資料庫解決方案,用於在 Windows 應用程式中本機儲存資料。 與需要單獨安裝伺服器和複雜配置的傳統資料庫系統不同,SQLite 完全在您的應用程式進程中運行,並將資料儲存在使用者裝置上的單一檔案中。
本教學課程示範如何使用 Microsoft 建議的資料存取程式庫,將 SQLite 整合到 WinUI 應用程式中。 您將學習設定資料庫、建立資料表和實作基本資料操作,同時遵循安全最佳做法來防範常見漏洞。
您將完成的作業
在本教學課程中,您將瞭解如何:
- 設定您的 Windows 應用程式,以搭配 Microsoft.Data.SQLite 程式庫使用 SQLite
- 建立並初始化本機資料庫
- 實作安全的資料插入和擷取方法
- 建置簡單的使用者介面以與您的資料互動
先決條件
若要完成本教學課程,您需要:
- Visual Studio 2022 或更新版本,具有 WinUI 應用程式開發 工作負載
- 基本熟悉 C# 和 XAML
- 了解基本資料庫概念
此方法提供的主要改進
在 Windows 應用程式中使用 SQLite 進行本機資料儲存具有以下幾個優點:
- 簡化部署:無需單獨安裝資料庫伺服器
- 增強安全性:資料保留在使用者裝置上的本地
- 改進效能:直接檔案存取能消除網路延遲
- 降低複雜性:單一檔案資料庫簡化備份和遷移
您將學習的技術適用於任何需要在本機儲存結構化資料的 Windows 應用程式,從簡單的設定儲存到複雜的資料管理案例。
小提示
您可以使用 AI 協助來 協助避免 SQLite 中的 SQL 注入攻擊。
SQLite 對本地存儲的好處
✔️ SQLite 輕量且獨立。 它是不需要任何其他相依性的程式庫。 不需進行任何設定。
✔️ 沒有資料庫伺服器。 用戶端和伺服器以相同程序執行。
✔️ SQLite 位於公用網域,您可以自由使用並隨您的應用程式散發。
✔️ SQLite 可跨平台和架構運作。
您也可以在這裡閱讀更多有關 SQLite 的資訊。
選擇抽象層
建議您使用 Entity Framework Core 或 Microsoft 所建置的開放原始碼 SQLite 程式庫。
Entity Framework Core
Entity Framework (EF) 為物件關聯式對應程式,可讓您使用網域特定物件處理關聯式資料。 如果您已使用此架構來處理其他 .NET 應用程式中的資料,則可以在 WinUI 應用程式中使用相同的程式碼,而且它會與連接字串的適當變更搭配使用。
若要試用,請參閱開始使用 EF Core。
SQLite 程式庫
Microsoft.Data.Sqlite 程式庫會在 System.Data.Common 命名空間中實作介面。 Microsoft 會主動維護這些實作,並提供直覺的包裝函式來處理低階原生 SQLite API。
本指南的其餘部分可協助您使用此程式庫。
設定您的解決方案以使用 Microsoft.Data.SQLite 程式庫
我們將從基本的 WinUI 專案開始,然後安裝 SQLite NuGet 套件。 如需如何建立第一個 WinUI 專案的指示,請參閱 建立 WinUI 應用程式 。
所有支援的 Windows 版本都支援 SQLite,因此您的應用程式不需要封裝 SQLite 程式庫。 您的應用程式可以改用隨 Windows 安裝的 SQLite 版本。 這可為您提供幾個方面的協助。
✔️ 縮減應用程式的大小,因為您不需要下載 SQLite 二進位檔,然後將它封裝為應用程式的一部分。
✔️ 您不需要推送應用程式的新版本給使用者,在 SQLite 發佈 SQLite 中錯誤和安全性弱點的重大修正時。 Windows 版 SQLite 是由 Microsoft 與 SQLite.org 共同維護。
✔️ 應用程式載入時間可能更快,因為 SDK 版的 SQLite 很可能已載入記憶體中。
讓我們從將類別新增至名為 DataAccess 的專案開始。 如果您打算與其他用戶端程式代碼共用您的資料存取邏輯,則可以使用 .NET 類別庫專案來包含您的資料存取程式碼,但我們不會在我們的範例中使用。
以滑鼠右鍵按一下解決方案,然後按一下 [管理解決方案的 NuGet 套件]。
此時,您會有一個選擇。 您可以使用隨 Windows 提供的 SQLite 版本,或如果您因故需要使用特定 SQLite 版本,可以在您的套件中包含 SQLite 程式庫。 我們將使用 Windows 隨附的 SQLite 版本。
選擇 [瀏覽] 索引標籤,然後搜尋 Microsoft.Data.SQLite 套件,再安裝最新穩定版本。
在 SQLite 資料庫中新增和擷取資料
我們將執行下列工作︰
1️⃣準備資料存取類別。
2️⃣ 初始化 SQLite 資料庫。
3️⃣ 將資料插入 SQLite 資料庫。
4️⃣ 從 SQLite 資料庫擷取資料。
5️⃣ 新增基本使用者介面。
準備資料存取類別
在您的專案中開啟 DataAccess 類別,並將該類別設為靜態。
注意
雖然範例會將您的資料存取程式碼放在靜態類別中,但這是一個設計選擇,完全是選擇性的。
public static class DataAccess
{
}
將下列 using 陳述式新增到此檔案的頂端。
using Microsoft.Data.Sqlite;
using System.Collections.Generic;
初始化 SQLite 資料庫
新增方法至 DataAccess 類別,以初始化 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();
}
}
注意
上述使用 ApplicationData 成員的程式碼僅適用於在應用程式容器中執行的已封裝應用程式。 所有其他 Windows 應用程式都應該透過 ApplicationData 類別存取 成員。
此程式碼會建立 SQLite 資料庫,並將它儲存在應用程式的本機資料存放區。
在此範例中,我們將資料庫命名為 sqlliteSample.db,但您可以使用任意名稱,只要您將該名稱用於您具現化的所有 SqliteConnection 物件。 在生產應用程式中,資料庫檔案名稱等連線資訊應該儲存在應用程式組態中,而不是硬式編碼 (請參閱 使用 Visual Studio 已連線的服務新增 Azure 應用程式組態)。
在專案的 App.xaml.cs 檔案建構函式中,呼叫 InitializeDatabase 類別的 DataAccess 方法。 這可確保每次應用程式啟動時都會建立或開啟資料庫。
public App()
{
this.InitializeComponent();
DataAccess.InitializeDatabase();
}
將資料插入 SQLite 資料庫
新增方法至 DataAccess 類別,將資料插入 SQLite 資料庫。 此程式碼會在查詢中使用參數,以避免 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();
}
}
從 SQLite 資料庫擷取資料
新增從 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;
}
Read 方法會逐一處理所傳回的資料列。 如果有剩餘的列,它會傳回 true,否則會傳回 false。
GetString 方法會將所指定欄的值做為字串傳回。 它接受整數值,代表您要的資料的以零起始欄序數。 您可以使用類似的方法,例如 GetDataTime 和 GetBoolean。 根據欄所包含的資料類型選擇方法。
在此範例中,序數參數並不那麼重要,因為我們會選取一欄中的所有項目。 不過,如果您的查詢中有多欄,請使用序數值取得要從中擷取資料的欄。
新增基本使用者介面
在專案的 MainWindow.xaml 檔案中,新增下列 XAML。
<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>
這個基本使用者介面會提供 TextBox 給使用者,讓他們用來輸入字串,我們會將該字串新增到 SQLite 資料庫。 我們會將此 UI 中的 Button 連接至事件處理常式,它會從 SQLite 資料庫擷取資料,然後在 ListView 中顯示該資料。
在 MainWindow.xaml.cs 檔案中,新增下列處理常式。 這是我們與 UI 中 Click 的 Button 事件產生關聯的方法。
private void AddData(object sender, RoutedEventArgs e)
{
DataAccess.AddData(Input_Box.Text);
Output.ItemsSource = DataAccess.GetData();
}
我們也想要確定應用程式啟動時會載入任何現有的資料。 將程式程式碼新增至 MainWindow 建構函式,以呼叫 GetData()。
public MainWindow()
{
this.InitializeComponent();
Output.ItemsSource = DataAccess.GetData();
}
這樣就大功告成了。 探索 Microsoft.Data.Sqlite,了解還可以利用 SQLite 資料庫做什麼。 查看下列連結,了解在您的 Windows 應用程式中使用資料的其他方式。
避免SQL注入攻擊
此範例中的程式碼使用參數化查詢來防止 SQL 注入攻擊。 切勿將使用者輸入串連至 SQL 查詢字串。 一律使用參數。 您可以向 Copilot 詢問更多有關避免 SQL 注入攻擊的提示。
下列文字顯示 Copilot 的範例提示:
Can you provide some best practices to avoid SQL injection attacks when writing SQLite queries in C# code?
Copilot 是由 AI 所提供,因此可能會有驚喜和錯誤。 如需詳細資訊,請參閱 Copilot 常見問題。
相關內容
將您的應用程式直接連接至 SQL Server 資料庫
請參閱在 Windows 應用程式中使用 SQL Server 資料庫。
在不同平台的不同應用程式之間共用程式碼
在 Azure SQL 後端新增主要詳細資料頁面
請參閱客戶訂單資料庫範例 (英文)。