如何在导入大量数据时使用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);
}
修改您传递给OleDbCommand的查询以仅选择您需要的网站值如何?
如果整行重复,则可以使用distinct。有关示例,请参阅如何通过SQL选择唯一记录。
如果只有此列重复,而其他列不相关,则distinct可能不起作用(这取决于数据库),并且您必须使用GROUP BY并选择每个组的第一行。
您可以做的一件事是首先将它加载到一个没有限制的临时表中。然后,您可以删除所有与您的业务需求不匹配的记录(如重复密钥),并记录您删除了哪些记录以及删除原因(可选,但可能很有用)。最后,您可以将临时表插入/合并到最终表中。
或者,您可以将所有内容加载到临时表中,并将业务逻辑放入insert/merge语句中,只插入有效的记录。