none
Veri erişim katmanı oluşturma ?

    Soru

  • Arkadaşlar benim sağlam bir veri erişim katmanı oluşturmam lazım. Bu katmanı Sql'e veri ekleme, Sql'den Veri silme, Sql Update, Sql Drop işlemi ve DataGrid doldurma işlemleri yapmak istiyorum. Bana böyle bir veri ereişim katmanı konusunda yardım edebilir misiniz ? Özellikle istediğim Sql'e veri ekleme Method'u. Bu işlem şöyle olacak. Ben eklenecek verileri, Eklenecek Bağlantıyı ve Tablo adını parametre adı olarak vereceğim. O ne kadar veri eklemek istiyorsam hepsini ekleyecek. Yani aydı sınıfı bazen 10 bazen 30 veri girerken kullanabilmeliyim. Ben kendim aşağıdaki gibi bir method yazdım ama veriyi iki kere kaydediyor. Sizden ricam bu aşağıda yazdığım methodu'un hatasını düzeltmeniz ve bu methodu daha güvenli hale getirebilmeniz veya daha kullanışlı hale getirebilmeniz. Method aşağıda ;

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data.SqlClient;
    using System.Threading.Tasks;
    
    namespace SqlOperation
    {
        public class Class
        {
            SqlConnection Connection = new SqlConnection();
            SqlCommand Command = new SqlCommand();
    
            public int VeriSayısı;
            public string ParametreCümlesi;
    
            public string SqlInsertInto(string ConnectionString, string TableName, ArrayList IntoData)
            {
                try
                {
                    VeriSayısı = IntoData.Count;
                    Connection.ConnectionString = ConnectionString;
                    Command.Connection = Connection;
                    for (int i = 0; i < VeriSayısı; i++)
                    {
                        if (i == 0)
                        {
                            Command.Parameters.AddWithValue("@Data" + i.ToString(), IntoData[i]);
                            ParametreCümlesi = "@Data" + i.ToString() + ",";
                        }
                        else if (i != 0 && i < VeriSayısı - 1)
                        {
                            Command.Parameters.AddWithValue("@Data" + i.ToString(), IntoData[i]);
                            ParametreCümlesi = ParametreCümlesi.ToString() + "@Data" + i.ToString() + ",";
                        }
                        else if (i == VeriSayısı - 1)
                        {
                            Command.Parameters.AddWithValue("@Data" + i.ToString(), IntoData[i]);
                            ParametreCümlesi = ParametreCümlesi.ToString() + "@Data" + i.ToString();
                        }
                    }
                    Command.CommandText = "INSERT INTO " + TableName.ToString() + " VALUES (" + ParametreCümlesi.ToString() + ")";
                    Connection.Open();
                    Command.ExecuteNonQuery();
                    if (Command.ExecuteNonQuery() > 0)
                        return ("Kayıt başarı ile eklendi !...");
                    else
                        return ("Kayıt ekleme sırasında bir hata oluştu !...");
                }
                catch (Exception Error)
                {
                    return(Error.Message.ToString());
                }
                finally
                {
                    VeriSayısı = 0;
                    ParametreCümlesi = null;
                    Command.Parameters.Clear();
                    Command.Dispose();
                    Connection.Close();
                }
            }
    
            public string SqlDelete(string ConnectionString, string TableName, string WhereColumn, string Where)
            {
                try
                {
                    Connection.ConnectionString = ConnectionString;
                    Command.Connection = Connection;
                    Command.CommandText = "DELETE FROM " + TableName.ToString() + " WHERE " + WhereColumn.ToString() + "=" + Where.ToString();
                    Connection.Open();
                    Command.ExecuteNonQuery();
                    if (Command.ExecuteNonQuery() > 0)
                        return ("Kayıt başarı ile silindi !...");
                    else
                        return ("Kayıt silme sırasında bir hata oluştu !...");
                }
                catch (Exception Error)
                {
                    return (Error.Message.ToString());
                }
                finally
                {
                    Command.CommandText = "";
                    Command.Dispose();
                    Connection.ConnectionString = "";
                    Connection.Close();
                }
            }
    
            public string SqlDrop(string ConnectionString, string Drop, string DropItem)
            {
                try
                {
                    Connection.ConnectionString = ConnectionString;
                    Command.Connection = Connection;
                    Command.CommandText = "DROP " + Drop.ToString() + " " + DropItem.ToString();
                    Connection.Open();
                    Command.ExecuteNonQuery();
                    if (Command.ExecuteNonQuery() > 0)
                        return ("Nesne başarı ile silindi !...");
                    else
                        return ("Nesne silme sırasında bir hata oluştu !...");
                }
                catch (Exception Error)
                {
                    return (Error.Message.ToString());
                }
                finally
                {
                    Command.CommandText = "";
                    Command.Dispose();
                    Connection.ConnectionString = "";
                    Connection.Close();
                }
            }
        }
    }

    Yardımlarınızı bekliyorum.
    11 Haziran 2012 Pazartesi 21:01

