You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 04:15:37