Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
SQLite Windows uygulamalarında verileri yerel olarak depolamak için güvenilir ve basit bir veritabanı çözümü sağlar. Ayrı sunucu yüklemeleri ve karmaşık yapılandırmalar gerektiren geleneksel veritabanı sistemlerinden farklı olarak, SQLite tamamen uygulama işleminizde çalışır ve verileri kullanıcının cihazında tek bir dosyada depolar.
Bu öğreticide, Microsoft'un önerilen veri erişim kitaplıklarını kullanarak SQLite'i WinUI uygulamanızla tümleştirme gösterilmektedir. Bir veritabanı ayarlamayı, tablolar oluşturmayı ve temel veri işlemlerini uygulamayı öğreneceksiniz. Bunların tümünü yaparken yaygın güvenlik açıklarına karşı koruma için en iyi güvenlik yöntemlerini takip edin.
Neler başaracağınız
Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:
- Windows uygulamanızı Microsoft.Data.SQLite kitaplığıyla SQLite kullanacak şekilde yapılandırma
- Yerel veritabanı oluşturma ve başlatma
- Güvenli veri ekleme ve alma yöntemleri uygulama
- Verilerinizle etkileşim kurmak için basit bir kullanıcı arabirimi oluşturma
Önkoşullar
Bu eğitimi tamamlamak için şunlara ihtiyacınız olacak:
- Visual Studio 2022 veya sonraki bir sürümüyle WinUI uygulama geliştirme iş yükü
- C# ve XAML ile ilgili temel bilgiler
- Temel veritabanı kavramlarını anlama
Bu yaklaşımın sunduğu önemli iyileştirmeler
Windows uygulamanızda yerel veri depolama için SQLite kullanmak çeşitli avantajlar sunar:
- Basitleştirilmiş dağıtım: Ayrı veritabanı sunucusu yüklemesi gerekmez
- Gelişmiş güvenlik: Veriler kullanıcının cihazında yerel kalır
- Geliştirilmiş performans: Doğrudan dosya erişimi ağ gecikme süresini ortadan kaldırır
- Daha az karmaşıklık: Tek dosyalı veritabanı yedeklemeyi ve geçişi basitleştirir
Öğreneceğiniz teknikler, basit ayar depolamadan karmaşık veri yönetimi senaryolarına kadar yapılandırılmış verileri yerel olarak depolaması gereken tüm Windows uygulamaları için geçerlidir.
Tavsiye
SQLite'te SQL ekleme saldırılarını önlemeye yardımcı olmak için yapay zeka yardımlarını kullanabilirsiniz.
SQLite'in yerel depolama için avantajları
✔️ SQLite hafiftir ve bağımsızdır. Başka bağımlılıkları olmayan bir kod kitaplığıdır. Yapılandıracak bir şey yok.
✔️ Veritabanı sunucusu yok. İstemci ve sunucu aynı işlemde çalışır.
✔️ SQLite, genel etki alanında olduğundan, bunu ücretsiz olarak kullanabilir ve uygulamanızla dağıtabilirsiniz.
✔️ SQLite, platformlar ve mimariler arasında çalışır.
SQLite hakkında daha fazla bilgiyi buradan okuyabilirsiniz.
Soyutlama katmanı seçme
Microsoft tarafından oluşturulan Entity Framework Core veya açık kaynak SQLite kitaplığı kullanmanızı öneririz.
Entity Framework Core
Entity Framework (EF), etki alanına özgü nesneleri kullanarak ilişkisel verilerle çalışmak için kullanabileceğiniz nesne-ilişkisel eşleyicidir. Bu çerçeveyi diğer .NET uygulamalarındaki verilerle çalışmak için zaten kullandıysanız, WinUI uygulamanızda aynı kodu kullanabilirsiniz ve connection string uygun değişikliklerle çalışır.
Denemek için bkz. EF Core'u Kullanmaya Başlama.
SQLite kitaplığı
Microsoft.Data.Sqlite kitaplığı, System.Data.Common ad alanında arabirimleri uygular. Microsoft bu uygulamaları etkin bir şekilde korur ve alt düzey yerel SQLite API'sinin çevresinde sezgisel bir sarmalayıcı sağlar.
Bu kılavuzun geri kalanı bu kitaplığı kullanmanıza yardımcı olur.
Çözümünüzü Microsoft.Data.SQLite kitaplığını kullanacak şekilde ayarlama
Temel bir WinUI projesiyle başlayacağız ve ardından SQLite NuGet paketini yükleyeceğiz. İlk WinUI projenizi oluşturma yönergeleri için bkz. WinUI uygulaması oluşturma.
Windows'in desteklenen tüm sürümleri SQLite'i desteklediğinden uygulamanızın SQLite kitaplıklarını paketlemesi gerekmez. Bunun yerine uygulamanız, Windows yüklü olarak gelen SQLite sürümünü kullanabilir. Bu size birkaç şekilde yardımcı olur.
✔️ SQLite ikili dosyasını indirip uygulamanızın bir parçası olarak paketlemeniz gerekmeyen uygulamanızın boyutunu küçültür.
✔️ SQLite'in SQLite'teki hatalarda ve güvenlik açıklarında kritik düzeltmeler yayımlaması durumunda uygulamanızın yeni bir sürümünü kullanıcılara göndermenizi önler. SQLite'in Windows sürümü Microsoft tarafından SQLite.org ile eşgüdümlü olarak korunur.
✔️ Uygulama yükleme süresinin daha hızlı olma olasılığı vardır çünkü büyük olasılıkla SQLite'in SDK sürümü belleğe zaten yüklenir.
Projenize DataAccess adlı bir sınıf ekleyerek başlayalım. Veri erişim mantığınızı diğer istemci koduyla paylaşmayı planlıyorsanız, veri erişim kodunuzu içeren bir .NET sınıf kitaplığı projesi kullanabilirsiniz, ancak örneğimizde kullanmayacağız.
Çözüme sağ tıklayın ve ardından Çözüm için NuGet Paketlerini Yönet'e tıklayın.
Bu noktada, bir seçeneğiniz vardır. Windows ile birlikte gelen SQLite sürümünü kullanabilirsiniz veya belirli bir SQLite sürümünü kullanmak için bir nedeniniz varsa, paketinize SQLite kitaplığını ekleyebilirsiniz. Windows ile birlikte gelen SQLite sürümünü kullanacağız.
Gözat sekmesini seçin, Microsoft.Data.SQLite paketini arayın ve en son kararlı sürümü yükleyin.
SQLite veritabanında veri ekleme ve alma
Şunları yapacağız:
1️⃣ Veri erişim sınıfını hazırlayın.
2️⃣ SQLite veritabanını başlatın.
3️⃣ SQLite veritabanına veri ekleyin.
4️⃣ SQLite veritabanından veri alın.
5️⃣ Temel bir kullanıcı arabirimi ekleyin.
Veri erişim sınıfını hazırlama
Projenizde sınıfını DataAccess açın ve bu sınıfı statik hale getirin.
Uyarı
Örnek, veri erişim kodunuzu statik bir sınıfa yerleştirecek olsa da, bu bir tasarım seçimidir ve tamamen isteğe bağlıdır.
public static class DataAccess
{
}
Bu dosyanın en üstüne aşağıdaki using deyimleri ekleyin.
using Microsoft.Data.Sqlite;
using System.Collections.Generic;
SQLite veritabanını başlatma
SQLite veritabanını başlatan sınıfına bir yöntem DataAccess ekleyin.
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();
}
}
Uyarı
Üyeleri kullanan ApplicationData yukarıdaki kod yalnızca bir uygulama kapsayıcısında çalışan paketlenmiş uygulamalar için çalışır. Diğer tüm Windows uygulamaları ApplicationData sınıfı aracılığıyla üyelerine erişmelidir.
Bu kod SQLite veritabanını oluşturur ve uygulamanın yerel veri deposunda depolar.
Bu örnekte veritabanını sqlliteSample.db adlandıracağız ancak örneği oluşturduğunuz tüm SqliteConnection nesnelerinde bu adı kullandığınız sürece istediğiniz adı kullanabilirsiniz. Bir üretim uygulamasında, veritabanı dosya adı gibi bağlantı bilgileri uygulama yapılandırmasında depolanmalı, sabit kodlama yerine kullanılmalıdır (bkz. Azure Uygulama Yapılandırmasını Visual Studio Bağlı Hizmetler Kullanarak Eklemek).
Projenizin App.xaml.cs dosyasının oluşturucusunda, InitializeDatabase sınıfının DataAccess yöntemini çağırın. Bu, uygulama her başlatıldığında veritabanının oluşturulmasını veya açılmasını sağlar.
public App()
{
this.InitializeComponent();
DataAccess.InitializeDatabase();
}
SQLite veritabanına veri ekleme
SQLite veritabanına veri ekleyen sınıfına bir yöntem DataAccess ekleyin. Bu kod, SQL ekleme saldırılarını önlemek için sorgudaki parametreleri kullanır.
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 veritabanından veri alma
SQLite veritabanımızdaki bir tablodan tüm veri satırlarını alan bir yöntem ekleyin.
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 yöntemi, döndürülen verilerin satırları arasında ilerler. Kalan satırlar varsa döndürür true , aksi takdirde döndürür false.
GetString yöntemi, belirtilen sütunun değerini dize olarak döndürür. İstediğiniz verilerin sıfır tabanlı sütun sırasını temsil eden bir tamsayı değeri kabul eder. GetDataTime ve GetBoolean gibi benzer yöntemler kullanabilirsiniz. Sütunun içerdiği veri türüne göre bir yöntem seçin.
Tek bir sütundaki tüm girdileri seçtiğimiz için sıra parametresi bu örnekte bu kadar önemli değildir. Ancak, sorgunuzun parçası birden çok sütun varsa, verileri çekmek istediğiniz sütunu elde etmek için sıra değerini kullanın.
Temel kullanıcı arabirimi ekleme
Projenin MainWindow.xaml dosyasına aşağıdaki XAML'yi ekleyin.
<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>
Bu temel kullanıcı arabirimi, kullanıcıya SQLite veritabanına ekleyebileceğimiz bir dize yazabileceği bir TextBox sunar. Bu kullanıcı arabirimindeki Button öğesini, SQLite veritabanından veri alacak ve ardından bu verileri ListView içinde gösterecek bir olay işleyicisine bağlayacağız.
MainWindow.xaml.cs dosyasına aşağıdaki işleyiciyi ekleyin. Bu, kullanıcı arabirimi üzerinde Click'nün Button olayına bağladığımız yöntemdir.
private void AddData(object sender, RoutedEventArgs e)
{
DataAccess.AddData(Input_Box.Text);
Output.ItemsSource = DataAccess.GetData();
}
Ayrıca, uygulama başlatıldığında mevcut verilerin yüklendiğinden de emin olmak istiyoruz.
MainWindow oluşturucusuna GetData()'i çağırmak için bir kod satırı ekleyin.
public MainWindow()
{
this.InitializeComponent();
Output.ItemsSource = DataAccess.GetData();
}
İşte bu kadar. SQLite veritabanınızla başka neler yapabileceğinizi görmek için Microsoft.Data.Sqlite dosyasını keşfedin. Windows uygulamalarınızda verileri kullanmanın diğer yolları hakkında bilgi edinmek için aşağıdaki bağlantılara göz atın.
SQL enjeksiyon saldırılarından kaçının
Bu örnekteki kod, SQL ekleme saldırılarını önlemek için parametreli sorgular kullanır. Hiçbir zaman kullanıcı girişini bir SQL sorgu dizesine birleştirmeyin. Her zaman parametreleri kullanın. SQL ekleme saldırılarından kaçınma hakkında daha fazla ipucu için Copilot'tan sorabilirsiniz.
Aşağıdaki metinde Copilot için örnek bir istem gösterilmektedir:
Can you provide some best practices to avoid SQL injection attacks when writing SQLite queries in C# code?
Copilot yapay zeka ile desteklendiğinden sürprizler ve hatalar mümkündür. Daha fazla bilgi için bkz. Copilot SSS.
İlgili içerik
Uygulamanızı doğrudan bir SQL Server veritabanına bağlama
Bkz. Windows uygulamasında SQL Server veritabanı kullanma.
Farklı platformlarda farklı uygulamalar arasında kod paylaşma
Bkz. Masaüstü ve UWP arasında kod paylaşma.
Azure SQL arka uçlarına sahip ana-ayrıntı sayfaları ekleme
Windows developer