Yanıtlar

  • Selamlar, Daha önce arkadaşlar (Anatolium ve Çetin Bey) size zaten var olan ORM ve DAL yapılarını kullanma hakkında tavsiyede bulundu, ancak sanırım siz kendiniz yazmak istiyorsunuz. Bende bunların üzerine tekrar tekrar Dataset yada EF ve Linq kullanın demeyeceğim artık.

    Yukarıdaki classınız static olmadığından her işlemde bu classtan bir tane üretmeniz gerekecek, bunun için size pek optimal gelmiyor. Classınızı static yaparsanız tek instance'ı programın herhangi bir yerinde defalarca kullanabilirsiniz. Örneğin;

    DataHelper.cs

    public static class DataHelper
    {
      //DataTable döndüren method
      public static DataTable GetData(string CommandText)
      {
        SqlDataAdapter _da = new SqlDataAdapter(new SqlCommand(CommandText, new SqlConnection(Properties.Settings.Default.ConnectionString)));
        DataTable _dt = new DataTable();
        _da.Fill(_dt);
        return _dt;
      }
      //Yukarıdaki methodun Parameters li overloadı
      public static DataTable GetData(string CommandText, SqlParameterCollection Parameters)
      {
        SqlDataAdapter _da = new SqlDataAdapter(new SqlCommand(CommandText, new SqlConnection(Properties.Settings.Default.ConnectionString)));
        _da.Command.Parameters = Parameters;
        DataTable _dt = new DataTable();
        _da.Fill(_dt);
        return _dt;
      }
    
      //Nonquery çalıştıran method
      public static void NonQuery(string CommandText)
      {
        (new SqlCommand(CommandText, Properties.Settings.Default.ConnectionString)).ExecuteNonQuery();
      }
      //Parameterli overload
      public static void NonQuery(string CommandText, SqlParameterCollection Parameters)
      {
        SqlCommand _cmd = new SqlCommand(CommandText, Properties.Settings.Default.ConnectionString);
        _cmd.Parameters = Parameters;
        _cmd.ExecuteNonQuery();
      }
    
      //Buda Scalar sorgularınız için;
      public static object Scalar(string CommandText)
      {
        return (new SqlCommand(CommandText, Properties.Settings.Default.ConnectionString)).ExecuteScalar();
      }
    
      }
    }
    
    

    Not: Her defasında methodlarınıza ConnectionString göndermenize gerek yok. Settings e kaydedin ordan kullanın.


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    12 Haziran 2012 Salı 06:11

Tüm Yanıtlar

  • Arkadaşlar iki kere ekleme sorununu çözdüm. Şimdi bunu geliştirebilirsek çok iyi olur.

    Sorun :

     if (Command.ExecuteNonQuery() > 0)
                        return ("Nesne başarı ile silindi !...");
                    else
                        return ("Nesne silme sırasında bir hata oluştu !...");
    

    bu işlemi yaparken tekrar ekliyormuş.
    11 Haziran 2012 Pazartesi 21:20
  • söylemek istediğiniz generic bir yapıdır, generic yapılar bir projeye yada bir işleme bağlı kalmadan genel olarak uyum içinde verinin tipine göre büyüklük yada küçüklük gösterir bu bağlamda sql yerine

    framework Entity yapısını kullanmanı tavsiye ederim generic yapılarla bir örneği burada bulabilirsin

    http://social.msdn.microsoft.com/Forums/tr-TR/csharptr/thread/a6295ae6-b022-4831-83aa-58aef732a335

    yada google da generic yapılara bakın
    11 Haziran 2012 Pazartesi 21:32
  • Selamlar, Daha önce arkadaşlar (Anatolium ve Çetin Bey) size zaten var olan ORM ve DAL yapılarını kullanma hakkında tavsiyede bulundu, ancak sanırım siz kendiniz yazmak istiyorsunuz. Bende bunların üzerine tekrar tekrar Dataset yada EF ve Linq kullanın demeyeceğim artık.

    Yukarıdaki classınız static olmadığından her işlemde bu classtan bir tane üretmeniz gerekecek, bunun için size pek optimal gelmiyor. Classınızı static yaparsanız tek instance'ı programın herhangi bir yerinde defalarca kullanabilirsiniz. Örneğin;

    DataHelper.cs

    public static class DataHelper
    {
      //DataTable döndüren method
      public static DataTable GetData(string CommandText)
      {
        SqlDataAdapter _da = new SqlDataAdapter(new SqlCommand(CommandText, new SqlConnection(Properties.Settings.Default.ConnectionString)));
        DataTable _dt = new DataTable();
        _da.Fill(_dt);
        return _dt;
      }
      //Yukarıdaki methodun Parameters li overloadı
      public static DataTable GetData(string CommandText, SqlParameterCollection Parameters)
      {
        SqlDataAdapter _da = new SqlDataAdapter(new SqlCommand(CommandText, new SqlConnection(Properties.Settings.Default.ConnectionString)));
        _da.Command.Parameters = Parameters;
        DataTable _dt = new DataTable();
        _da.Fill(_dt);
        return _dt;
      }
    
      //Nonquery çalıştıran method
      public static void NonQuery(string CommandText)
      {
        (new SqlCommand(CommandText, Properties.Settings.Default.ConnectionString)).ExecuteNonQuery();
      }
      //Parameterli overload
      public static void NonQuery(string CommandText, SqlParameterCollection Parameters)
      {
        SqlCommand _cmd = new SqlCommand(CommandText, Properties.Settings.Default.ConnectionString);
        _cmd.Parameters = Parameters;
        _cmd.ExecuteNonQuery();
      }
    
      //Buda Scalar sorgularınız için;
      public static object Scalar(string CommandText)
      {
        return (new SqlCommand(CommandText, Properties.Settings.Default.ConnectionString)).ExecuteScalar();
      }
    
      }
    }
    
    

    Not: Her defasında methodlarınıza ConnectionString göndermenize gerek yok. Settings e kaydedin ordan kullanın.


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    12 Haziran 2012 Salı 06:11