Generic IsDBNull Function

by Suat TUNCER 11. August 2009 16:42

Geçenlerde bir öğrencimden mail aldım, mailde bir konudan yakınıyordu, diyordu ki;

"Merhaba Hocam,

Küçük bir projeye başladım ve bu projede ORM araçlarını kullanmak yerine ADO.Net ile yazmak istedim fakat DataReader ile veri okurken verinin null olup olmadığını kontrol etmekten uygun tiplere dönüştürmekten sıkıldım bu işin pratik bir yolu var mıdır?"


.Net ile heleki C# ile uygulama geliştiriyorsanız, mutlaka her şeyin bir pratik yolu vardır, şöyleki;

static bir sınıf içerisine aşağıdaki gibi bir methodu ekleyin.

        public T ReadField<T>(OracleDataReader reader, string columnName) {
            object value = reader[columnName];
            Type targetType = typeof(T);
            if (Convert.IsDBNull(value)) {
                if (targetType == typeof(string))
                    return (T)Convert.ChangeType(String.Empty, typeof(string));
                return default(T);
            }
            else {
                targetType = Nullable.GetUnderlyingType(targetType);
                if (targetType == null)
                    targetType = typeof(T);
                return (T)Convert.ChangeType(value, targetType);
            }
        }



çağırırken ise, aşağıdaki gibi kullanmak yetecektir.


            OracleConnection connection = new OracleConnection("ConnectionString");
            OracleCommand command = connection.CreateCommand();
            command.CommandText = "SELECT * FROM SourceTable";
            command.Connection.Open();
            OracleDataReader reader = command.ExecuteReader();
            IList<Product> list = new List<Product>();
            Product item = null;
            while (reader.Read()) {
                item = new Products();
                item.ID = ReadField<int>(reader, "ID");
                item.Quantity = ReadField<string>(reader, "Quantity");
                item.UnitPrice = ReadField<decimal>(reader, "UnitPrice");
                item.Description = ReadField<string>(reader, "Description");
            }
            command.Connection.Close();



NOT : beklenmeyen tip dönüşümlerinde kodun çatlamasını istemiyorsanız try catch kullanabilirsiniz.

Edit : Method Nullable tiplerle de çalışacak şekilde güncellendi.

Tags: , , ,

C#

Dependency Property

by Suat TUNCER 28. March 2009 11:26

Merhabalar,

Son zamanlarda "Dependency Property" çok fazla kullanmaya başladım ve bu zamana kadar kullanmadığım için kızdım kendime. Özellikle WPF ile birlikte bir nesnenin hemen hemen bütün özellikleri "Dependency Property" olarak tanımlandığı için ve bazı özel noktalarda eventlara ihtiyaç duyduğumuzda imdadımıza yetişmektedirler. Aşağıya basit bir kod örneği ekliyeyim de tam olsun.

    private void Page_Loaded(object sender, RoutedEventArgs e)
    {
        DependencyPropertyDescriptor dc; // bizim için bağlamayı çekecek olan nesne ;-)
        dc = DependencyPropertyDescriptor.FromProperty(
            Button.IsMouseOverProperty, // durumuna bağlanmak istediğimiz özellik
            typeof(Button));            // bağlama çekilecek tip

        dc.AddValueChanged(             // nesne ve method ilişkilendiriliyor
            button1,                    // IsMouseOver özelliği kullanılacak nesne
            Button_MouseOver);          // IsMouseOver özelliği değiştiğine çalışacak method
    }


    void Button_MouseOver(object sender, EventArgs e)
    {
        /*
           method tetiklendiğinde eğer;
           IsMouseOver true ise arkaplan kırmızı yapılıyor
           IsMouseOver false ise arkaplan sarı yapılıyor.
        */

        Button senderButton = sender as Button;
        if (senderButton.IsMouseOver)
            senderButton.Background = Brushes.Red;
        else
            senderButton.Background = Brushes.Yellow;
        // böylece galatasaray selam gönderilmiş oluyor :-)
    }

