← Tüm yazılar

DataRow’u iş modeline güvenli dönüştürmek

Excel veya tablo aktarımında hücrede görünen değerle iş modelinin beklediği tip aynı olmayabilir. Miktar alanında metin, boş hücre ve yanlış giriş varsa doğrudan cast etmek yerine satır bazında dönüştürme sonucu üretmek gerekir.

t.Turgay
DataRow’u iş modeline güvenli dönüştürmek

Excel aktarımında Quantity hücresini okumak bir satır kod olabilir. O hücrede 12, boşluk, formül sonucu veya “belirsiz” metni varsa iş modeline ne yazılacağı ise uygulamanın kararıdır. Arşivimdeki tablo dönüştürme yardımcılarının işaret ettiği konu tam da bu: veriyi okumakla kabul etmek arasında açık bir sınır kurmak.

Kaynak şeması belli olmadan cast yapmamak

Örnekte DataTable içindeki Quantity kolonu bilerek string. Üç kayıt “12”, “oops” ve DBNull içeriyor. Hedef sözleşme ise sıfır veya pozitif bir tamsayı. Bu ayrımı baştan seçtiğim için dönüştürme mantığının hangi girdileri kabul edeceğini konuşabiliyorum. Konsol örneği .NET 10 üzerinde System.Data ve System.Globalization ile çalışır; gerçek Excel dosyası okuma adımı kapsamın dışında.

using System.Data;
using System.Globalization;
var table = new DataTable();
table.Columns.Add("Quantity", typeof(string));
table.Rows.Add("12"); table.Rows.Add("oops"); table.Rows.Add(DBNull.Value);
for (int i=0; i<table.Rows.Count; i++)
{
    var text = table.Rows[i].Field<string>("Quantity");
    var valid = int.TryParse(text, NumberStyles.Integer, CultureInfo.InvariantCulture, out var quantity) && quantity >= 0;
    Console.WriteLine(valid ? $"row {i+1}: {quantity}" : $"row {i+1}: invalid quantity");
}

Field<string> bu metin kolonundaki DBNull değerini null olarak verir. Ardından TryParse false döndürür; boş bir hücre normal doğrulama sonucu olarak ele alınır. Fakat kolonun tipi zaten int veya decimal ise aynı Field<string> çağrısı genel bir dönüştürme yöntemi olmaz. Önce kaynağın gerçek tipini ve aktarım okuyucusunun ürettiği şemayı anlamak gerekir.

Parse sonucu ile iş kuralı sonucu farklıdır

int.TryParse başarılıysa değer temsil edilebilir bir tamsayıdır. quantity >= 0 kontrolü ise miktarın iş alanında kabul edildiğini söyler. “-3” biçim olarak geçerlidir ama bu örneğin miktar kuralından geçmez. “2147483648” ise int aralığına sığmadığı için daha önce, parse aşamasında reddedilir. Hata raporunda bu ayrım kullanıcıya hangi düzeltmeyi yapacağını gösterebilir.

NumberStyles.Integer kenardaki boşlukları ve işaret karakterini kabul edebilir; binlik ayırıcı veya ondalık değer sözleşmenin parçası değildir. Bu nedenle 12,5 girdisinin “yaklaşık 12” yapılmasını beklemem. Miktar gerçekten ondalıklı olabiliyorsa modeli ve parser'ı birlikte decimal olarak değiştiririm; sessiz kırpma eklemem.

Kültürü kaynağın sözleşmesi belirlesin

Makinenin o anki kültürünü kullanmak aynı dosyanın farklı bilgisayarlarda farklı yorumlanmasına yol açabilir. Burada InvariantCulture açıkça seçilmiş. Kullanıcıya Türkçe ondalık dosya formatı sunacaksam bunu aktarım tanımında belirtir, o formatı tek biçimde okurum. Excel'deki sayısal hücreyi önce yerel biçimlendirilmiş string'e çevirip sonra tekrar parse etmek ise gereksiz ve kayıplı bir tur olabilir.

Hata mesajı kullanıcının dosyasına geri dönmeli

row 2: invalid quantity, en azından hangi kaydın bozulduğunu söyler. Gerçek dosyada başlık satırı varsa ekrandaki ikinci veri kaydı dosyanın üçüncü satırına karşılık gelebilir; kaynak satır numarasını ayrıca taşırım. Kolon adı, beklenen tür ve ret nedeni de aynı hata nesnesinde bulunmalı. Hücrenin tamamını loglamak yerine kullanıcıya gereken dar bilgiyi gösteririm.

Geçersiz değeri sıfıra dönüştürmem. Sıfır geçerli bir miktarsa “eksik” ile “gerçekten sıfır” artık ayırt edilemez. Sonradan düzeltilecek kayıt kuyruğu kuracaksam orijinal girdiyi kontrollü biçimde saklama ve düzeltme sürecini ayrıca tasarlarım; iş tablosuna uydurulmuş bir varsayılan yazmam.

Doğrulama tamamlanınca ne kaydedilecek?

Örnek yalnız sonuçları konsola yazar. Dosyanın tamamını atomik kaydetmek istiyorsam önce tüm dönüşüm sonuçlarını toplar, hata yoksa transaction açarım. Geçerli satırların kabul edildiği bir ithalat ise kullanıcıya kabul ve ret adetlerini açıkça bildirir. Döngü içinde ilk satırı kaydedip son satırda hata vermek, bu iki politikadan hiçbirini kendiliğinden tanımlamaz.

Denemelerde 0, -1, çevresinde boşluk olan 12, int sınırları ve boş hücre bulunmalı. Beklenen çıktı ilk satırda 12, sonraki iki satırda hata. Bu küçük matris, büyük dosyadan önce veri sözleşmesinin çalıştığını gösterir.

DataRowExtensions.Field; Int32.TryParse ve NumberStyles.

✳ Bu yörüngenin sonuna geldin.
Diğer yazıları keşfet →
turgay.Biraz kod, biraz piksel, bolca merak.© 2026 · Dünya’dan sevgilerle ✳