none
ArrayList'den SQL'e veri ekleme

    Soru

  • Arkadaşlar Merhaba. Bu sorun benim için çok önemli. Lütfen elinizden geldiğince yardımcı olun.

    Şimdi benim yaptığım projelerde genellikle sql server'a veri ekleme var. ve ben bunları yapmak için uzun uzadıya Sql kodları yazıyorum (Inser Into ........... ). Ben bunu yapmaktan sıkıldım artık. Kendime bir dll yapmaya karar verdim. Yapmak istediğim veya yapmaya çalıştığım mantık şöyle; Bir arraylist oluşturmayı düşünüyorum. Bu arraylist'e textbox'a girilen verileri teker teker atamak istiyorum. Sonra bu arraylist'i dll dosyama göndermek istiyorum. Bu dll dosyasında yazmış olduğum kodlarda (Aşağıda)

    INSERT INTO (DataReader.GetName(0).ToString(),DataReader.GetName(1).ToString()) VALUES ("'" + Arraylist[0] + "','" + Arraylist[1] + "'")

    Şeklindeki kodlar ile dll dosyasında DataReader ile okumuş olduğum Sütun adlarını ve Arraylist'de eklenecek olan verileri kullanarak sql'e giriş yaptırtmak istiyorum. Fakat burda tıkandığım nokta, dll'de bu kodları girerken "INSERT INTO" ve "VALUES" kısmından sonra gelen, sütun adlarının yazıldığı kısımda sütunların arasına

    + "," +

    kodlarını eklemek. Sonuç olarak bazı işlemlerde 2 bazılarında ise 40 tane veri girilecek ve bu veri sayılarına göre yukarıdaki işaretlerden gelecek ve bu işaretler parametrelerin arasına gelecek ve parametre yeni başladıysa sadece;

    "'" + 

    devam ediyorsa;

    + "','" +

    bittiyse;

    + "'"

    kodlarını getirmek. Bunu nasıl yapabilirim.

    Eğer bunu anlamadıysanız veya başka çözümleriniz varsa ben yapmak istediklerimi söyleyeyim;

    Ben programda sql'e veri eklemek için sadece ekleyeceğim verileri girmek istiyorum, yani teker teker "INSERT INTO" yazıpta, kolonları yazıpta, verileri yazmakla uğraşmak istemiyorum. İstediğim şey, veri eklemek için ben sadece parametre olarak eklenecek verileri, tablo adını ve bağlantı cümlesini verim, o kendiliğiden bu verileri eklesin. Arkadaşlar gerçekten buna çok ihtiyacım var lütfen yardımcı olun. Nereden aradıysamda bulamadım. Lütfen...

    10 Haziran 2012 Pazar 14:57

