none
Data Grid Sql Kayıt RRS feed

  • Soru

  • Data grid kullanarak .csv dosyasını dışarıdan alıp okuyorum bu aldığımı toplu bir şekilde nasıl sql deki sütunlara kayıt yapabilirim ? Şimdiden teşekkürler..
    21 Ocak 2020 Salı 08:21

Tüm Yanıtlar

  • Bulk insert deneyebilirsin ; 

          private  void BulkInsert(DataTable insertTable, string insertTableName)
            {
                using (SqlConnection scon = new SqlConnection("bağlantı cümlesi"))
                {
                    scon.Open();
                    SqlTransaction transaction = scon.BeginTransaction();
                    using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(scon, SqlBulkCopyOptions.Default, transaction))
                    {
                        sqlBulkCopy.DestinationTableName = insertTableName;
                        try
                        {
                            sqlBulkCopy.WriteToServer(insertTable);
                        }
                        catch (Exception ex)
                        {
                            transaction.Rollback();
                            throw new Exception("Toplu Kayıt Anında Hata Alındı " + ex.Message);
                        }
                    }
                    transaction.Commit();
                }
            }

    Kolon isimleri aynı değilse , aynı sırada olmasına özen göstermelisin. Fazla yolladığın kolonlar hata döndürür.


    Altan Özdemir

    21 Ocak 2020 Salı 11:54
  • Datagrid arada sadece bir gösterim aracı, data ile dogrudan ilgisi yok.

    SQL derken, sanırım MS SQL Server demek istiyorsunuz. Bir csv dosyasının, SQL server'daki bir tabloya aktarımı icin N tane yol var. Datagrid dediğinize gore, arada bir IEnumerable var, ancak bunun ne oldugunu söylememişsiniz, bir DataTable, List ama ne bilmiyoruz. En basit haliyle, bir tane insert cümlesi yazarsınız, datagrid satirlarini dolaşıp, degerleri yerleştirip calistirirsiniz. Kaba bir ornek:

    string insert = @"insert into TabloAdi
    (id, ad) values (@id, @ad)";
    
    using (SqlConnection cn = new SqlConnection(@"server=.\SQLExpress;Database=ornek;Trusted_Connection=yes"))
    using (SqlCommand cmd = new SqlCommand(insert, cn))
    {
    	cmd.Parameters.Add("@id", SqlDbType.Int);
    	cmd.Parameters.Add("@ad", SqlDbType.VarChar);
    	
    	cn.Open();
    
    	foreach (DataGridViewRow r in dgv.Rows)
    	{
    	   cmd.Parameters["@id"].Value = r.Cells["id"].Value;
    	   cmd.Parameters["@ad"].Value = r.Cells["ad"].Value;
    	   cmd.ExecuteNonQuery();
        }
    	cn.Close();
    }
    

    Tabii elinizde DataTable, DataRow[], IDataReader ... varsa buna gerek yok, o zaman daha efektif olan SqlBulkCopy classini kullanirsiniz.

    Yontemler bu kadarla sinirli degil, sadece baslangic. Elinizde gercekten ne olduguna, DataGridView'a alınıp işlenip islenmediğine (yani arada DataGridView'in gerekliligine), DataTable olup olmamasına ... gore değişir. Ilk ornek biraz fazla miktardaki veride efektif olmasa da calisir.    



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    21 Ocak 2020 Salı 12:08
    Yanıtlayıcı