如何在导入大量数据时使用SqlBulkCopy来防止重复条目

本文关键字:SqlBulkCopy 导入 数据 | 更新日期: 2023-09-27 18:26:51

我想知道如何防止数据库表中的重复条目,以防该表已经有该字段的记录。

在我的表列名中:网站是唯一的列。我上传的excel文件可能与新数据有相同的记录,也可能是完全重复的,所以基于列名网站,我想防止输入重复的条目,然后输入另一个下一个记录,然后继续。

我希望它清楚,这是我的代码:

    protected void btnSend_Click(object sender, EventArgs e)
{
    //file upload path
    string path = fileuploadExcel.PostedFile.FileName;
    //Create connection string to Excel work book
    string excelConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='C:'File.xlsx';Extended Properties=Excel 12.0;Persist Security Info=False";
    //Create Connection to Excel work book
    OleDbConnection excelConnection = new OleDbConnection(excelConnectionString);
    //Create OleDbCommand to fetch data from Excel
    OleDbCommand cmd = new OleDbCommand("Select * from [Sheet1$]", excelConnection);
    excelConnection.Open();
    OleDbDataReader dReader;
    DataTable table = new DataTable();
    dReader = cmd.ExecuteReader();
    table.Load(dReader);
    SqlBulkCopy sqlBulk = new SqlBulkCopy(strConnection);
    //Give your Destination table name
    sqlBulk.DestinationTableName = "TableName";
    sqlBulk.WriteToServer(table);
    excelConnection.Close();
    int numberOfRowsInserted = table.Rows.Count;// <-- this is what was written.
    string message = string.Format("<script>alert({0});</script>", numberOfRowsInserted);
    ScriptManager.RegisterStartupScript(this, this.GetType(), "scr", message, false);
}

如何在导入大量数据时使用SqlBulkCopy来防止重复条目

修改您传递给OleDbCommand的查询以仅选择您需要的网站值如何?

如果整行重复,则可以使用distinct。有关示例,请参阅如何通过SQL选择唯一记录。

如果只有此列重复,而其他列不相关,则distinct可能不起作用(这取决于数据库),并且您必须使用GROUP BY并选择每个组的第一行。

您可以做的一件事是首先将它加载到一个没有限制的临时表中。然后,您可以删除所有与您的业务需求不匹配的记录(如重复密钥),并记录您删除了哪些记录以及删除原因(可选,但可能很有用)。最后,您可以将临时表插入/合并到最终表中。

或者,您可以将所有内容加载到临时表中,并将业务逻辑放入insert/merge语句中,只插入有效的记录。