0 oy
592 gösterim
C# da SQL veritabanına bazen veri kaydederken hata alıyorum. Hatanın nedenini araştırdığımda veri kaydettiğim tabloda ki alanların Lenght boyutu kaydettiğim verinin boyutundan küçük olmasıydı. Durum böyle olunca haliyle hata alıyorum. SQL veritabanına veri kaydetmeden önce verilerimin ilgili tablonun alanlarından büyük olup olmadığını nasıl kontrol edebilirim? Kaydedeceğim veri tablodaki alanın lenght değerinden büyükse uyarı mesajıyla karşılaşılsın. Yardımcı olabilirseniz sevinirim, teşekkürler.

1 cevap

0 oy
 
En İyi Cevap

Karşılaştığınız bu hatanın önüne geçmenin aslında daha basit bir yöntemi var. İlk önce size bu yöntemden bahsedeceğim daha sonra kullanabileceğiniz bir fonksiyon yazacağım. Basit yöntem; kullandığınız TextBox'a MaxLenght belirlemek. Böylece kullanıcı belirlediğiniz maksimum boyuta kadar veri girişi yapabilir. Diğer yöntem ise Reflection kullanarak bir fonksiyon oluşturup fonksiyon aracılığı ile kontrol yapmak.

private object MyColumnLenghtControl(object pData,string pTable) {
    try {
        PropertyInfo[] properties = pData.GetType().GetProperties(); //Object içerisinde ki verileri alıyoruz
        string W_SqlText = "";
        foreach(PropertyInfo item in properties) { //object içerisinde ki veriler içinde bir foreach döngüsü kuruyoruz *sql sorgusu oluşturuluyor*
            if(W_SqlText == "") {
                W_SqlText = "SELECT COL_LENGTH('" + pTable + "','" + item.Name + "')  AS " + item.Name;
            } else {
                W_SqlText = W_SqlText + ",COL_LENGTH('" + pTable + "','" + item.Name + "')  AS " + item.Name + " ";
            }
        }
        DataTable dt = null; 
        foreach(PropertyInfo item in properties) { //Object içerisinden alınan veriler arasında yine foreach döngüsü kurulup dt adlı datatable içerisine gelen tablonun lenght değerlerinden büyük olup olmadığı kontrol ediliyor
object W_Value = item.GetValue(pData,null);
            if((item.PropertyType == typeof(string)) && (W_Value == null)) {
                W_Value = "";
            } else if(item.PropertyType == typeof(string) && dt != null) {
                int W_ColLenght = Convert.ToInt32(dt.Rows[0][item.Name].ToString());
                if(W_ColLenght != null && W_Value.ToString().Length > W_ColLenght) {
                    throw new Exception("Object içerisinde ki " + item.Name + " adlı alanının boyutu (" + W_Value.ToString().Length + "), tanımlanan maksimum boyuttan (" + W_ColLenght + ") daha büyük olduğu için işleme devam edilemiyor!");
                    return null;
                }
            }
            item.SetValue(pData,W_Value);
        }
        return pData;
    } catch(Exception ex) {
        throw new Exception(ex.Message);
    }
}

Yukarı da ki bu fonksiyonun kullanımı oldukça basittir. Fonksiyon içerisine açıklamalar da ekledim. Fonksiyonda ki pData adlı parametreye sql veritabanına kaydettiğiniz object türünde ki veriniz gelecek. pTable adlı parametreye de sql de kayıt yapmaya çalıştığınız tablonun adı gelecek. Burada dikkat etmeniz gereken bir diğer nokta ise pData adlı object nesneniz de ki verilerin kolon adları, sql de ki tablonuzun kolon adlarıyla aynı olması gerektiği. Son olarak fonksiyon içerisinde DataTable dt=null; yazan yerde dt adlı DataTable içerisine fonksiyonda W_SqlText adlı değişkende oluşan sql sorgusu aracılığı ile projenizde ki sql bağlantınızı kullanarak pTable parametresinde belirttiğiniz tablonun alanlarının lenght değerlerini çekmek. Veriyi çektiğiniz zaman dt adlı DataTable içerisinde tek satır veri yer alacaktır. Fonksiyonu kullandığınız da kaydetmeye çalıştığınız veri tabloda ki ilgili alandan daha büyükse Object içerisinde ki OGR_AD adlı alanının boyutu (70), tanımlanan maksimum boyuttan (60) daha büyük olduğu için işleme devam edilemiyor! şeklinde bir uyarı ile karşılaşacaksınız. Eğer bir sorun yoksa fonksiyon size fonksiyona verdiğiniz pData adlı objeyi geriye döndürür. Fonksiyon içerisinde string alanların null kontrolü de mevcut. Null olan bir string alan gelirse null olan değeri "" şeklinde düzeltir.

Türkiye'nin en iyi soru cevap sitesi | SorSoyleyelim.com

İlgili sorular


Web sitemiz hakkında ki reklam,istek,öneri ve şikayetlerinizi iletisim(at)sorsoyleyelim.com adresine mail atabilir veya sitemizin iletişim formu üzerinden bize yazabilirsiniz.
Sitede ki içeriklerin izinsiz kullanılması ya da kopyalanması yasaktır. Bknz: Kullanım şartları.
...