DB Helper

Klasik Ado.Net kullanımını daha basit bir hale getiren metotları (transaction destekli) barındıran kütüphane projesi.

  • ExecuteScalar
  • ExecuteNonQuery
  • ExecuteReader
  • FillTable

Örnek kullanım;

Github bağlantısı.

For Json

For Json, Sql Server 2016 yeniliklerinden belkide en önemlisi.

Bu versiyonu kullandığımız da sorgu sonuçlarını direk Json biçiminde ala bilmekteyiz. Teknik olarak for xml ile aynı işlevsellikte verileri dışa aktarabiliriz.
Günümüz modern web ve mobil uygulamaların sıkça tercih ettiği bir veri biçimi olduğundan Sql Server 2016 il yerleşik olmasa da baya bir destek geldiğini söyleyebiliriz.

MSSQL için Xml aynı zamanda bir veri tipi iken Json değildir. Buna karşın Json verilerini nvarchar olarak saklayıp özel fonksiyonlar ile sorgulayabilirsiniz.

Basit bir örnek yapalım.
t­sql

json result

Şimdi örneği biraz ileri götürelim.
İstemci uygulamasının web olduğunu ve Js tabanlı bir DataGrid kullandığımızı varsayalım.
Örneğin Bootgrid. Bootgrid, verileri listelemek ve sayfalamak için bizden aşağıdaki gibi biçimde Json verisi ister.

Şimdi ihtiyacımız olan verileri Json olarak dışarı aktaran t-­sql kodunu yazalım.

Son olarak klasik Ado.Net ile verileri alalım.

Elbette ki de sadece bu kadar değil. DB seviyesinde bir kaç numara daha yapmanızı sağlayacak hareketler mevcut. Neler mi?

OPENJSON

Bu fonksiyon, nvarchar biçimde ki json verisini tablo verisine çevirmeye yarıyor.

Normal şartlarda “for json” komutu uyumluluk seviyesi 2014 de de çalışsa bile bu tip fonksiyonlarda ise mutlaka 2016 olması gerekiyor.

t­-sql

sonuç

Product Table

OPEN_VALUE

Json biçiminde saklı veri üzerine işlem yapmanıza olanak verir. Aşağıdaki gibi bir ürün tablosu tasarlayalım.

Product Table / Design

PropersitesÖzellikler tahmin edeceğiniz gibi Json biçiminde veri saklayacak. Amacımız, tüm ürünlerin özellik tanımları eşit olmayacağından dolayı şema bağımsız bir yapı elde etmek.
Örnek veri ekleyelim.

Select atalım ama detaylı olsun 🙂

For Json

JSON_MODIFY

Json formatında saklı verileri güncellemek için kullanılır. Bir önceki örnekten devam edelim.

Benim gibi veritabanı seviyesinde çok iş yapmayı sevmiyorsanız pek kullanacağını sanmam. Lakin bilmekte fayda var yoksa problemleri nasıl çözeceğiz 🙂

Bootsrap Panel Helper

Kullanım şekli;

@using (Html.Panel("Genel", type: PanelType.success))
{
    @Html.Editor(model => Model.Error)
    @Html.Editor(model => Model.SaltKey)
}

Panel in tipleri için enum;

public enum PanelType
{
    @default,
    success,
    info,
    danger
}

Panel i containerkap gibi kullanabilmek için ViewContext ve kapanış etiketleritag için de IDisposable dan faydalanıyoruz.

public class PanelFieldSet : IDisposable
{
    bool _disposed;
    readonly ViewContext _viewContext;
    readonly TextWriter _writer;

    public PanelFieldSet(ViewContext viewContext)
    {
        if (viewContext == null)
            throw new ArgumentNullException("viewContext");
        _viewContext = viewContext;
        _writer = viewContext.Writer;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            _disposed = true;
            _writer.Write("\t\t</div>\r\n\t</div>\r\n");
        }
    }

    public void EndDiv()
    {
        Dispose(true);
    }
}

