Home / SQLite / C# ile SQLite / C# SQLite Kullanımı

C# SQLite Kullanımı

Sqlite dosya tabanlı hafif database’ler içerisinde günümüzde en çok tercih edilenlerin başında geliyor. Özellikle mobil uygulamalar ve basit programlar söz konusu olduğunda koskoca DBMS (Veritabanı yönetim sistemi) kurmak yerine işimizi basitçe halletmemizi sağlayan sqlite bizi pek çok dertten kurtarıyor.

Sqlite genel olarak uzaktan erişim ihtiyacı olmayan, kullanıcı doğrulaması gibi güvenlik gerektirmeyen sistemlerde tercih edilir. Mesela bir masaüstü program yaptınız, ya da Raspberry Pi gibi bir geliştirme kartı üzerinde yerel database kullanma ihtiyacınız doğdu. Sqlite sizi pek çok dertten kurtarır.

Şimdi C# ile SQlite kullanımı konusuna gelecek olursak, öncelikli olarak Visual Studio içerisinde nuget ile Sqlite’ı projemize dahil etmeliyiz.

 

Şimdi uzun uzun goygoy yapmadan yapmak istediğimiz işlemi ve kodu yazacağım. Gerektiği noktalara açıklama ekleyeceğiz.

 

C# Sqlite Dosya Oluşturma İşlemi

SQLiteConnection.CreateFile("YeniVeriTabani.db");

Yukarıdaki ifade “YeniVeriTabani” isminde bir tane database oluşturur. ancak dikkat edin, bu komutu her çalıştırdığınızda eskisini silip yenisini kurar. Bu arada eğer yol belirtmezseniz programı çalıştırıyorsanız dosyayı oraya oluşturur. Mesela debug modda compile edip çalıştırıyorsanız projenizin %projeyolunuz%/bin/Debug/YeniVeriTabani.db üzerine kurulum gerçekleşir.

Sadece Bir Kez Sqlite Dosya Oluşturma İşlemi

programınız her çalıştığında eski database’i silip yenisini kurarsa hiçbir veri tutamazsınız. Bu yüzden aynı dosya adı mevcut mu bunu kontrol etmemiz gerekir. Kodu birazcık geliştirelim;

if (!File.Exists("YeniVeriTabani.db"))
{
SQLiteConnection.CreateFile("YeniVeriTabani.db");
}

bu sefer kodu çalıştırdığımızda eğer aynı isimde veri tabanı yoksa oluşturacak. Varsa eskisini silmeden muhafaza edecek.

C# Sqlite Bağlantı Kurma

Sqlite Dosyamıza Bağlantı kurmak için öncelikli olarak iki tane global değişken oluşturalım.

public SQLiteConnection con = null;

SqliteConnection sınıfı nuget ile yüklediğimiz kütüphanenin içerisinde yer alır. Buradan türettiğimiz nesneyle bağlantı işlemlerimizi gerçekleştireceğiz. Şimdi C# Sqlite bağlantısı sağlamak için bir tane fonksiyon oluşturalım;

void baglan()
{
con = new SQLiteConnection("Data Source=YeniVeriTabani.db;Version=3;");
con.Open();
}

dikkat edin, con nesnesi global bir değişken. Bir sınıf içerisinde çalışırken global değişkene erişime dikkat etmeliyiz. Bu bağlantıyı çağırdığımızda Veritabanına bağlantıyı sağlamış oluyoruz.

C# Sqlite Tablo Oluşturma İşlemi

Sqlite içerisinde tablo oluşturma işlemi değişik programlarla da yapılabilir. Ancak biz bunu C# komutu ile gerçekleştireceğiz. Fonksiyon Biraz uzun gibi ama tek tek açıklıycaz;

Fonksiyonumuzda az önce oluşturmuş olduğumuz baglan() fonksiyonunu çağırdık ki database’imize bağlantı sağlayalım. Ardından using(con) diye bir ifade göreceksiniz. con nesnesi global olarak oluşturduğumuz nesneydi hatırlarsanız. Peki bu using nedir? bilmeyenler için diyelim C#’da bazı objelerin dispose edilmesi yani yok edilmesi lazım. Çoğu programcı bunu unutur. Bu yüzden Database’e bağlantı atarken eski bağlantı nesneleri yok edilmediği (dispose edilmediği) için hata almanıza neden olur. using ile bir nesneyi kullanırken işimiz bittiğinde kendiliğinden dispose edilir.

using (SQLiteCommand cmd = new SQLiteCommand(con)) satırında da aynı mevzu geçerli. SQLiteCommand nedir derseniz, bu komut ile birlikte SQL sorgularımızı oluşturabiliriz. Hatta SQL komutlarını oluşturmamız için şart olan bir sınıftır. cmd ise sınıftan türetilen nesnedir. bu nesne de using alanının bitiminde yok edilecektir.

cmd.CommandText ifadesi içerisinde bilgiğimiz sql komutu oluşturma işlemini gerçekleştiriyoruz. Sqlite için özellikle değişken isimlerinde bazı farklılıklar mevcuttur. Ayrıntı için lütfen linke bakın; https://www.sqlite.org/datatype3.html

Kod ile tablo oluştururken if not exists ifadesine dikkat edin. Çünkü programımız her çalıştığında çalışacak bir kod ise bunu yazmamız gerekecektir. cmd.ExecuteNonQuery(); ile kodumuzu çalıştırdık. con.Close(); ile de bağlantıyı sonlandırıyoruz. Her using bloğundan çıkışta ilgili nesne dispose edileceği için bizim dispose etmemize gerek kalmıyor.

 

C# SQLite Toplu Select Sorgusu

