Soran
C# Excel den gelen veriyi Mssql Kaydetme ve Aynı Numaraları Tekrar Kaydetmeme

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.
- Değiştirilmiş Tür Kyamuran SalibryamMicrosoft contingent staff, Moderator 21 Ekim 2020 Çarşamba 16:53
Tüm Yanıtlar
-
-
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. -
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