Son olarak Html Helper a yatalık yapacak ControlHelper sınıfıclass;

public static class ControlHelper
{
    public static PanelFieldSet Panel(this HtmlHelper htmlHelper, string title, PanelType type = PanelType.@default, bool display = true, int bodyHeight = 0)
    {
        StringBuilder sb = new StringBuilder();
        sb.AppendFormat("<div class=\"panel panel-{0}\" class='{1}'>", Enum.GetName(typeof(PanelType), type), display ? "show" : "hide");
        sb.AppendFormat("<div class=\"panel-heading\">{0}</div>", title);
        sb.AppendFormat("<div class=\"panel-body\" {0}>", bodyHeight == 0 ? "" : string.Format("style='height:{0}px'", bodyHeight));
        htmlHelper.ViewContext.Writer.WriteLine(sb.ToString());
        return new PanelFieldSet(htmlHelper.ViewContext);
    }
}

Jpg Uzantılı Dosyalardan Bilgi Okuma

Jpg Uzantılı Dosyalardan Bilgi Okumak mı? Geçen güne kadar böyle bir arayışım olamıştı. Yakın bir arkadaşımın benden rica etmesi bir göz atayım dedim.

Biraz Detay

Dijital fotoğraf makineleri ve cep telefonları ile fotoğraf çekildiğinde yada fotoğraf düzenleme uygulamaları ile oluşan jpg dosyalarının içine farklı biçimlerde (IPTC,XMP,EXIF gibi) bir takım bilgilerMetaData de eklenir.

Yeni bir Wpf uygulaması oluşturduğunuz taktirde oldukça basit bir şekilde bu bilgiler okunabilmektedir. Bunun için PresentationCore.dll kütüphanesini ve bu kütüphane içindeki  BitmapMetadata sınıfıClass kullanmalısınız.

İlgili namespace -> System.Windows.Media.Imaging

Birkaç farklı yöntem ile dosya içinden bu bilgiler alınabilir.

Yöntemler

İlk yöntem, BitmapMetadata sınıfının özellikProperty lerini kullanmak;

Diğer bir yöntem, Windows işletim sistemlerinde bulunan hazır özellikleri GetQuery metodu ile almak;

meta.GetQuery("System.Photo.Brightness").ToString();

Son yöntem ise direk olarak XPath sorguları yazarak bu bilgileri okumak;

meta.GetQuery("/Text/Description").ToString();

MetaReader

Kaynaklar;
http://msdn.microsoft.com/en-us/library/windows/desktop/ff521709(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/ms619225
http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.bitmapmetadata.getquery

ReCaptcha Kullanımı

Bir Google servisi olan ReCaptcha. Bu yazıda lafı çok dolandırmadan hızlı bir şekilde Asp.Net Mvc uygulaması içinde Server SideSunucu Taraflı ReCaptcha kullanımını anlatacağım.

Edinme

Önce şu adresten kayıt olmalısınız. Bunun için uygulama geliştireceğiniz domain adını kaydetmeniz gerekmektedir. Test için mutlaka localhost u da eklemeyi unutmayın. İşlem sonundan iki adet Api Key oluşacak. Bir yere not edin 🙂

Daha sonra bu adresten .Net Library dosyasını indirin ve projenize referans olarak ekleyin.

Güncel JQuery dosyasını ilgili sayfalara referans vermeyi unutmayın.

Uygulama

ContactViewModel adında bir adet sınıfclass oluşturalım. Form içindeki verilerin Contoller de ki ilgili metoda post edilmesini bu sınıf yardımı ile yapacağız. Attribute ler yardımı ile de doğrulama işlemlerini de yaptırmış olacağız.

Yukarıda oluşturduğumuz sınıfı model olarak kullanabilecek bir Form oluşturacağız. Öncelikle API için gerekli anahtarları eşitleyelim.

Controller

Asenkron form işlemleri hakkında daha detaylı bilgi almak için şu yazıya göz atabilirsiniz.