Kişiler diye bir sınıfımızın olduğunu varsayalım. SQLite select sorgusunu çalıştırıp Tüm kişileri listeye ekleyip geri döndürelim.

Yine satır satır anlatacak olursak baglan komutu ile Veritabanına bağlantı oluşturduk. List<Kisiler> Kisilerim = new List<Kisiler>(); kısmı işin örnek kısmı, kullanımı somutlaştırmak için bir tane kişiler listesi oluşturuyorum.

Daha sonra sırası ile con nesnesi ve cmd nesnelerini using içerisinde kullanıyorum.

cmd.CommandText = @”Select * from Kisiler”; sorgusu ise C# SQLite select sorgusudur. Buradaki kritik nokta toplu select yaptıktan sonra bu verileri okumak istediğimizde yapacağımız işlemdir. Yine yeni bir nesne oluşturma ihtiyacımız ortaya çıkar. Bu nesne de SQLiteDataReader sınıfından türetilir.

SQLiteDataReader rdr = cmd.ExecuteReader() ==> Bu ifade rdr nesnesine cmd komutuna atanmış sorguyu çalıştırarak atar. Böylece bu nesneye erişerek okuduğumuz niteliklere erişebiliriz.

while (rdr.Read()) { …… } Kısmı okuduğumuz niteliklerdir. Mesela rdr.GetInt32(0); ile yazılan kısmı açıklamak gerekirse, parantez içerisinde yazan sayı tablomuzdaki kaçıncı sütun olduğu anlamına gelmektedir. Bizim tablomuzda 0. yani ilk sütun KisiID’dir. Türü int olduğu için getInt32 fonksiyonu ile çağırdık. (Dikkat edin, class’ınızdaki değişken türleri de aynı olmalıdır)

C# SQLite Tekli Select Sorgusu

Aşağıdaki sorgu ise belirli bir kritere göre select sorgusu yapar. Tekli dediğimize bakmayın, birden fazla da sonuç olabilirdi, ama tamamen aynı mantık.

Bazı şeyleri tekrar anlatmaya gerek yok. Fonksiyona KisiID bilgisini gönderiyoruz, fonksiyon da kişi var ise kişiyi döndürüyor. (Yoksa boş döndürüyor) Ama fonksiyondaki değişik kısma gelirsek;

cmd.CommandText = @”Select * from Kisiler Where KisiID = @KisiID“; Bu satırdaki @KisiID yazımı dikkatinizi çekmiştir. Bu tip yazımı parametre atamak istediğimizde yazıyoruz.

cmd.Prepare(); komutu ise parametre atamak için önhazırlık fonksiyonu mahiyetinde.

cmd.Parameters.AddWithValue(“KisiID”, KisiID); satırında ise parametre ataması gerçekleştiriyoruz. Fonksiyonun parametrelerinde ise ilk parametre “KisiID” @ ile yazılmış değere atama yapılacağı anlamı taşıyor. İkinci parametre KisiID ise fonksiyona yolladığımız parametrenin ta kendisi. Böylece SQL sorgusu içerisine düzgün bir şekilde parametre ataması yapmış oluyoruz.

C# SQLite INSERT Komutu

Sqlite insert komutu için Veritabanına yine bir kişi ekleyeceğiz. Fonksiyonumuz Kişi ekleyecek, eklediğimiz kişinin KisiID Bilgisini return edecek.


Fonksiyonun temel farkına değinecek olursak SQLiteTransaction transaction = null; transaction = con.BeginTransaction(); ifadeleri. Transaction genelde Insert ve Update komutlarında kullanılır. Commit etmeye yarar. Bilgi eğer commit edilmezse Veritabanına değişiklikler yansımaz. Ekleme işleminden önce Trasaction başlatılır. Ekleme Bittiğinde transaction.Commit(); ile commit edilir.

Bir diğer farklılık da con.LastInsertRowId; en son insert edilen satırın ID bilgisini elde edebilmemizdir. Bazı durumlarda bu gerekli olur. Yani mesela ilk adımda kişi ekleyeceksiniz daha sonra eklediğiniz kişi ile ilgili bir iş daha yapacaksınız. Bu yüzden ID bilgisi gerekli olabilir. Fonksiyonumuz kişiyi ekliyor return lastID ile de KisiID bilgisini return ediyor. 

 

C# SQLite Update Komutu Kullanımı

SQLite update komutu select komutu ile yapısal benzerlik gösterir. Where komutu ile nereyi set edeceğimizi belirtiriz.

Update komutu da bir değişiklik olduğundan transaction ile yapmak en doğrusu olacaktır. (Transaction nesnesinin bir de rollback diye bir diğer komutu vardır. cmd.ExecuteNonQuery(); hata verdiğinde rollback ile değişiklikleri geri alabilirsiniz. (Paylaştığım kodda hata kontrolü yok)

C# SQLite Delete Komutu Kullanımı

SQLite delete komutu dile belirli bir şarta sahip kaydı silebilirsiniz.

Delete olayı da diğer SQL sorgularıyla aynı mantıkta. Sileceğiniz satırı neye göre sileceğinizi belirtip siliyorsunuz. Transaction kullanmadan da bu şekilde işlem yapabilirsiniz. Ancak yaptığınız işlemi rollback yapamazsınız. Kayıt gitti mi gider 🙂

 

C# ile Temel SQLite sorguları işlemleri bu şekilde. Daha gelişmiş işlemler için SQL sorgularıyla oynamanız gerekecek. Temel mantıklar bu şekilde. Bu işin bir ileri evresi hata kontrollerini düzgün bir şekilde yapmak. Biz bu yazıda hata kontrolleri ile ilgilenmedik. Yalnızca

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir