从 excel 导入数据时防止 SQL Server 2008 中的行重复

Posted

技术标签:

【中文标题】从 excel 导入数据时防止 SQL Server 2008 中的行重复【英文标题】:Prevent duplication of row in SQL Server 2008 when importing data from excel 【发布时间】:2015-02-27 12:26:28 【问题描述】:

我正在将数据从 Excel 导入 SQL Server 2008 数据库,并且我成功地做到了。在从 Excel 插入特定行之前,有什么方法可以检查当前行是否存在于数据库中?

这是我用来从 excel 导入数据的代码

<pre lang="c#">
con.Open();
if (FileUpload1.HasFile)
        
            string path = FileUpload1.PostedFile.FileName;
            string saveFolder = @"E:\"+""+path+""; //Pick a folder on your machine to store the uploaded files
            FileUpload1.SaveAs(saveFolder);
            String excelConnString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + saveFolder + ";Extended Properties=Excel 12.0;");
            OleDbConnection excelConnection = new OleDbConnection(excelConnString);
            OleDbCommand cmd = new OleDbCommand("Select * from [Sheet1$]", excelConnection);
            excelConnection.Open();
            OleDbDataReader dReader;
            dReader = cmd.ExecuteReader();
            SqlBulkCopy sqlBulk = new SqlBulkCopy(con);
            sqlBulk.DestinationTableName = "Course_Data";
            sqlBulk.WriteToServer(dReader);
            excelConnection.Close();
            con.Close();
            Response.Write("<Script> alert('File Uploaded Successfully');</Script>");
        
        else
        
            Response.Write("<Script> alert('First select the file which you need to upload.');</Script>");
        
con.Close();
</pre>

谢谢。

【问题讨论】:

批量插入是将文件数据导入数据库的最快方法,但是您可以将批量插入到 临时 表中,然后调用处理数据的存储过程该表(检查重复等)并将其移动到最终目的地。 【参考方案1】:

您可以使用 SQL Server INSTEAD OF 触发器: 确保使用设置为 yes 的 HDR 来获取标题作为 excel 连接字符串中的列名

String excelConnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + saveFolder + ";Extended Properties=Excel 12.0;HDR=YES;"

或者您需要将下面的列替换为 index(F$) 将 $ 替换为您要比较的 excel 列的索引

IE:您通过 course_name 字段验证插入

CREATE TRIGGER IO_Trig_INS_CourseData on Course_Data
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON
-- Check for duplicate Course_name. If there is no duplicate, do an insert.
IF (NOT EXISTS (SELECT C.ID
      FROM Course_Data C, inserted I
      WHERE P.Course_Name = I.Course_Name ))
   INSERT INTO Course_Data 
      SELECT *
      FROM inserted
END

【讨论】:

【参考方案2】:

您可以将数据复制到DataTable 并过滤掉重复项,然后将数据插入数据库。

参见here如何将数据从DataReader加载到DataTable

请参阅here 如何使用Comparer 删除重复项

【讨论】:

以上是关于从 excel 导入数据时防止 SQL Server 2008 中的行重复的主要内容,如果未能解决你的问题,请参考以下文章

使用导入导出向导将数据从 Excel 导入 Sql Server 时,如何更改列的默认 varchar 255?

从 Excel 到 SQL Server 的数据导入无法导入所有数据

使用c#导入excel文档时如何防止前导零被剥离

在 SQL Server 2008 中将数据从浮点类型的 Excel 导入 varchar

通过 Oledb c# 防止重复数据从 Excel 到 db

将数据从excel导入sql返回NULL