Bir masaüstü uygulaması geliştirmeye başladığınızda, programınızın belirli verileri hafızasında tutması gerektiğini hemen fark edersiniz. Kullanıcıların girdiği form bilgileri, ürün stokları veya müşteri detayları gibi veriler, program çalıştığı sürece RAM (Rastgele Erişimli Bellek) üzerinde tutulur; ancak program kapatıldığında tamamen silinir. Hazırladığınız C# Windows Forms uygulamasındaki verilerin kalıcı olmasını ve programı yeniden açtığınızda bile erişilebilir olmasını istiyorsanız, uygulamanızı bir veri tabanına (database) bağlamanız ve verileri buraya kaydetmeniz gerekir.
Bu rehberde, masaüstü programlamaya ve veri tabanı işlemlerine ilk defa adım atanlar için C# Windows Forms uygulamasından bir veri tabanına nasıl kayıt ekleneceğini, en çok kullanılan iki farklı yöntemle (ADO.NET ve Entity Framework Core) adım adım öğreneceksiniz.
Veri Tabanı Bağlantısının Temeli: Connection String (Bağlantı Dizesi)
Hangi teknolojiyi kullanırsanız kullanın, uygulamanızın SQL Server, MySQL veya PostgreSQL gibi bir veri tabanına bağlanabilmesi için bir “Connection String” (Bağlantı Cümlesi) kullanması zorunludur. Bağlantı cümlesi, programınıza veri tabanının hangi sunucuda olduğunu, veri tabanının adını ve sisteme giriş yapmak için gereken kullanıcı adı ile şifreyi söyler.
Örnek bir SQL Server bağlantı dizesi şu şekildedir: "Server=SUNUCU_ADI;Database=VeritabaniAdi;User Id=kullanici;Password=sifre;TrustServerCertificate=True;"
Yerel bir veri tabanında (LocalDB) çalışıyorsanız, şifre gerektirmeyen entegre güvenlikli bir bağlantı dizesi de kullanabilirsiniz: "Server=(localdb)\MSSQLLocalDB;Database=VeritabaniAdi;Integrated Security=true;"
Yöntem 1: ADO.NET ile Veritabanına Kayıt Ekleme
Uygulamanız ile veri tabanı arasında doğrudan iletişim kurmak ve SQL sorgularına tam hâkim olmak istiyorsanız, .NET’in sunduğu klasik veri erişim teknolojisi olan ADO.NET yapısını kullanmalısınız. ADO.NET, uygulama ile veri tabanı arasında adeta bir köprü görevi görerek yazdığınız SQL sorgularının doğrudan sunucuda çalıştırılmasını sağlar.
SQL INSERT INTO Komutu
Veri tabanı tablolarına yeni bir kayıt (satır) eklemek için SQL dilindeki INSERT INTO komutu kullanılır. Klasik kullanımı şu şekildedir: INSERT INTO TabloAdı (alan1, alan2) VALUES (deger1, deger2).
Adım Adım ADO.NET ile Kayıt Ekleme Kodlaması
Windows Formunuzda kullanıcıdan “Müşteri Adı” ve “E-Posta” bilgilerini alacağınız iki adet TextBox (txtName ve txtEmail) ve kayıt işlemini başlatacak bir Button (btnKaydet) olduğunu varsayalım.
Güvenli ve doğru bir kayıt işlemi için butonun tıklanma (Click) olayına şu kodlar yazılmalıdır:
using Microsoft.Data.SqlClient; // SQL Server sınıflarını kullanmak için eklenmelidir
using System.Threading.Tasks;
using System.Windows.Forms;
private readonly string _connectionString = "Server=(localdb)\\MSSQLLocalDB;Database=MyDatabase;Integrated Security=true;";
private async void btnKaydet_Click(object sender, EventArgs e)
{
// 1. SQL Sorgumuzu hazırlıyoruz. Verileri doğrudan yazmak yerine @ parametreleri kullanıyoruz.
string sql = "INSERT INTO Customers (Name, Email) VALUES (@Name, @Email);";
// 2. using blokları ile bağlantı ve komut nesnelerini oluşturuyoruz.
// using bloğu, işlem bittiğinde bağlantının bellekte yer kaplamadan otomatik kapanmasını sağlar.
using (var conn = new SqlConnection(_connectionString))
using (var cmd = new SqlCommand(sql, conn))
{
// 3. Parametrelere, formdaki TextBox'lardan gelen değerleri aktarıyoruz.
cmd.Parameters.AddWithValue("@Name", txtName.Text);
cmd.Parameters.AddWithValue("@Email", txtEmail.Text);
try
{
// 4. Veri tabanı bağlantısını açıyoruz (Asenkron olarak)
await conn.OpenAsync();
// 5. Sorguyu çalıştırıyoruz
int etkilenenSatir = await cmd.ExecuteNonQueryAsync();
MessageBox.Show("Müşteri başarıyla veri tabanına eklendi.");
}
catch (SqlException ex)
{
MessageBox.Show("Veri tabanı hatası: " + ex.Message);
}
}
}
ADO.NET Kodunun Anatomisi ve Best Practices (En İyi Uygulamalar)
- ExecuteNonQuery Metodu: ADO.NET’te
MySqlCommandveyaSqlCommandsınıfları içindeki bu metot; veri ekleme (INSERT), silme (DELETE) ve güncelleme (UPDATE) sorgularını çalıştırmak için kullanılır ve geriye veri tabanında kaç satırın etkilendiğini (değiştiğini) döndürür. - using Blokları: Veri tabanı bağlantıları bellekte ciddi yer tutar.
usingbloğu kullandığınızda, parantezlerin sonuna gelindiğinde bağlantı otomatik olarak kapatılır (Close) ve temizlenir (Dispose). Bu nedenle manuel olarak.Close()yazmanıza gerek kalmaz. - Parametrik Sorgular (SQL Injection Koruması): Kodda değerleri SQL metni içine doğrudan birleştirmek yerine
cmd.Parameters.AddWithValue()komutu kullandık. Eğer TextBox’taki değeri direkt SQL’in içine koysaydık, kötü niyetli kullanıcılar SQL Injection adı verilen yöntemle veri tabanınıza sızabilirdi. Parametre kullanmak bu güvenlik açığını tamamen engeller. - Asenkron Programlama (async/await): Kodda
OpenAsyncveExecuteNonQueryAsynckullandık. Masaüstü uygulamalarında (UI) veri tabanı işlemleri uzun sürebilir. Eğer bu işlemleri asenkron yapmazsanız, veri tabanı cevap verene kadar formunuz donar (kilitlenir) ve kullanıcı hiçbir butona tıklayamaz. Asenkron metotlar UI kilitlenmelerini önler.
Yöntem 2: Entity Framework Core (EF Core) ile Kayıt Ekleme
ADO.NET geleneksel ve hızlı bir yöntem olsa da, modern C# projelerinde veritabanı işlemleri için kod yazımını hızlandıran ve SQL kodu yazma zorunluluğunu ortadan kaldıran Entity Framework Core (EF Core) önerilir. EF Core, tabloları C# sınıfları (Class) gibi, tablolardaki alanları ise sınıfların özellikleri (Property) gibi kullanmanızı sağlayan bir ORM (Object-Relational Mapper) aracıdır.
EF Core kullanıyorsanız uygulamanızda zaten tablolarınızı temsil eden C# sınıflarınız (örneğin Customer sınıfı) ve veri tabanı bağlantısını temsil eden bir DbContext (örneğin AppDbContext) sınıfınız bulunur.
EF Core ile form üzerinden kayıt eklemek, ADO.NET’e göre çok daha okunaklı ve nesne yönelimlidir. Aynı müşteri ekleme işleminin EF Core versiyonu şu şekildedir:
private async void btnKaydet_Click(object sender, EventArgs e)
{
try
{
// 1. Eklenecek olan yeni Customer (Müşteri) nesnesi oluşturulur
var yeniMusteri = new Customer
{
Name = txtName.Text,
Email = txtEmail.Text
};
// 2. DbContext sınıfı başlatılır
using var context = new AppDbContext();
// 3. Oluşturulan nesne, veritabanı tablosunu temsil eden DbSet'e (Customers) eklenir
context.Customers.Add(yeniMusteri);
// 4. Değişiklikler asenkron olarak veritabanına kaydedilir
await context.SaveChangesAsync();
MessageBox.Show("Müşteri başarıyla eklendi (EF Core).");
// Form elemanlarını temizleme
txtName.Clear();
txtEmail.Clear();
}
catch (Exception ex)
{
MessageBox.Show("Beklenmeyen bir hata oluştu: " + ex.Message);
}
}
EF Core Yönteminin Avantajları
EF Core ile INSERT INTO gibi SQL komutlarını bilmenize veya manuel parametre ataması yapmanıza gerek kalmaz. Sadece C# kodunda yeni bir nesne türetir ( new Customer ), bu nesneyi koleksiyona ekler (Add) ve SaveChangesAsync() metodunu çağırırsınız. Entity Framework sizin için arka planda gerekli en güvenli SQL sorgusunu kendisi üretir ve çalıştırır.
Hata Ayıklama (Try-Catch) Neden Önemlidir?
Hem ADO.NET hem de EF Core kullanırken dikkat etmeniz gereken en önemli kural Try-Catch hata ayıklama bloklarını kullanmaktır. Veri tabanı işlemleri dış dünyaya ve sunucu bağlantılarına bağımlıdır. İnternet bağlantısının kopması, sunucu bilgisayarın kapanması, yetki problemleri veya tabloda Primary Key (Birincil Anahtar) olarak belirlenmiş benzersiz bir alana aynı verinin tekrar girilmeye çalışılması (Duplicate Key) durumlarında programınız aniden hata verip çökebilir.
Kodlarınızı try bloğu içine almak ve olası çökme durumlarında programı sonlandırmak yerine catch bloğu içinde kullanıcıya "Veri tabanına ulaşılamadı, lütfen daha sonra tekrar deneyiniz." gibi dostça bir MessageBox göstermek profesyonel yazılım geliştirmenin temel standartlarından biridir.
Sonuç
C# Windows Forms uygulamalarında bir veri tabanına kayıt eklemek (Create), CRUD işlemlerinin en temel parçasıdır. Temel veri tabanı mantığını ve arka planda çalışan SQL sorgularını iyice kavramak için öğrenme aşamasında ADO.NET ile pratik yapmak oldukça faydalıdır. Ancak uygulamanız büyüdükçe ve profesyonel düzeye ulaştıkça iş akışınızı hızlandırmak, SQL Injection gibi güvenlik zaaflarını otomatik önlemek ve temiz kod (Clean Code) standartlarına uymak için Microsoft’un modern ORM aracı olan Entity Framework Core (EF Core) yapısını projenize dâhil etmelisiniz. Hangi yöntemi seçerseniz seçin, kullanıcı arayüzünün donmasını önlemek için işlemlerinizi mutlaka async/await mimarisiyle asenkron olarak tasarlamayı unutmayın. Bol kodlu ve hatasız günler!




