Gereksinimler ve Ön Hazırlık
Dapper ile çalışmaya başlamadan önce geliştirme ortamınızın hazır olduğundan emin olmalısınız. Dapper, .NET 6, .NET 8 ve 2026 itibarıyla güncel olan .NET 9+ sürümleri ile tam uyumlu çalışır. Projenize Dapper'ı dahil etmek için NuGet paket yöneticisini kullanmanız yeterlidir.
- Visual Studio 2022 veya güncel bir kod editörü (VS Code gibi).
- .NET SDK (projenizin gerektirdiği sürüm).
- SQL Server, PostgreSQL veya MySQL gibi bir veritabanı sunucusu.
- Proje içerisinde
Microsoft.Data.SqlClientveya kullandığınız veritabanı sağlayıcısının sürücüsü.
Paketi yüklemek için terminalinize veya NuGet Paket Yöneticisi konsoluna şu komutu yazarak başlayabilirsiniz:
dotnet add package Dapper
Dapper ile Veritabanı Bağlantısı Kurma
Dapper, doğrudan IDbConnection arayüzü (interface) üzerinden çalışır. Bu, Dapper'ın veritabanı bağımsız olduğunu gösterir. Bağlantı dizesini (connection string) yönetmek için genellikle appsettings.json dosyasını kullanırız. Aşağıdaki örnekte, SQL Server bağlantısı üzerinden Dapper'ın nasıl başlatılacağını görebilirsiniz.
using Microsoft.Data.SqlClient;
using System.Data;
string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";
using IDbConnection db = new SqlConnection(connectionString);
db.Open();
// Artık veritabanı işlemleri yapmaya hazırsınız.
Bu kod bloğu, veritabanı ile güvenli bir bağlantı kanalı açar. using ifadesi, işlem bittiğinde bağlantının otomatik olarak kapatılmasını ve kaynakların serbest bırakılmasını sağlar.
Dapper ile Veri Listeleme (Query)
Veritabanından veri çekmek için Dapper'ın Query metodunu kullanırız. Bu metod, SQL sorgunuzu çalıştırır ve dönen sonuçları belirttiğiniz sınıfa (model) otomatik olarak eşler (mapping). Aşağıdaki örnekte, bir kullanıcılar tablosundan tüm verilerin nasıl çekileceğini görebilirsiniz.
public class Kullanici {
public int Id { get; set; }
public string Ad { get; set; }
public string Eposta { get; set; }
}
var kullanicilar = db.Query("SELECT * FROM Kullanicilar").ToList();
Burada Kullanici sınıfının özellikleri, veritabanındaki sütun isimleriyle eşleşmelidir. Eğer isimler farklıysa, SQL sorgusunda AS takma adını kullanarak eşleştirme yapabilirsiniz.
Parametreli Sorgular ve SQL Injection Koruması
Kritik Güvenlik Uyarısı: Veritabanı işlemlerinde asla kullanıcıdan gelen verileri doğrudan SQL sorgusunun içine string birleştirme (concatenation) yöntemiyle eklemeyin. Bu, SQL Injection saldırılarına kapı aralar. Dapper, parametreli sorguları destekleyerek bu riski ortadan kaldırır.
Parametreli sorgular, verinin koddan ayrıştırılmasını sağlar. Dapper, anonim nesneler kullanarak bu parametreleri güvenli bir şekilde sorguya enjekte eder.
int arananId = 5;
var kullanici = db.QuerySingleOrDefault(
"SELECT * FROM Kullanicilar WHERE Id = @Id",
new { Id = arananId });
Bu yöntem, @Id ifadesinin güvenli bir şekilde işlenmesini sağlar. QuerySingleOrDefault metodu, tek bir kayıt döneceği durumlarda kullanılır; kayıt yoksa null döner.
Veri Ekleme, Güncelleme ve Silme (Execute)
Veri manipülasyonu (INSERT, UPDATE, DELETE) işlemleri için Execute metodu kullanılır. Bu metod, etkilenen satır sayısını bir tamsayı (integer) olarak döndürür.
var yeniKullanici = new { Ad = "Ahmet", Eposta = "ahmet@example.com" };
string sql = "INSERT INTO Kullanicilar (Ad, Eposta) VALUES (@Ad, @Eposta)";
int etkilenenSatir = db.Execute(sql, yeniKullanici);
Güncelleme veya silme işlemleri de aynı mantıkla çalışır. Yalnızca SQL sorgunuzu UPDATE veya DELETE komutlarına göre değiştirmeniz yeterlidir.
Dapper ve Entity Framework Karşılaştırması
| Özellik | Dapper | Entity Framework |
|---|---|---|
| Performans | Çok Yüksek (Native SQL hızı) | Orta (Soyutlama katmanı var) |
| SQL Hakimiyeti | Tam kontrol (SQL yazılır) | Düşük (LINQ kullanılır) |
| Öğrenme Eğrisi | Düşük (SQL bilenler için kolay) | Yüksek (Karmaşık konfigürasyon) |
Sıkça Sorulan Sorular
Dapper büyük projelerde kullanılabilir mi?
Evet, Dapper performans gerektiren büyük ölçekli kurumsal projelerde oldukça yaygın tercih edilir. Saf SQL gücü, karmaşık raporlama ve yüksek trafikli sistemlerde avantaj sağlar.
Dapper ile "Async" (Asenkron) işlemler nasıl yapılır?
Dapper, tüm metodlarının asenkron versiyonlarını destekler. Örneğin, QueryAsync veya ExecuteAsync kullanarak uygulamanızın yanıt süresini optimize edebilirsiniz.
Veritabanı bağlantısı neden "using" bloğunda olmalı?
IDbConnection nesnesi, veritabanı havuzundan (connection pool) bir bağlantı alır. using bloğu, işlem bittiğinde bağlantının havuza geri dönmesini garanti eder, böylece "connection leak" (bağlantı sızıntısı) sorunlarının önüne geçilir.
Dapper'da "Stored Procedure" nasıl çağrılır?
Dapper'da commandType: CommandType.StoredProcedure parametresini kullanarak saklı yordamları kolayca çalıştırabilirsiniz.
Dapper ile nesne eşleme (mapping) hatalarını nasıl çözerim?
Eğer sınıf özellikleriniz ile veritabanı sütunlarınız farklı isimdeyse, SQL tarafında SELECT Ad AS Isim FROM Kullanicilar şeklinde takma ad kullanarak eşleşme sorunlarını giderebilirsiniz.
Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamında veritabanı işlemlerinizi gerçekleştirirken bağlantı dizesi güvenliği, hata yönetimi (try-catch blokları) ve veritabanı yetkilendirme prensiplerine uymanız zorunludur.
Dapper ile Transaction (İşlem) Yönetimi
Veritabanı işlemlerinde veri bütünlüğünü korumak kritik bir öneme sahiptir. Özellikle birbirine bağlı birden fazla tabloya veri yazmanız gerektiğinde, işlemlerden birinin başarısız olması durumunda tüm operasyonun geri alınması (rollback) gerekir. Dapper, ADO.NET'in IDbTransaction arayüzü ile tam uyumlu çalışarak bu süreci oldukça kolaylaştırır.
Aşağıdaki örnekte, bir banka transferi senaryosunda iki farklı hesaptan para aktarımı işlemini güvenli bir şekilde nasıl gerçekleştirebileceğinizi görebilirsiniz:
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
using (var transaction = connection.BeginTransaction())
{
try
{
// İlk işlem: Göndericiden para düş
var sql1 = "UPDATE Accounts SET Balance = Balance - @Amount WHERE Id = @FromId";
connection.Execute(sql1, new { Amount = 100, FromId = 1 }, transaction: transaction);
// İkinci işlem: Alıcıya para ekle
var sql2 = "UPDATE Accounts SET Balance = Balance + @Amount WHERE Id = @ToId";
connection.Execute(sql2, new { Amount = 100, ToId = 2 }, transaction: transaction);
// Tüm işlemler başarılıysa onayla
transaction.Commit();
}
catch (Exception)
{
// Bir hata oluşursa tüm değişiklikleri geri al
transaction.Rollback();
throw;
}
}
}
Dapper Multi-Mapping (Çoklu Tablo Eşleme) Kullanımı
İlişkisel veritabanlarında veriler genellikle farklı tablolara bölünmüştür. Dapper'ın en güçlü özelliklerinden biri, Query metodunu kullanarak JOIN sorgularından gelen verileri birden fazla nesneye eşleyebilmesidir. Bu sayede karmaşık verileri tek bir sorgu ile nesne yönelimli dünyaya aktarabilirsiniz.
Örneğin, bir Order (Sipariş) nesnesi ile ona bağlı olan Customer (Müşteri) nesnesini tek seferde çekmek için şu yaklaşımı kullanabilirsiniz:
string sql = @"SELECT o.*, c.* FROM Orders o
INNER JOIN Customers c ON o.CustomerId = c.Id";
var orderList = connection.Query(
sql,
(order, customer) =>
{
order.Customer = customer;
return order;
},
splitOn: "Id"
);
İpucu: splitOn parametresi, Dapper'a ikinci nesnenin (Customer) hangi sütundan itibaren başlayacağını belirtir. Varsayılan değer "Id"dir, ancak tablonuzun yapısına göre bu değeri özelleştirmeniz gerekebilir.
Dapper ile Performans İpuçları
Dapper zaten oldukça hızlı bir "Micro-ORM" olsa da, uygulama performansını en üst düzeye çıkarmak için şu noktalara dikkat etmelisiniz:
- Buffered Parametresi: Dapper varsayılan olarak sonuçları belleğe (buffered) alır. Çok büyük veri setleri (milyonlarca satır) ile çalışıyorsanız,
buffered: falseparametresini kullanarak verileri akış (streaming) şeklinde okuyabilir ve bellek kullanımını optimize edebilirsiniz. - Statik Sorgular: SQL sorgularınızı mümkünse statik veya sabit değişkenlerde tutun. Dapper, sorgu planlarını önbelleğe alarak (caching) aynı sorgunun tekrar çalıştırılmasında ciddi performans artışı sağlar.
- Gereksiz Sütunlardan Kaçının:
SELECT *yerine sadece ihtiyacınız olan sütunları belirtmek, veritabanı ağ trafiğini ve nesne oluşturma maliyetini düşürür.
Sonuç
C# ile Dapper kullanarak veritabanı işlemleri gerçekleştirmek, hem performans hem de geliştirme verimliliği açısından profesyonel bir tercihtir. Bu rehberde, Dapper'ın temel kurulumunu, güvenli sorgu yazma tekniklerini ve CRUD (Ekleme, Okuma, Güncelleme, Silme) operasyonlarını adım adım inceledik. Bir sonraki adım olarak, Dapper'ın Multi-Mapping (çoklu tablo eşleme) özelliklerini ve Transaction yönetimini araştırarak veritabanı katmanınızı daha yetenekli hale getirebilirsiniz.


Yorumlar (0)
Yorum Yaz