none
C# Excel den gelen veriyi Mssql Kaydetme ve Aynı Numaraları Tekrar Kaydetmeme RRS feed

  • Genel Tartışma

  • Merhaba bilgisi olanlar yardımcı olursa sevinirim.

    Yapmak istediğim şudur.

    Bir Excel Tablom var 

    Sipariş Kodu Entegrasyon Adı Ürün Adı Faturalandı Fatura Tarihi Fatura Numarası İrsaliye İrsaliye Tarihi İrsaliye Numarası Entegrasyon Erp ERP Kodu
    206439948378 N11 Canon Pixma GM2040 Wifi Mürekkep Püskürtmeli Yazıcı Hayır Hayır Hayır
    SC107831582 GittiGidiyor KASPERSKY Total Security Trk Kutu 2019-2020 1yıl 3 Kullanıcı Hayır Hayır Hayır
    202134339374 N11 I-LIFE ZED AIR CX5 15.6" CORE i5 5257U 8GB- 256GB SSD- O/B IG6100 Evet 15.10.2020 19:29 AAB2020000005307 Hayır Hayır
    204648139374 N11 HIKVISION DS-2CE11D0T-PIRL 2MP BULLET 3.6MM 20metre 4in1 Güvenlik Hayır Hayır Hayır
    208377139370 N11 DELL 5501 S35G1F85N 15.6" CORE i5 1035G1 8GB- 512GB M2 NVME- 2 GB Evet 15.10.2020 19:28 AAA2020000000947 Hayır Hayır
    208989139374 N11 KIOXIA EXCERIA LRC10Z500GG8 500GB 1700- 1600MB/s M2 PCIe NVME Dis Hayır Hayır Hayır
    207155139378 N11 DELL 5501 S35G1F85N 15.6" CORE i5 1035G1 8GB- 512GB M2 NVME- 2 GB Evet 15.10.2020 19:28 AAA2020000000946 Hayır Hayır

    bu tabloyu gözat butonu ile mssql kaydedeceğim ama sonrasında içine eklendikçe mesela şuan içinde 1000 kayıt var yarın 5000 olduğunda aynı işlemi yaparken aynı sipariş numaralarını eklemeden yenileri eklenecek bu işlemi nasıl yapabilriirm.

    15 Ekim 2020 Perşembe 19:17

