SQLServer’da “aritmetic overflow” hatası


SQLServer’da decimal sayı tanımlamalarında zaman zaman bu hatayla karşılaşılır. Rahat olun suçlu microsofttur. DECIMAL(10,2) demek virgülden ÖNCE 10-2=8 hane demek oluyor. Yani cins adamlar onlarca yazılım dilinde bu iş için daha kolay tanım varken neden yazılımcıya eziyet edersin:)

Şimdi aşağıdaki koda bakalım:

declare @t table (long decimal(10,6))

insert into @t VALUES (1000.0),(999.99),(11111.99)

SQL Server burada 11111.99 değerine kadar her şeyi düzgün insert ederken yukarıda tablo kolonu t değerini etmez çünkü virgülden önce 4’ten fazla hane var. Bu kodda decimal(10,6) kısmını long decimal(11,6) olarak değiştirirseniz kodunuz çalışacaktır.

Tecrübe 3: DECLARE kısımlarında tanımladığınız tiplere dikkat.

Reklamlar

Int, Float, Double, Decimal… Yazılım’a giriş dersi neden önemlidir.


Yazılım’a giriş derslerinde her nedese ‘String’den önce hep sayısal değerler öğretilir. Hep de hızla geçilir. Integer akılda kalır, float ve decimal farkı hatırlanmaz. Ama gün gelir, parayla pulla ilgili bir uygulamayı yazar/geliştirsiniz işte orada küsüratlar kuruşlar değerli hale geldiğinde ilk derslerde duyduğunuz/okuduğunz şeyler durumu değiştirir.

Hikaye şuradan başlıyor: Daha önce C#‘da hazırlanmış ve parasal işlemlerle ilgili epey kompleks süreçler yürüten kodların veritabanıyla çok ilişkisi olması gerekçesiyle SQL Stored Procedure ile yeniden yazılmıştı.Yazılan bu kodlarda daha önce C#’da float olak tanımlanmış parasal değerler SQLServer’daki Stored Procedure’ler içinde yeni kodlarımızda Decimal(18,6) şeklinde tanımlanmıştı.

Günün birinde, Decimal(18,6)’nın float olmadığını gördük:) Saçma gelebilir ancak kodlarımızda C# tarafında diyelim ki 5.20 gelen (tabii ki 5.19 da gelecek) float değerlerin SQL Stored Procedure tarafında 5.2 olarak hesaplandığını gördük. Sonra da çözümü bulduk.

Biraz da modifiye ederek şu iki satırla öğrendik:


declare @x as float(24);

set @x = 7376.628 - 199.01 - 46.63
--set @x = @x - 199.01 - 46.63

select convert(decimal(10,6),@x)


Yukarıdaki kodları siz de deneyebilirsiniz. float değerinden 24 parametresini kaldırdığınızda ‘küsüratların intikamını’ görebilirsiniz.

Tecrübe: Sayısal değer tiplerini adam yerine koyun:)

Tecrübe 2: SQLServer’da da float var:) Hatta money tipi var.

Fixing Error of Metronic Theme PagedList component


Metronic Theme have PagedList component which provide users prepare paged list quickly. However, it have a issue: When user clicks the number of active page link number page thwors error. Because link of active page misdefined. To fix this I’ve prepared a jquery patch.


$(document).ready(function () {

    //fixing pagedlist bug-patch s.atan

    $(".pagination > .active > a").mouseover(function () {

        var href = $(this).attr("href");

        console.log(href);

        $(this).attr('href', 'javascript:');

        $(this).attr('style', 'color:green; font-weight:bold');

    });

});

ASP.MVC Yüklenmiş Bir Dosyayı Silmek


public ActionResult TutanakSil(int id)

    {
        var sonuc = "Tutanak Silme Hatası 1";
        try
        {

            Tutanak tut = db.Tutanak.SingleOrDefault(m => m.ID == id);

            //remove from file system- mappath'a dikkat 
            var fullPath = Request.MapPath("~/Dosyalar/"+tut.FileName);
            if (System.IO.File.Exists(fullPath)) { 
                System.IO.File.Delete(fullPath);
                Debug.WriteLine(fullPath + "-Tutanak dosya sisteminden silindi");
            }
            else { 
                Debug.WriteLine(fullPath + "-Tutanak dosyası dosya sisteminden silinemedi");
            }
            //veritabanından silme
            db.Tutanak.Remove(tut);
            db.SaveChanges();

            sonuc = "Tutanak Silindi";
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);
            sonuc = "Tutanak silinemdi";
        }

        return Content(sonuc);
    }

WordPress.com'da ücretsiz bir web sitesi ya da blog oluşturun.

Yukarı ↑