Yanıtlar

  • Merhbaba Abdulkadir NURKALEM;

    Veri Erişim Katmanı Nasıl Yazılır neden YAZMALIYIM sorusunun cevabı "veri erişim katmanı candır".

    Bunu şöyle düşün neden her seferinde Bir Tabloya kayıt yapmak istediğinde Connection yaz , Connection aç Command yaz , Command'ın türünü belirle, Parametreleri belirle, dönüş tiplerini belirle bunları komuta ekle komutu çalıştır, dönen sonucu kontrol et Connection ı kapat ,Connection'ı ve Commandları Dispose et......... (belki de daha fazlası) ile uğraşmak yerine ki bu sadece bir tabloya kayıt (INSERT) işlemi için geçerli idi,

    KATMAN 1 (Entity Katmanı): Bir Class Library yazsan Bu Class Library içinde Veritabanındaki Tüm Tablolara ait ve bu tablolardaki column ları temsil eden Property'leri olan Class'lar olsa.

    KATMAN 2 (DAL - Data Access Layer) : Yine Bir Class Library oluştursan, bu Library içinde Veritabanındaki İşlem Yapacağın Tablolara ait 5 Temel işlemi yapacak (Eklemek - Silmek - Bir Kıstasa Göre Seçmek - Hepsini Seçmek - Güncellemek) gibi (Bu arada 5 temel işlem dedim ama daha fazla yada az da olabilir kendi ihtiyacına göre belirlersin) METOD'ları tanımlasan ve bu Metodların 1.Katmandaki Classlar ile işlem yapmasını sağlasan.

    Yani kısaca bir tabloya INSERT yapmak istediğinde sağdan soldan parametre değerlerini toplayıp bir Class'a yazsan ve Katman 2 den Insert Metodu çalıştırdığında Metod senden Kayıt Yapılacak Class ı istese nasıl olur ?

    KATMAN 3 (DB - Provider ) : Başka Bir Class Library oluşturduğunu düşün ve Bu katmanda Veri tabanı ile kullanmak istediğin herşeyin olduğunu düşünsen (Connection olsun, Command Olsun, DataReader, vb.vb.) (Çoğu  zaman bu katman için sadece bir yada birkaç Class yeteceği için 2.Katman ile Birleştirilir)

    KATMAN 4 (User Interface) : Windows Uygulaması, Web Uygulaması, vb.vb gibi kullanıcı arayüzlerinde çalışmalar yaparken her birisi için tekrar tekrar aynı code parçaları yazmak yerine yukarıdaki Class Library'leri kullansan 2-3 satır code ile TEMEL 5 işlemi yapsan kodun ne kadar okunabilir ve anlaşılabilir olurdu ve sen yüzlerce belki binlerce code satırı tekrarından kurtulurdun değil mi ?

    Son olarak bu katman sayısı ihtiyacına ve yapmak istediklerine göre arttırabildiğini düşünsen ?

    Buaraya Kadar VERİ ERİŞİM Katmanı (DAL) nasıl yazılır Sorusunun cevabı idi.

    Bundan sonrası ise Entity FrameWork nedirin cevabı,

    Yukarıda bahsedilen bu Classları oluşturmakla uğraşamayacığını ve bir miktar PERFORMANS düşüşünün umrunda olmadığını (aslında umrunda olmalı - ama küçük projelerde pek dikkate alınmaz) TÜM BUNLARI Senin yerine Visual Studio'nun Yaptığını Hayal Etsen.

    Bunun dışında örnek bir proje istersen bana mail atsan?


    JESUS PROMISED THE END OF ALL WICKED PEOPLE,ODIN PROMISED THE END OF ALL ICE GIANTS. I DON'T SEE MANY ICE GIANTS AROUND... exe[nokta]cute[at]live[nokta]com

    11 Haziran 2012 Pazartesi 14:22
  • Yine Merhaba;

    En başdaki sorduğun sorunun cevabı olarak Bunları Her seferinde yazmak yerine Kullandığın veritabanı üzerinde insert işlemi için bir STORED PROCEDURE yazsan ve bu tabloya kayıt yapmak istediğinde oluşturduğun SP'yi çalıştırmak işini görecektir.

    Örnek olarak

    -- Örnek 
    -- Stored Procedure Oluşturma
    CREATE PROC sp_CategoryEkle
    (@CategoryName nvarchar(50),@Description nvarchar(50))
    AS
    Insert into  Categories values (@CategoryName,@Description)
    GO
    
    -- Kullanımı(SP ismini yazıp Parametre olarak Categories Tablosuna Eklemek İstediğin Verileri Yazıyorsun)
    exec sp_CategoryEkle 'Tatlılar','Her türlü sütlü tatlı çeşitleri'


    JESUS PROMISED THE END OF ALL WICKED PEOPLE,ODIN PROMISED THE END OF ALL ICE GIANTS. I DON'T SEE MANY ICE GIANTS AROUND... exe[nokta]cute[at]live[nokta]com

    11 Haziran 2012 Pazartesi 14:46

