从 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 的数据导入无法导入所有数据
在 SQL Server 2008 中将数据从浮点类型的 Excel 导入 varchar