istenirse foreach döngüsü kullanılarak, bir control collectionın tamamına da uygulanabilir.

i love .net

 

Tags: , ,

C#

VB.Net - C#

by Suat TUNCER 22. November 2006 11:41
Bugüne kadar rastladığım en iyi hazırlanmış ve en açıklayacıyı VB.Net ile C# arasındaki farkları gösteren tablo, yavru kurtlara duyrulur :-) VB.NET and C# Comparison

Tags:

C#

X-Y Dağılım Grafikleri (X-Y Scatter Chart)

by Suat TUNCER 15. November 2006 09:28

Merhabalar,

Uzun bir süre önce MsChart kontrolü ve grafik çizimi ile ilgili bir makalem www.yazilimuzmani.com adresinde yayinlanmıştı. Şimdi ise bir kaç gün önce aldığım bir mailde karşılaşılan bir sorundan yola çıkarak Microsoft Office Web Components ile XY Dağılım ( Scatter ) grafikleri oluşturmayı anlatacağım.

Öncelikle bu iş için sisteminizde office tools yüklü olmalı eğer yüklü değilse Microsoft Office Web Components adresinden indirebilirsiniz. Dil desteği mevcuttur. Türkçe seçilirse birlikte gelen yardım dosyasıda türkçe gelmekte ve programlama kütüphanesi hakkında kısıtlıda olsa bazı bilgiler yer almakta tercih size kalmış.

Eklentiyi indirip kurduktan sonra, şimdi yeni bir projeyle işe başlıyalım. File menüsünde New> Prject ve C# Windows Application ‘ı oluşturuyoruz. Toolbox üzerinde sağ tıklayıp Choose Items.. ‘ı tıklıyoruz.

 

Karşımıza gelen erkandan aşşağıdaki kontrolü seçip toolbox’a ekilyoruz.


 

Daha sonra Forma, bir button( button1)  ve bir ChartSpace (AxChartSpace1) kontrolü ekliyoruz. Sıra geldi kodlamaya ben örnek olarak mailime gelen verileri kullanıcam, tabi önce bunları SQL serverda bir tablo oluşturup orya attım, kullandığım örnek tablo şöyle ;

 


Burda veriler önem kazanıyor, veri kaynağı pek önemli değil çünkü verileri, dizilere aktarıp diziler yardımıyla serileri oluşturduk, yani veri kaynağı olarak SQL, OLDB, Text File bile kullanılabilir, bu arada ilk fırsatta doğrudan veri kaynağıyla iligili bir örnek hazırlıyacam, çünkü en çok sorun yaşanan noktalardan biride orası. Örneğimizde S1X ve S2X verileri ortak veriler, S1Y ve S2Y verileri ise değişken veriler, birde Kategori değerlerimiz var bunlar verileri sınıflandırma için yani dağılımı kategoriler üzerinde gerçekleştirmek için ihtiyaç duyacağımız veriler. Örnek vermek gerekirse;
Ocak - Aralık ayları (kategoriler) arasında, aynı yük yüksekliklerdeki (X değerleri)  farklı basınçlar (Y değerleri) diyebiliriz.

button1_click olayına şu kodları yazıyorum;

 