Tüm Yanıtlar

  • Arkadaşlar Merhaba. Bu sorun benim için çok önemli. Lütfen elinizden geldiğince yardımcı olun.

    Şimdi benim yaptığım projelerde genellikle sql server'a veri ekleme var. ve ben bunları yapmak için uzun uzadıya Sql kodları yazıyorum (Inser Into ........... ). Ben bunu yapmaktan sıkıldım artık. Kendime bir dll yapmaya karar verdim. Yapmak istediğim veya yapmaya çalıştığım mantık şöyle; Bir arraylist oluşturmayı düşünüyorum. Bu arraylist'e textbox'a girilen verileri teker teker atamak istiyorum. Sonra bu arraylist'i dll dosyama göndermek istiyorum. Bu dll dosyasında yazmış olduğum kodlarda (Aşağıda)

    INSERT INTO (DataReader.GetName(0).ToString(),DataReader.GetName(1).ToString()) VALUES ("'" + Arraylist[0] + "','" + Arraylist[1] + "'")

    Şeklindeki kodlar ile dll dosyasında DataReader ile okumuş olduğum Sütun adlarını ve Arraylist'de eklenecek olan verileri kullanarak sql'e giriş yaptırtmak istiyorum. Fakat burda tıkandığım nokta, dll'de bu kodları girerken "INSERT INTO" ve "VALUES" kısmından sonra gelen, sütun adlarının yazıldığı kısımda sütunların arasına

    + "," +

    kodlarını eklemek. Sonuç olarak bazı işlemlerde 2 bazılarında ise 40 tane veri girilecek ve bu veri sayılarına göre yukarıdaki işaretlerden gelecek ve bu işaretler parametrelerin arasına gelecek ve parametre yeni başladıysa sadece;

    "'" + 

    devam ediyorsa;

    + "','" +

    bittiyse;

    + "'"

    kodlarını getirmek. Bunu nasıl yapabilirim.

    Eğer bunu anlamadıysanız veya başka çözümleriniz varsa ben yapmak istediklerimi söyleyeyim;

    Ben programda sql'e veri eklemek için sadece ekleyeceğim verileri girmek istiyorum, yani teker teker "INSERT INTO" yazıpta, kolonları yazıpta, verileri yazmakla uğraşmak istemiyorum. İstediğim şey, veri eklemek için ben sadece parametre olarak eklenecek verileri, tablo adını ve bağlantı cümlesini verim, o kendiliğiden bu verileri eklesin. Arkadaşlar gerçekten buna çok ihtiyacım var lütfen yardımcı olun. Nereden aradıysamda bulamadım. Lütfen...

    10 Haziran 2012 Pazar 14:58
  • Kendin genel bir veri erişim katmanı yazman gerekir ya da  Entity Framework kullan çok daha kolay olur.

    10 Haziran 2012 Pazar 15:30
  • Biraz daha ayrıntılı bilgi verebilir misiniz ? Veri erişim katmanı nasıl yazılır ? Entity Framework nedir, Nasıl kullanılır ?
    10 Haziran 2012 Pazar 16:05
  • Bir class library oluştur ve içerisine bir class oluştur.

    ve içerisine bir method yazman gerekmektedir.

    mehod şu şekilde olmalıdır ; 

    public bool KayitEkle(string deger1, string deger2, string deger2)

    {

    // gerekli database baglantı işlemi;

     SqlCommand cmd = new SqlCommand(ConnextionString);

      cmd.Text=" insert into () values (@kolon1,@kolon2,@kolon3)";

      cmd.Parameters.AddWithValue("@kolon1",deger1);

      cmd.Parameters.AddWithValue("@kolon2",deger2);

      cmd.Parameters.AddWithValue("@kolon3",deger3);

     if(cmd.executeNonQuery()>0)

      return true;

    else

     return false;

    }

    Yukarıdaki gibi bir class oluşturduktan sonra bu class lib. derledikten sonra bu lib. kendi projene referans et. Daha sonra istediğin yerde şu şekilde kullanabilirsin;

    ClassinIsmı benimClass = new ClassinIsmı();

    benimClass.KayitEkle(textbox1.text,textbox2.text,textbox3.text);

    bu fonksiyondan donecek olan deger bool oldugu ıcın kayıt ekleme işlemi basarılı olup olmadıgını da ogrenıp ona gore ıslem yapabılırsın.Eger ıstersen coonection string ini de parametre olarak alıp daha dinamik bir yapı olusturabılırsın.

    Umarım yardımcı olmuştur.Kolay gelsın

    10 Haziran 2012 Pazar 16:06
  • Aşağıdaki bağlantılar yararlı olacaktır.

    Veri Erişim Katmanı (Data Access Layer)

    Entity Framework Nedir

    • Yanıt Olarak Öneren AAKoken 11 Haziran 2012 Pazartesi 11:32
    10 Haziran 2012 Pazar 16:15
  • Öncelikle çok teşekkürler, çok faydası oldu. Ama bir sorun daha var. Dediğim gibi ben bazen 10 bazen 200 bazen 1 sütunlu veri kaydedeceğim. Bu edeceğim sayıya göre parametre lazım. Bunu nasıl yapabilirim. Yani siz burada 3 parametre vermişşsiniz. Bunu dll yapıp daha sonra bu dll'yi kullanırken 10 sütunlu eklemek istediğimde ne yapmalıyım ?
    10 Haziran 2012 Pazar 17:04
  • Arkadaşın yaptığı mantıktan gidersek;

    public bool KayitEkle(string[] degerDizisi)

    {

    // gerekli database baglantı işlemi;

     SqlCommand cmd = new SqlCommand(ConnextionString);

    int alanlar = degerDizisi.Count();

    string insertValues = "";

    For (i = 0 ; i <= alanlar ; i++)

    {

    cmd.Parameters.AddWithValue("@kolon" + i ,degerDizisi[i].ToString());

    if ( i != alanlar )

    insertValues = insertValues + ("@kolon" + i + ",");

    else

    insertValues = insertValues + ("@kolon" + i);

    }

     cmd.Text=" insert into () values ("+ insertValues +")";

     if(cmd.executeNonQuery()>0)

      return true;

    else

     return false;

    }

    kodu test etmedim ama çalışması gerekiyor.

    Yapacağın tek şey dışarıdan göndereceğin alanları bir diziye atmak ve diziyi kayıt ekle ye göndermek gerisini o halledecek,

    kaç alan olursa olsun sorguyu kendisi oluşturacak,

    Daha farklı yöntemlerde denenebilir,

    ama istersen buradan yolacak farklı şeylerde bulabilirsin diye düşünüyorum.

    kolay gelsin.



    • Düzenleyen _MeMo_ 10 Haziran 2012 Pazar 17:54
    • Yanıt Olarak Öneren Koray Düzgün 10 Haziran 2012 Pazar 18:06
    10 Haziran 2012 Pazar 17:51
  • Aslında;

    INSERT INTO (DataReader.GetName(0).ToString(),DataReader.GetName(1).ToString()) VALUES ("'" + Arraylist[0] + "','" + Arraylist[1] + "'")

    yapmışsın, bunun üzerinden gidersen yapman gereken;

    string insertInto = "";

    string insertValues = "";

    int dataReaderCount = DataReader.FieldCount;

    string InsertQuery = "";

    For (i = 0 ; i <= dataReaderCount; i++)

    {

    //Into ve Values alanları için,

    if ( i != dataReaderCount )

    {

    insertInto = insertInto + (DataReader.GetName(i).Tostring() + ",");

    insertValues insertValues + (ArrayList[i] + ",");

    }

    else

    {

    insertInto = insertInto + (DataReader.GetName(i).Tostring());

    insertValues = insertValues + (ArrayList[i]);

    }


    InsertQuery = "INSERT INTO ("'" + insertInto + "'") VALUES ("'" + insertValues + "'")";

    ile tamamlarsan sorunun çözümlenir...

    dene istersen...




    • Düzenleyen _MeMo_ 10 Haziran 2012 Pazar 18:14
    10 Haziran 2012 Pazar 18:11
  • Öncelikle Çok Teşekkür ederim. Ben daha sağlan birşey keşfettim. Ama tek kusuru veriyi 2 kere kaydediyor. Bunu nasıl düzeltebiliriz ?

    SqlConnection Connection = new SqlConnection();
            SqlCommand Command = new SqlCommand();
            SqlDataReader Reader;
    
            public int VeriSayısı;
            public string ParametreCümlesi;
    
            public void SqlInto(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)
                        MessageBox.Show("İşlem Başarılı");
                    else
                        MessageBox.Show("İşlem Başarısız !");
                }
                catch (Exception Error)
                {
                    MessageBox.Show(Error.Message.ToString());
                }
                finally
                {
                    VeriSayısı = 0;
                    ParametreCümlesi = null;
                    Command.Parameters.Clear();
                    Command.Dispose();
                    Connection.Close();
                }
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                ArrayList Veriler = new ArrayList();
                Veriler.Add(textBox3.Text);
                Veriler.Add(textBox4.Text);
                SqlInto("Data Source=.;Initial Catalog=Otel Editörü;Integrated Security=True","Hesap",Veriler);
            }

    10 Haziran 2012 Pazar 18:49
  • Merhbaba Abdulkadir NURKALEM;

    Veri Erişim Katmanı Nasıl Yazılır neden YAZMALIYIM sorusunun cevabı "veri erişim katmanı candır".

    Bunu şöyle düşün neden her seferinde Bir Tabloya kayıt yapmak istediğinde Connection yaz , Connection aç Command yaz , Command'ın türünü belirle, Parametreleri belirle, dönüş tiplerini belirle bunları komuta ekle komutu çalıştır, dönen sonucu kontrol et Connection ı kapat ,Connection'ı ve Commandları Dispose et......... (belki de daha fazlası) ile uğraşmak yerine ki bu sadece bir tabloya kayıt (INSERT) işlemi için geçerli idi,

    KATMAN 1 (Entity Katmanı): Bir Class Library yazsan Bu Class Library içinde Veritabanındaki Tüm Tablolara ait ve bu tablolardaki column ları temsil eden Property'leri olan Class'lar olsa.

    KATMAN 2 (DAL - Data Access Layer) : Yine Bir Class Library oluştursan, bu Library içinde Veritabanındaki İşlem Yapacağın Tablolara ait 5 Temel işlemi yapacak (Eklemek - Silmek - Bir Kıstasa Göre Seçmek - Hepsini Seçmek - Güncellemek) gibi (Bu arada 5 temel işlem dedim ama daha fazla yada az da olabilir kendi ihtiyacına göre belirlersin) METOD'ları tanımlasan ve bu Metodların 1.Katmandaki Classlar ile işlem yapmasını sağlasan.

    Yani kısaca bir tabloya INSERT yapmak istediğinde sağdan soldan parametre değerlerini toplayıp bir Class'a yazsan ve Katman 2 den Insert Metodu çalıştırdığında Metod senden Kayıt Yapılacak Class ı istese nasıl olur ?

    KATMAN 3 (DB - Provider ) : Başka Bir Class Library oluşturduğunu düşün ve Bu katmanda Veri tabanı ile kullanmak istediğin herşeyin olduğunu düşünsen (Connection olsun, Command Olsun, DataReader, vb.vb.) (Çoğu  zaman bu katman için sadece bir yada birkaç Class yeteceği için 2.Katman ile Birleştirilir)

    KATMAN 4 (User Interface) : Windows Uygulaması, Web Uygulaması, vb.vb gibi kullanıcı arayüzlerinde çalışmalar yaparken her birisi için tekrar tekrar aynı code parçaları yazmak yerine yukarıdaki Class Library'leri kullansan 2-3 satır code ile TEMEL 5 işlemi yapsan kodun ne kadar okunabilir ve anlaşılabilir olurdu ve sen yüzlerce belki binlerce code satırı tekrarından kurtulurdun değil mi ?

    Son olarak bu katman sayısı ihtiyacına ve yapmak istediklerine göre arttırabildiğini düşünsen ?

    Buaraya Kadar VERİ ERİŞİM Katmanı (DAL) nasıl yazılır Sorusunun cevabı idi.

    Bundan sonrası ise Entity FrameWork nedirin cevabı,

    Yukarıda bahsedilen bu Classları oluşturmakla uğraşamayacığını ve bir miktar PERFORMANS düşüşünün umrunda olmadığını (aslında umrunda olmalı - ama küçük projelerde pek dikkate alınmaz) TÜM BUNLARI Senin yerine Visual Studio'nun Yaptığını Hayal Etsen.

    Bunun dışında örnek bir proje istersen bana mail atsan?


    JESUS PROMISED THE END OF ALL WICKED PEOPLE,ODIN PROMISED THE END OF ALL ICE GIANTS. I DON'T SEE MANY ICE GIANTS AROUND... exe[nokta]cute[at]live[nokta]com

    11 Haziran 2012 Pazartesi 14:22
  • Yine Merhaba;

    En başdaki sorduğun sorunun cevabı olarak Bunları Her seferinde yazmak yerine Kullandığın veritabanı üzerinde insert işlemi için bir STORED PROCEDURE yazsan ve bu tabloya kayıt yapmak istediğinde oluşturduğun SP'yi çalıştırmak işini görecektir.

    Örnek olarak

    -- Örnek 
    -- Stored Procedure Oluşturma
    CREATE PROC sp_CategoryEkle
    (@CategoryName nvarchar(50),@Description nvarchar(50))
    AS
    Insert into  Categories values (@CategoryName,@Description)
    GO
    
    -- Kullanımı(SP ismini yazıp Parametre olarak Categories Tablosuna Eklemek İstediğin Verileri Yazıyorsun)
    exec sp_CategoryEkle 'Tatlılar','Her türlü sütlü tatlı çeşitleri'


    JESUS PROMISED THE END OF ALL WICKED PEOPLE,ODIN PROMISED THE END OF ALL ICE GIANTS. I DON'T SEE MANY ICE GIANTS AROUND... exe[nokta]cute[at]live[nokta]com

    11 Haziran 2012 Pazartesi 14:46
  • Burada ArrayList'in tek esprisi degisik tipteki verileri bir listede tutmasi ama gittigin yol cok yanlis. ArrayList'e gelen degerlerle SQL serverin guvenligi ciddi tehdit altinda demektir. Asla ve asla o kod ornegindeki gibi SQL komutu yazma, parametre kullan.

    Linq kullan bence ama ne yapmak istedigini tam olarak anlamadigimdan ornek de veremiyorum. Genel olarak anladigim kolon adlarini yazmanin kulfetli oldugunu dusunmen (haksiz da degilsin). Linq kullanirsan dogrudan intellisense sana yardim eder. Sonucta birilerinin kolon adini yazmasi gerekecek.

    11 Haziran 2012 Pazartesi 16:40
    Yanıtlayıcı
  • Arkadaşlar. Ben yapmak istediğim şeyi kısmen yaptım. Dll dosyamın içindeki kodlar şöyle;

    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();
                }
            }
        }
    }

    Kendime böyle bir dll oluşturdum. Bir veri eklemek istediğimde sadece şu işlemleri yapıyorum.

    SqlOperation.Class Sqlİşlemleri = new SqlOperation.Class(); //Burada dll dosyamı tanıtıyorum //veri ekleyeceğim kısma gelip şöyle yapıyorum; ArrayList EklenecekVeriler = new Arraylist(); EklenecekVeriler.Add("Abdulkadir"); EklenecekVeriler.Add("Nurkalem"); Sqlİşlemleri.SqlInsertInto("Data Source=.;Initial Catalog=Otel Editörü;Integrated Security=True", "Hesap", EklenecekVeriler); //Bu kadar işlemle verilerimi connectionstring'ini verdiğim adrese ekliyorum.


    Yanlız tıkandığım bir yer var. Bu işlemleri yapınca veriyi 2 kere kaydediyor. Bunu nasıl önleyebilirim. Birde bu işlemden daha kolay ve güvenli bir şekilde başka ne türlü kayıt yaptırabilirim. Yardımlarınız için şimdiden teşekkürler...

    11 Haziran 2012 Pazartesi 17:44
  • Dost aci soyler. Zahmet edip yazmissin o kodu ama o kod hicbir ise yaramaz. Ilk bakista gordugum nedenler:

    1) Daima tablodaki kolonlarin ne oldugunu ve sirasini ezbere bileceksin.

    2) Daima kolon sayisi kadar veri gondereceksin.

    3) Tablonda $Identity, $RowGuid gibi kolonlarin olmayacak.

    Benim de benzer kodlarim var ama baska dilde. Linq olsaydi orada yazmazdim. Kabaca soyle:

    SqlCommand SqlInsertIntoCommand( string tabloAdi, string fieldList, params object[] parameters )
    {
      var paramNames = fieldList.Split(',').Select (f => "@" + f.Trim()).ToArray();
    
      SqlCommand cmd = new SqlCommand();
      cmd.CommandText = string.Format("insert into {0} ({1}) values ({2})", 
        tabloAdi, 
        fieldList,
        string.Join(",", paramNames) );
    
      for (int i = 0; i < paramNames.Count(); i++)
      {
        cmd.Parameters.AddWithValue( paramNames[i], parameters[i]);
      }
      
      return cmd;
    }

    Bu kodu:

    SqlInsertIntoCommand("Sirket", "Ad, Tarih", "Benim Sirket", DateTime.Today)

    seklinde cagirirsan sana CommandText'i:

    insert into Sirket (Ad, Tarih) values (@Ad, @Tarih)

    olan ve parametreleri eklenmis bir SqlCommand doner. Istersen connectionstring'de gonderip dogrudan insert edecek sekilde degistirebilirsin. Digerleri de buna benzer.

    • Yanıt Olarak Öneren AAKoken 12 Haziran 2012 Salı 17:59
    12 Haziran 2012 Salı 08:52
    Yanıtlayıcı