C# Metin Bağlantısına Derinlemesine Bir Bakış
Tim Corey'nin "C# Uygulama Baştan Sona" serisinin 11. Dersinde Tim, verileri metin tabanlı bir veri bağlantısı kullanarak metin dosyalarına nasıl kaydedeceğini açıklar. Tim, izleyicilere önceki derste SQL bağlantısını kurduklarını ve önemli hazırlık işlerini gerçekleştirdiklerini hatırlatarak başlar. Şimdi, Metin Bağlantısına odaklanıyoruz ve hedef açıktır: Metin bağlantısını SQL bağlantısı gibi çalıştırmak, sistemin bir PrizeModel almasını ve ID'si düzgün bir şekilde doldurulmuş olarak döndürmesini sağlamak. Tim, videonun düz metin dosyaları kullanarak veri depolama, okuma ve güncelleme için eksiksiz bir iş akışı göstereceğini vurgular.
Çözüm — Metin Bağlantısının Kurulması
Tim, DataAccess klasöründe Text Connector'ü açarak başlar. Örnek kodu siler ve sıfırdan başlar. SQL'den farklı olarak, metin dosyalarının otomatik ID arttırma gibi akıllı veritabanı özellikleri sağlamadığını açıklar. Bu yüzden ilk görev, metin dosyalarının nerede saklanacağına karar vermek.
Tim temiz bir tasarım önerir: Her modeli kendi metin dosyasında saklamak. Örneğin, PrizeModel, PrizeModels.csv adında kendi dosyasına sahip olacakken, diğer modeller MatchupModel gibi ayrı dosyalara sahip olacak. Tim, bu yapıyı SQL tablolarıyla karşılaştırır — her dosya, o modelin bir listesini içeren bir "tablo" haline gelir. Bu, verilerin kolayca yönetilmesini sağlar ve farklı model türlerinin karışmasını önler.
Bağlantı Dizgesi — Dosya Yolunu Saklama
Tim, tek bir dosya adı saklamak yerine, tüm dosyaların kaydedileceği klasör yolunun saklanacağını açıklar. Bu yol, app.config'deki appSettings altında yer alır. Tim, yeni bir anahtar-değer çifti ekler:
Anahtar: filePath
- Değer: dosyaların saklanacağı klasör yolu
Doğru Windows sözdizimini kullanmayı vurgular ve tam dosya yolu oluştururken sadece son bir eğik çizgi eklemeyi tercih ettiği için yolun sonunda eğik çizgi kullanmaktan kaçınır. Bu kurulum önemlidir çünkü uygulamayı esnek kılar — saklama konumu değişirse, yalnızca app.config güncellenir.
Plan — Metin Bağlantısının Nasıl Çalıştığı
Tim, bir ödül kaydetmek için net bir plan sunar:
Tüm ödülleri içeren metin dosyasını yükleyin.
Metin satırlarını bir PrizeModel listesine dönüştürün.
Listedeki en yüksek ID'yi bulun ve yeni ID = en yüksek ID + 1 olarak ayarlayın.
Yeni ödül modelini listeye ekleyin.
Ödül listesini tekrar metin satırlarına dönüştürün.
- Listenin eski verilerin üzerine yazılarak metin dosyasına kaydedilmesi.
Tim, metin dosyalarının SQL veritabanlarına kıyasla "aptal" olduğunu açıklar. SQL, ID'leri otomatik olarak yönetebilir, ancak metin dosyaları, geliştiricinin mantığı manuel olarak uygulamasını gerektirir. Bu yüzden Tim, süreci temiz ve yeniden kullanılabilir tutmak için daha küçük yöntemlere böler.
Yeni Bir Sınıf Oluşturma — Metin Bağlantılı İşlemci
Tim, TextConnectorProcessor adında yeni bir sınıf oluşturur. Bunu DataAccess klasörü içine yerleştirir, ancak ana ad alanını karmaşadan korumak için farklı bir ad alanında tutar. Tim, ad alanlarının esnek olduğunu ve özelleştirilebileceğini, ancak basit ve temiz tutulmalarını tavsiye eder.
Sınıfı public static yapar ve yardımcı yöntemler oluşturmaya başlar.
Genişletme Yöntemi — Tam Dosya Yolu
Tim bir genişletme yöntemi yaratır:
public static string FullFilePath(this string fileName)Bu yöntem, app.config'deki filePath ile dosya adını birleştirerek tam dosya yolunu oluşturur. Tim, ConfigurationManager.AppSettings["filePath"] kullanımını gösterir ve C# dizelerinde eğik çizgileri kaçağının gerekliliğini açıklar (\ kullanarak).
Daha sonra bu yöntemi bir genişletme yöntemi olarak dönüştürür, böylece bu şekilde kullanılabilir:
"ÖdülModelleri.csv".FullFilePath()Tim, bu genişletme yönteminin yalnızca metin bağlayıcısında gerekli olduğunu açıklar, bu yüzden çözümdün her yerde görünmemesi için bunu ayrı bir ad alanında tutar.
Dosya Yükleme Yöntemi — Metin Verilerini Okuma
Sonra Tim, başka bir genişletme yöntemi oluşturur:
public static List<string> LoadFile(this string file)Bu yöntem, dosyanın var olup olmadığını File.Exists() kullanarak kontrol eder. Eğer dosya yoksa, boş bir liste döner. Varsa, tüm satırları File.ReadAllLines() kullanarak okur ve bunları bir listeye dönüştürür.
Tim, bu uygulamanın ilk çalıştırılmasında yaygın olan eksik dosyaların düzgün şekilde ele alınmasının önemini vurgular.
Metni Ödül Modellerine Dönüştürme
Tim, yüklenen metin satırlarını bir PrizeModel listesine dönüştürmek için bir yöntem oluşturur:
public static List<ÖdülModeli> ConvertToPrizeModels(this List<string> satırlar)Her satırın virgülle ayrılmış değerler (CSV) içerdiğini açıklar. Tim, her satırı sütunlara böler ve uygun veri türlerine dönüştürür:
ID → int.Parse()
KonumNumarası → int.Parse()
KonumAdı → string
ÖdülMiktarı → decimal.Parse()
- ÖdülYüzdesi → double.Parse()
Tim ayrıca, verilerin geçersiz olması durumunda uygulamanın kasıtlı olarak çökeceğini açıklar. Bu, sorunları erken aşamada ortaya çıkarmaya yardımcı olur, bozulmuş veriler ile devam etmek yerine.
Maksimum ID'yi Bulma
Tim, TextConnector'a geri dönerek en yüksek ID'yi nasıl bulacağını açıklar:
int currentID = prizes.OrderByDescending(x => x.ID).First().ID + 1;Dosya boşsa çökeceğini belirtir, bu yüzden bir kontrol ekler:
if(ödüller.Count > 0)
{
currentID = prizes.OrderByDescending(x => x.ID).First().ID + 1;
}Bu, ilk kaydın 1 ID almasını sağlar.
Model Ekleme ve Kaydetme
Tim yeni ödülü listeye ekler ve ardından listeyi tekrar metin satırlarına dönüştürür:
public static void SaveToPrizeFile(this List<ÖdülModeli> modeller, string dosyaAdı)Her CSV satırını oluşturmak için string interpolasyonunu kullanır ve bunu bir dizi stringe ekler. Sonunda:
Dosya.WriteAllLines(dosyaAdı.FullFilePath(), satırlar);Tim, WriteAllLines'ın dosyayı üzerine yazdığı, bu durumun arzu edilen bir davranış olduğunu çünkü verilerin güncellenmiş içerikle tazelendiğini açıklar.
Modülü Döndürme
Tim, yöntemi, atanmış ID ile birlikte PrizeModel'i döndürerek sonlandırır. Bu, yeni ödülün uygulamanın geri kalanında kullanılmasını sağlar, tıpkı SQL gibi.
Metin Bağlantısını Test Etme
Tim, Program.cs'yi değiştirerek veri bağlantısını SQL'den Metin'e değiştirir. Uygulamayı çalıştırdığında ve ödüller oluşturduğunda, sistem başlangıçta eksik kayıtlar nedeniyle çöker. Tim, if(ödüller.Count > 0) kontrolüyle hatayı hızla düzeltir, daha sonra tekrar çalıştırır.
PrizeModels.csv dosyasına verilerin doğru bir şekilde kaydedildiğini ve dosyanın Notepad veya Excel'de nasıl açılabileceğini gösterir.
Son Düşünceler — Genişletme Yöntemleri ve Ad Alanları
Tim, dersin sonunda izleyicilere genişletme yöntemlerini yalnızca doğru ad alanı dahil edildiğinde görüneceğini hatırlatır. Bu, karmaşayı ve potansiyel isim çakışmalarını önler. Bu iki dersin, uygulamanın geri kalanı için güçlü bir temel oluşturduğunu ve gelecekteki geliştirme için aşama hazırladığını belirtir.