private void button1_Click(object sender, EventArgs e)
{
    //değerleri veri tabanında okuyorum
    //verilerin formatı tablodaki gibidir
    //uygun veriyle sizede yapabilirsiniz
    //veri problem olursa haber verin göndereyim :-)
    SqlConnection cn = new SqlConnection("Data Source=.;Initial " +
                    Catalog=Test;Integrated Security=SSPI;");
    SqlCommand cmd = new SqlCommand("select * from degerler", cn);
    DataTable dt = new DataTable();
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    da.Fill(dt);
    //okunan değerler diziye aktarılacak
    //öncelikle diziler tanımlanıyor
    int length;
    length = dt.Rows.Count - 1;
    object[] categories = new object[length];
    object[] series1XValues = new object[length];
    object[] series1YValues = new object[length];
    object[] series2XValues = new object[length];
    object[] series2YValues = new object[length];
    //referances tipde bir datarow değişken ile
    //datatabledeki tüm satırları gezip diziye aktarıyorum
    DataRow r;
    for (int i = 0; i < dt.Rows.Count - 1; i++)
    {
        r = dt.Rows[i];
        categories[i] = r["CATID"];
        series1XValues[i] = r["S1X"];
        series1YValues[i] = r["S1Y"];
        series2XValues[i] = r["S2X"];
        series2YValues[i] = r["S2Y"];
    }
    /*şimdi garfiği çizdirmek için gereken kodlar*/

    //bunlar kodda kolaylık olsun diye tanımlıyorum
    //direkde kullanılabilir
    OWC10.ChChart MyChart;
    OWC10.ChSeries Series1;
    OWC10.ChSeries Series2;

    //grafik alanına yeni bir grafik nesnesi ekleniyor
    MyChart = axChartSpace1.Charts.Add(0);
    //grafik tipi X-Y dağılım (Scatter ) olarak ayarlıyorum
    MyChart.Type = OWC10.ChartChartTypeEnum.chChartTypeScatterSmoothLine;

    /* dizilere aktarılan verileri serilere aktarıyorum
     * dizilerin tanımladığım isimlerdenden anlaşılacağı gibi
     * her seride 1 X ve Y değeri olmak zorunda categori değeri ise
     * tüms eriler için ortak kullanılıyor
     * ve dağılımı gerçekleştirmek için mutlaka gerekli*/

 
    //grafik nesnesine yeni bir seri ekliyorum
    Series1 = MyChart.SeriesCollection.Add(0);
    //seriye değerlerini aktarıyorum SetData methodundaki
    //dimension parametresi verilerin türüü belirliyor burası dikkali kullanılmalı
    Series1.SetData(OWC10.ChartDimensionsEnum.chDimCategories, -1, categories);
    Series1.SetData(OWC10.ChartDimensionsEnum.chDimXValues, -1, series1XValues);
    Series1.SetData(OWC10.ChartDimensionsEnum.chDimYValues, -1, series1YValues);
 
    // ve şimdi 2. seride aynı şekilde oluşturuluyor
    //daha çoks eride eklenebilir bendeki veriler şimdilik bu kadar :-)
    Series2 = MyChart.SeriesCollection.Add(1);
    Series2.SetData(OWC10.ChartDimensionsEnum.chDimCategories, -1, categories);
    Series2.SetData(OWC10.ChartDimensionsEnum.chDimXValues, -1, series2XValues);
    Series2.SetData(OWC10.ChartDimensionsEnum.chDimYValues, -1, series2YValues);
    //ve perde 
}


Sonuç itibariyle garfiğimizin son hali budur, veriler ve fikir için Özer Kaymak'a teşekkürler.

Tags: ,

C#

X-Y Dağılım Grafikleri (X-Y Scatter Chart)

by Suat TUNCER 15. November 2006 09:28

Merhabalar,

Uzun bir süre önce MsChart kontrolü ve grafik çizimi ile ilgili bir makalem www.yazilimuzmani.com adresinde yayinlanmıştı. Şimdi ise bir kaç gün önce aldığım bir mailde karşılaşılan bir sorundan yola çıkarak Microsoft Office Web Components ile XY Dağılım ( Scatter ) grafikleri oluşturmayı anlatacağım.

Öncelikle bu iş için sisteminizde office tools yüklü olmalı eğer yüklü değilse Microsoft Office Web Components adresinden indirebilirsiniz. Dil desteği mevcuttur. Türkçe seçilirse birlikte gelen yardım dosyasıda türkçe gelmekte ve programlama kütüphanesi hakkında kısıtlıda olsa bazı bilgiler yer almakta tercih size kalmış.

Eklentiyi indirip kurduktan sonra, şimdi yeni bir projeyle işe başlıyalım. File menüsünde New> Prject ve C# Windows Application ‘ı oluşturuyoruz. Toolbox üzerinde sağ tıklayıp Choose Items.. ‘ı tıklıyoruz.

 

Karşımıza gelen erkandan aşşağıdaki kontrolü seçip toolbox’a ekilyoruz.


 

Daha sonra Forma, bir button( button1)  ve bir ChartSpace (AxChartSpace1) kontrolü ekliyoruz. Sıra geldi kodlamaya ben örnek olarak mailime gelen verileri kullanıcam, tabi önce bunları SQL serverda bir tablo oluşturup orya attım, kullandığım örnek tablo şöyle ;

 


Burda veriler önem kazanıyor, veri kaynağı pek önemli değil çünkü verileri, dizilere aktarıp diziler yardımıyla serileri oluşturduk, yani veri kaynağı olarak SQL, OLDB, Text File bile kullanılabilir, bu arada ilk fırsatta doğrudan veri kaynağıyla iligili bir örnek hazırlıyacam, çünkü en çok sorun yaşanan noktalardan biride orası. Örneğimizde S1X ve S2X verileri ortak veriler, S1Y ve S2Y verileri ise değişken veriler, birde Kategori değerlerimiz var bunlar verileri sınıflandırma için yani dağılımı kategoriler üzerinde gerçekleştirmek için ihtiyaç duyacağımız veriler. Örnek vermek gerekirse;
Ocak - Aralık ayları (kategoriler) arasında, aynı yük yüksekliklerdeki (X değerleri)  farklı basınçlar (Y değerleri) diyebiliriz.

button1_click olayına şu kodları yazıyorum;

 

private void button1_Click(object sender, EventArgs e)
{
    //değerleri veri tabanında okuyorum
    //verilerin formatı tablodaki gibidir
    //uygun veriyle sizede yapabilirsiniz
    //veri problem olursa haber verin göndereyim :-)
    SqlConnection cn = new SqlConnection("Data Source=.;Initial " +
                    Catalog=Test;Integrated Security=SSPI;");
    SqlCommand cmd = new SqlCommand("select * from degerler", cn);
    DataTable dt = new DataTable();
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    da.Fill(dt);
    //okunan değerler diziye aktarılacak
    //öncelikle diziler tanımlanıyor
    int length;
    length = dt.Rows.Count - 1;
    object[] categories = new object[length];
    object[] series1XValues = new object[length];
    object[] series1YValues = new object[length];
    object[] series2XValues = new object[length];
    object[] series2YValues = new object[length];
    //referances tipde bir datarow değişken ile
    //datatabledeki tüm satırları gezip diziye aktarıyorum
    DataRow r;
    for (int i = 0; i < dt.Rows.Count - 1; i++)
    {
        r = dt.Rows[i];
        categories[i] = r["CATID"];
        series1XValues[i] = r["S1X"];
        series1YValues[i] = r["S1Y"];
        series2XValues[i] = r["S2X"];
        series2YValues[i] = r["S2Y"];
    }
    /*şimdi garfiği çizdirmek için gereken kodlar*/

    //bunlar kodda kolaylık olsun diye tanımlıyorum
    //direkde kullanılabilir
    OWC10.ChChart MyChart;
    OWC10.ChSeries Series1;
    OWC10.ChSeries Series2;

    //grafik alanına yeni bir grafik nesnesi ekleniyor
    MyChart = axChartSpace1.Charts.Add(0);
    //grafik tipi X-Y dağılım (Scatter ) olarak ayarlıyorum
    MyChart.Type = OWC10.ChartChartTypeEnum.chChartTypeScatterSmoothLine;

    /* dizilere aktarılan verileri serilere aktarıyorum
     * dizilerin tanımladığım isimlerdenden anlaşılacağı gibi
     * her seride 1 X ve Y değeri olmak zorunda categori değeri ise
     * tüms eriler için ortak kullanılıyor
     * ve dağılımı gerçekleştirmek için mutlaka gerekli*/

 
    //grafik nesnesine yeni bir seri ekliyorum
    Series1 = MyChart.SeriesCollection.Add(0);
    //seriye değerlerini aktarıyorum SetData methodundaki
    //dimension parametresi verilerin türüü belirliyor burası dikkali kullanılmalı
    Series1.SetData(OWC10.ChartDimensionsEnum.chDimCategories, -1, categories);
    Series1.SetData(OWC10.ChartDimensionsEnum.chDimXValues, -1, series1XValues);
    Series1.SetData(OWC10.ChartDimensionsEnum.chDimYValues, -1, series1YValues);
 
    // ve şimdi 2. seride aynı şekilde oluşturuluyor
    //daha çoks eride eklenebilir bendeki veriler şimdilik bu kadar :-)
    Series2 = MyChart.SeriesCollection.Add(1);
    Series2.SetData(OWC10.ChartDimensionsEnum.chDimCategories, -1, categories);
    Series2.SetData(OWC10.ChartDimensionsEnum.chDimXValues, -1, series2XValues);
    Series2.SetData(OWC10.ChartDimensionsEnum.chDimYValues, -1, series2YValues);
    //ve perde 
}


Sonuç itibariyle garfiğimizin son hali budur, veriler ve fikir için Özer Kaymak'a teşekkürler.

Tags: ,

C#

C# - IsNumeric

by Suat TUNCER 14. November 2006 20:25
Merhaba,
VB'de çok sık kullanılan IsNumeric fonksiyonunu C#'a geçen bir çok kişi ah ahh canım Visual Basic'iğim diye yadetmektedir. İşin aslı C#'da IsNumeric fonksiyonu yerine IsNumber fonksiyonu mevcuttur fakat sadece char tipinde çalışmaktadır. Haliyle char tipinde çalıştığı için string (string aslında char dizisi olduğunda dolayı) tipinde de çalıştırabiliriz, nasıl mı? şöyle ;

        public static bool IsNumeric(string value){
            foreach (char c in value)
                if (!((Int16)c > 47 && (Int16)c < 58)) return false;
            return true;
        }



string alır bool döner, object almaya pekde gerek yok kanımca ama ondalık sayılar içinde bi kontrol gerekiyor.

Tags:

C#

DataTable Üzerinde Distinct ve GroupBy

by Suat TUNCER 31. October 2006 19:16
        Merhaba, T-SQL'de yer alan Distinct fonksiyonu ve Group By clause'unu birçok defa kullanmışızdır, ne iş yaptıklarıda malum yinede şurdan buradan bakılabilir,
        Dönelim konumuza sorun şuki DataTable'e çekilen veriler üzerinde bu fonksiyonları uygulamak hazır fonksiyonlarlar mümkündeğil ve .Net Framework ne yazıkki bu konuda hazır bir fonksiyon içermediği için iş başa düştü, kendi faonksiyonumu hazdım buraya ekliyorum, kullanabilirsiniz

 

        Şimdi bu fonksiyon ne iş yapar; Diyelimki veritabanından verilerimizi çekmişiz ama öyle bir select sorgusuyla değil, iç içe sorgular, fonksiyonlar, hesaplamalarla çekmişiz. Bu titiz çalışmanın sonucu elimizde sadece bir tablo var fekat biz bu tablo üzerinde bir daha çalışmak istiyoruz. Örneğin verileri bir daha gruplamak istiyoruz fakat bunu T-SQL ile yapamıyoruz çünkü yazdığımız sorgu buna izin vermiyor. Çok abartı bir örnek oldu değilmi, yok yok hiçte öyle olmadı,değil çünkü, aynı böyle bir durumla karşılaştım bugün ve oturdum böyle bir fonksiyon yazdım.

public class SharpSql
{
    public SharpSql(){}

    public DataTable Distinct(DataTable dataSource,
                                 string distinctColumn)
    {
        DataTable returnTable=new DataTable("distinctTable");
        /*
         * kaynak tablodaki sütunları
         * geri dönecek tabloya kopyalıyorum
         * böylece direkt satır eklenirken
         * sütunların birebir eşleşmesini sağlıyorum
         */
        foreach(DataColumn c in dataSource.Columns)
        {
            returnTable.Columns.Add(c.ColumnName,c.DataType);
        }
        bool hasRow=false;
        foreach(DataRow selectedRow in dataSource.Rows)
        {
            /*
             * kaynak tabloda herbir satırı seçip
             * sonuçların bulunduğu tabloda benzerinin
             * olup olmadığına bakıyorum
             */
            foreach(DataRow r in returnTable.Rows)
            {
                /*
                 * eşleşen sonuçlar bulunursa,
                 * satırın var olduğu anlamında
                 * hasRow=true yapıyorum
                 */
                if(r[distinctColumn].ToString() ==
                    selectedRow[distinctColumn].ToString())
                {
                    hasRow=true;
                    break;
                }
            }
            /*
             * Seçili satır bulunmamışsa hasRow değeri
             * varsayılan olarak false olacağı için,
             * satır ekleniyor
             */
            if(hasRow==false)
                returnTable.Rows.Add(selectedRow.ItemArray);
            hasRow=false;
        }
        return returnTable;
    }
    /*
     * her bir sütunun kendi toplamına ihtiyacım vardı
     * ve normal DataColumn'da böyle bir değer yoktu
     * bir class oluşturup inherit ettikten sonra
     * Toplam property'sini ekledim
     */
    public class GroupColumn:System.Data.DataColumn 
    {
        private double dblToplam;
        public GroupColumn(string columnName)
        { this.ColumnName=columnName; }

        public double Toplam
        {
            get{return dblToplam;}
            set{dblToplam=value;}
        } 
    }
    /*
     * ve yine tip dönüşümlerinde normal DataColumnCollection,
     * inherits edilmiş GroupColumn classında
     * tip dönüşüm hatası verdiğinden bunun yerine
     * kendi GroupColumnCollections'ımı yazdım 
     */
 
    public class GroupColumnCollection:CollectionBase 
    {
        public GroupColumnCollection(){}
        public void Add(GroupColumn obj)
        { this.InnerList.Add(obj);} 
    }

    public DataTable GroupBy(DataTable dataSource,
                     GroupColumnCollection columns,
                                 string groupByColumn)
    {
        /*
         * Gruplanırken, unique kolonlara göre
         * istenilen toplamlar alınıyor
         * Unique(benzersiz) sütunlar yazdığım
         * Distinct fonksiyonu ile eldeediliyor
         */
        DataTable tableDistinct;
        tableDistinct=this.Distinct(dataSource,groupByColumn);
        /*
         * dataview kullanılıyorki her bir 
         * groubBy kolonuna göre 
         * ayrı ayrı sonuçlar alınsın diye
         */
        DataView viewResult=new DataView();
        viewResult.Table=dataSource;
        DataTable returnTable=new DataTable("groupTable");
        DataRow returnRow;
        //Sütünlar ekleniyor
        foreach(GroupColumn c in columns)
        {
            returnTable.Columns.Add(c.ColumnName,c.DataType);
        }
        //Adet sütünü ekleniyor
        returnTable.Columns.Add("Adet");
        //Gruplamada kullanılan sütunu ekliyorum
        returnTable.Columns.Add(groupByColumn);
        //Toplamları hesaplayp ekliyorum
        foreach(DataRow r in tableDistinct.Rows)
        {
            viewResult.RowFilter =groupByColumn + " = '" 
                        + r[groupByColumn].ToString() + "'";
            //Yeni bir satır oluşturuyorum
            returnRow = returnTable.NewRow();
            /*
             * dataviewe rowfilter uygulandıktan sonra 
             * kalan satırlar geziliyor ve 
             * toplamları hesaplayıp
             * değerleri yeni satıra atıyorum
             */
            for(int  i=0;

                        i<=viewResult.Count;

                        i++)
            {
                foreach(GroupColumn c in columns)
                {
                    c.Toplam += Convert.ToDouble(viewResult[i][c.ColumnName]);
                    returnRow[c.ColumnName]=c.Toplam;
                }
            }
            //Grup adı ve adetini ekliyorum
            returnRow[groupByColumn]=r[groupByColumn].ToString();
            returnRow["Adet"]=viewResult.Count;
            //Son olarak satırı tabloya ekliyorum
            returnTable.Rows.Add(returnRow);
        }
        return returnTable;
    }
}


        Bu kadar yazdıktan sonra hadi ne haliniz varsa görün demiycem elbette, şimdi bunu örnek bir uygulamada kullanarak ne işe yaradığını tam olarak anlatayım, Yeni bir WindowsApplication projesi açıp, yukardaki Classımızı orya ekliyelim, ardında forma 2 DataGrid 3 adette button ekleyip aşşağıdaki kodları yazıyoruz,


 

/

/yukardaki classtan bir instance oluşturuyorum
SharpSql csSql=new SharpSql();

//verileri getir butonu
private void button1_Click(object sender, System.EventArgs e)
{
    SqlConnection cn=new SqlConnection(
                "Data Source=.;
                 Initial Catalog=Northwind;
                 Integrated Security=SSPI;"
);
    SqlCommand cmd=new SqlCommand("select * from [Order Details]",cn);
    SqlDataAdapter da=new SqlDataAdapter(cmd);
    DataSet ds=new DataSet();
    da.Fill(ds,"siparisDetay");
    dataGrid1.DataSource=ds.Tables[0];
}

//Distinct butonu

private void button2_Click(object sender, System.EventArgs e)
{
    /*
     * tekrar eden kayıtlar eleniyor

     * ve sonuç bir DataTable olarak döndüğü için
     * DataSet'e ekliyorum
     */
    string distinctColumn;
    distinctColumn=((DataTable)dataGrid1.DataSource).Columns[dataGrid1.CurrentCell.ColumnNumber].ColumnName ;
    dataGrid2.DataSource=csSql.Distinct((DataTable)dataGrid1.DataSource ,distinctColumn);
}

//Group By butonu

private
void button3_Click(object sender, System.EventArgs e)
{
    /* 
     * Gruplandırmada kullanılacak sütun ve 
     * toplamların alınacağı sütunları ekliyorum
     * sonuç yine datatable olarak döndüğünden
     * onuda dataset'e ekliyorum
     */
    SharpSql.GroupColumnCollection col=new SharpSql.GroupColumnCollection();
    SharpSql.GroupColumn obj;
    obj=new SharpSql.GroupColumn("UnitPrice");
    col.Add(obj);
    obj=new SharpSql.GroupColumn("Quantity");
    col.Add(obj);                
    string groupColumn;
    groupColumn=((DataTable)dataGrid1.DataSource).Columns[dataGrid1.CurrentCell.ColumnNumber].ColumnName;
    dataGrid2.DataSource=csSql.GroupBy((DataTable)dataGrid1.DataSource,col,groupColumn);
}


        Programı çalıştırdığımızda öncelikle Verileri Getir butonunu tıklıyoruz gelen veriler sadece select sorgumusun sonuçları, ProductID sütununa göre sıralayınca anlaşılacaktır zaten, ProductID stünunu seçip Distinct butonuna tıklayınca sonuçlar dataGrid2'de görünecektir tekrar edilen satırlar elendi


    Group By butonuna tıladığımızda ise bu defata, kodlarımızda belirttiğimiz Quantity ve UnitPrice sütunlarındaki değerlerin ProductID'ye göre toplamları görünecektir




       Benimde en çok ihtiyaç duyduğum kısım GroupBy kısmıydı ve bu işimi oldukça gördü umarım sizlerinde işine yarar (biraz uzun oldu sanki Foot in mouth )

 

 

 

Tags: , , ,

C# | Database