Tüm Yanıtlar

  • Sql'de sipariş numarasını unique index yaparsan aynı numaradan bir daha kayıt yapmaz. 

    Kolay gelsin.

    15 Ekim 2020 Perşembe 19:51
  • Oncelikle MS SQL server'a aktarım için SqlBulkCopy class kullanıniz. SqlBulkCopy ile gercek tabloya degil, gecici bir tabloya yukleyiniz. Sonra, gercek tablonuza o gecici tablodan NOT EXISTS kullanarak aktariniz. Asagida bir ornek var, eskiden yazilmis bir ornek oldugundan alan adlari, tablo adalri sizinkiyle ayni degil ama ne yapildigi belli:

    void Main()
    {
      string sqlConnectionString = @"server=.\SQLExpress;Trusted_Connection=yes;Database=Test";
    
      string path = @"d:\Temp\Customers.xlsx"; // Northwind.mdb'den export edilmis ornek excel sheet
      string sheetName = "Customers$";
      DataTable tbl = new DataTable(); // sadece sonuclari gostermek icin
      
      using (OleDbConnection cn = new OleDbConnection(
        "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+path+
        ";Extended Properties=\"Excel 8.0;HDR=Yes\""))
    
      using (SqlConnection scn = new SqlConnection( sqlConnectionString ))
      {
        // gecici bir SQL server tablosu yaratiyoruz ornek icin.
        // tablo zaten var ise bu kisim olmayacak. Sadece insert edecektik.
        SqlCommand createTemp = new SqlCommand();
        createTemp.CommandText = @"create table #SqlBulkOrnek 
        (
          [MusteriId] char(6), 
          [Sirket] varchar(50), 
          [IlgiliKisi] varchar(50), 
          [Ulke] varchar(20) 
        )"; 
        createTemp.Connection = scn;
      
        scn.Open();
        createTemp.ExecuteNonQuery();
        
        // Excelden veriyi al ve SqlBulkCopy ile servera yaz  
        OleDbCommand cmd = new OleDbCommand(String.Format("select * from [{0}]",sheetName), cn);
        SqlBulkCopy sbc = new SqlBulkCopy(scn, SqlBulkCopyOptions.TableLock,null);
        
        // Excel dosyasindaki kolonlar ile SQL serverdaki kolonlar farkli
        // Exceldeki ilk kolon SQL server tablomuzdaki MusteriId, 2. Sirket
        // 3. IlgiliKisi ve 9. excel kolonu Ulke olacak sekilde Mapping ekliyoruz
        // Mapping olmasa idi ayni yapidaki veri kopyalaniyor olacakti.
        sbc.ColumnMappings.Add(0,"[MusteriId]");
        sbc.ColumnMappings.Add(1,"[Sirket]");
        sbc.ColumnMappings.Add(2,"[IlgiliKisi]");
        sbc.ColumnMappings.Add(8,"[Ulke]");
      
        cn.Open();
        OleDbDataReader rdr = cmd.ExecuteReader();
        
        // SqlBulkCopy'nin propertyleri
        sbc.NotifyAfter = 100000;
        sbc.BatchSize = 1000;
        sbc.BulkCopyTimeout = 10000;
        sbc.DestinationTableName = "##SqlBulkOrnek";
        
        // Arada notification
        sbc.SqlRowsCopied += (sender,e) =>
          {
          Console.WriteLine("-- Copied {0} rows to {1}.", 
            e.RowsCopied, 
            ((SqlBulkCopy)sender).DestinationTableName);
          };
        
        // server'a yaz
        sbc.WriteToServer(rdr);
      
        if (!rdr.IsClosed) { rdr.Close(); }
        
        cn.Close();
        
        // Server'a hakikaten yazildigini kontrol ediyoruz.
        // Bu sadece ornekte test icin.
        // Oku
        SqlCommand cmdRead = new SqlCommand("select * from #SqlBulkOrnek", scn);
        tbl.Load(cmdRead.ExecuteReader());
    	
    	
    	// Aktarım örneği
    	new SqlCommand(@"insert into hedefTablo 
    	   (MusteriId, Sirket, IlgiliKisi, Ulke)
    	   select MusteriId, Sirket, IlgiliKisi, Ulke
    	   from #SqlBulkOrnek
    	   where not exists (select musteriId from hedefTablo)", scn).ExecuteNonQuery();
        scn.Close();
      }
      
      // Serverdan okunanlari bir formda goster.
      Form f = new Form();
      DataGridView dgv = new DataGridView();
      dgv.Location = new Point(0, 0);
      dgv.Dock = DockStyle.Fill;
      dgv.DataSource = tbl;
      f.Controls.Add(dgv);
      f.ClientSize = new Size(1024, 768);
      f.ShowDialog();
    }

    Not: Tabii tablonuzdaki Primary Key muhtemelen o siparis kodudur, ya da unique indexlenmistir ve veritabani insert etmenizi engeller ama o zaman tek tek insert deneyip hata kontrolu yapmaniz gerekir. Onun yerine, bu sekilde indexe guvenmeden yapmis olursunuz.



    Blog
    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.


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.

    15 Ekim 2020 Perşembe 20:07
    Yanıtlayıcı
  • Hocam çok teşekkür ederim ama sizden ricam bana proje olarak as.net de yapabilirimsiniz ücret karşılığın dada olabilir.

    hatta gözat butonu yapıp yükle dediğimizde proğres bar ile devam eden kaç kayıt var yeni kayıt kaç tane eklendi yapabilirseniz sevinirim.

    çok önemli benim için


    16 Ekim 2020 Cuma 20:11