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

时间:2013-08-07 07:45:20

标签: c# asp.net sql

我想知道如果表已经有该字段的记录,如何防止重复输入数据库表。

在我的表格列名中:网站是唯一列。我上传的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);
}

2 个答案:

答案 0 :(得分:1)

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

如果整行是重复的 - 您可以使用distinct。有关示例,请参阅How to select unique records by SQL

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

答案 1 :(得分:0)

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

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