如何修改C#代码实现Excel到SQL数据库的去重数据导入?
Excel导入SQL去重方案
原代码的问题在于直接批量插入所有行,未做重复校验,同时存在连接管理不规范、空值未处理的问题,以下是修改后的完整代码及说明:
修改后的代码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Data.OleDb; using System.Data.SqlClient; using System.IO; using System.Net; using System.Net.Sockets; using System.Data.SqlTypes; namespace bu_sefer_kesin_olacak { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void button2_Click(object sender, EventArgs e) { OpenFileDialog a = new OpenFileDialog(); a.Filter = "Excel Dosyası |*.xlsx| Excel Dosyası |*.xls"; a.Title = "Ürün Dosyasını Seçiniz"; if (a.ShowDialog() == DialogResult.OK) { // 注意:如果Excel有表头,把HDR=False改成HDR=True,这样DataTable会用表头作为列名 OleDbConnection baglan; baglan = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + a.FileName + "; Extended Properties='Excel 8.0;HDR=False;'"); baglan.Open(); OleDbDataAdapter adap = new OleDbDataAdapter("Select * from [Sheet_0$]", baglan); DataTable dt = new DataTable(); adap.Fill(dt); dataGridView1.DataSource = dt; baglan.Close(); } } private void button1_Click(object sender, EventArgs e) { string BaglantiAdresi = "Server=.;Database=test;User Id=stajyer_sql;Password=123456;"; // 用using块自动管理连接,避免资源泄漏 using (SqlConnection baglan2 = new SqlConnection(BaglantiAdresi)) { baglan2.Open(); foreach (DataGridViewRow row in dataGridView1.Rows) { // 跳过DataGridView的空行 if (row.IsNewRow) continue; // 获取唯一标识(假设Bildirim_no是唯一键,可根据实际表结构调整) string bildirimNo = row.Cells["Bildirim_no"].Value?.ToString() ?? string.Empty; if(string.IsNullOrEmpty(bildirimNo)) continue; // 先检查该数据是否已存在 SqlCommand checkCmd = new SqlCommand("SELECT COUNT(1) FROM bu_sefer_kesin_olacak3 WHERE Bildirim_no = @Bildirim_no", baglan2); checkCmd.Parameters.AddWithValue("@Bildirim_no", bildirimNo); int count = (int)checkCmd.ExecuteScalar(); if(count == 0) { // 不存在则执行插入 SqlCommand cmd2 = new SqlCommand(@"Insert into bu_sefer_kesin_olacak3(Onay_durumu,Kategori,Kapatildigi_zaman,Olusturuldugu_zaman,Departman,Aciklama,Bildirim_no,Sure_sonu,Ilk_Cevap_Verildigi_Zaman_Saat,Ilk_Yanit_Durumu,Initial_Response_Time,Grup,Harici_sistem_ticket_no,Etki,Oyuncu_etkilesimi,Oge,Temsilci_etkilisimleri,Oncelik,Talep_sahibi_eposta_adresi,Talep_sahibi_adi,Cozumleme_durumu,Cozuldugu_zaman_saat,Cozuldugu_zaman,Temsilci,Kaynak,Durum,Alt_kategori,Konu,Anket_sonuclari,Etiketler,Tur,Zaman_kaydedildi,Tip,En_son_guncellendigi_zaman,Aciliyet,Cozum_ureten) Values(@Onay_durumu,@Kategori,@Kapatildigi_zaman,@Olusturuldugu_zaman,@Departman,@Aciklama,@Bildirim_no,@Sure_sonu,@Ilk_Cevap_Verildigi_Zaman_Saat,@Ilk_Yanit_Durumu,@Initial_Response_Time,@Grup,@Harici_sistem_ticket_no,@Etki,@Oyuncu_etkilesimi,@Oge,@Temsilci_etkilisimleri,@Oncelik,@Talep_sahibi_eposta_adresi,@Talep_sahibi_adi,@Cozumleme_durumu,@Cozuldugu_zaman_saat,@Cozuldugu_zaman,@Temsilci,@Kaynak,@Durum,@Alt_kategori,@Konu,@Anket_sonuclari,@Etiketler,@Tur,@Zaman_kaydedildi,@Tip,@En_son_guncellendigi_zaman,@Aciliyet,@Cozum_ureten)", baglan2); // 处理空值,避免ToString()引发空引用异常 cmd2.Parameters.AddWithValue("@Onay_durumu", row.Cells["Onay_durumu"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Kategori", row.Cells["Kategori"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Kapatildigi_zaman", row.Cells["Kapatildigi_zaman"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Olusturuldugu_zaman", row.Cells["Olusturuldugu_zaman"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Departman", row.Cells["Departman"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Aciklama", row.Cells["Aciklama"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Bildirim_no", bildirimNo); cmd2.Parameters.AddWithValue("@Sure_sonu", row.Cells["Sure_sonu"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Ilk_Cevap_Verildigi_Zaman_Saat", row.Cells["Ilk_Cevap_Verildigi_Zaman_Saat"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Ilk_Yanit_Durumu", row.Cells["Ilk_Yanit_Durumu"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Initial_Response_Time", row.Cells["Initial_Response_Time"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Grup", row.Cells["Grup"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Harici_sistem_ticket_no", row.Cells["Harici_sistem_ticket_no"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Etki", row.Cells["Etki"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Oyuncu_etkilesimi", row.Cells["Oyuncu_etkilesimi"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Oge", row.Cells["Oge"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Temsilci_etkilisimleri", row.Cells["Temsilci_etkilisimleri"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Oncelik", row.Cells["Oncelik"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Talep_sahibi_eposta_adresi", row.Cells["Talep_sahibi_eposta_adresi"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Talep_sahibi_adi", row.Cells["Talep_sahibi_adi"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Cozumleme_durumu", row.Cells["Cozumleme_durumu"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Cozuldugu_zaman_saat", row.Cells["Cozuldugu_zaman_saat"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Cozuldugu_zaman", row.Cells["Cozuldugu_zaman"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Temsilci", row.Cells["Temsilci"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Kaynak", row.Cells["Kaynak"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Durum", row.Cells["Durum"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Alt_kategori", row.Cells["Alt_kategori"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Konu", row.Cells["Konu"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Anket_sonuclari", row.Cells["Anket_sonuclari"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Etiketler", row.Cells["Etiketler"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Tur", row.Cells["Tur"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Zaman_kaydedildi", row.Cells["Zaman_kaydedildi"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Tip", row.Cells["Tip"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@En_son_guncellendigi_zaman", row.Cells["En_son_guncellendigi_zaman"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Aciliyet", row.Cells["Aciliyet"].Value?.ToString() ?? DBNull.Value); cmd2.Parameters.AddWithValue("@Cozum_ureten", row.Cells["Cozum_ureten"].Value?.ToString() ?? DBNull.Value); cmd2.ExecuteNonQuery(); } } MessageBox.Show("Aktarıldı"); } } } }
关键修改说明
- 重复校验:通过
SELECT COUNT(1)检查Bildirim_no(假设为唯一标识)是否已存在,仅插入不存在的数据。如果你的表有其他唯一键或组合键,可修改WHERE条件适配。 - 连接优化:使用
using块管理SQL连接,自动释放资源;且仅打开一次连接,循环内复用,大幅提升效率。 - 空值处理:用
?.ToString() ?? DBNull.Value处理单元格空值,避免空引用异常,同时符合SQL的空值规范。 - 跳过空行:判断
row.IsNewRow跳过DataGridView自动生成的空行。
内容的提问来源于stack exchange,提问作者Aisoh
相关产品推荐
相关产品推荐

