0

我已经设法通过 VB.net 从 Excel 表中获取数据到我的 SQL SERVER 表中,但是每次运行查询(单击按钮)时,相同的数据都会再次上传到我的表中。有没有办法只导入附加数据?(列“电子邮件”在我的 SQLSERVER 表中应该是唯一的)下面是我的代码:

谢谢您的帮助 !

 Dim ExcelConnection As New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Excel.xlsm;Extended Properties=""Excel 12.0 Macro;HDR=No""")
        ExcelConnection.Open()

        Dim expr As String = "SELECT * FROM [Sheet1$]"

        Dim objCmdSelect As OleDb.OleDbCommand = New OleDb.OleDbCommand(expr, ExcelConnection)
        Dim objDR As OleDb.OleDbDataReader

        Dim SQLconn As New SqlConnection()
        Dim ConnString As String = "Data Source=USER\SQLEXPRESS;Initial Catalog=DBName;Integrated Security=SSPI"
        SQLconn.ConnectionString = ConnString
        SQLconn.Open()


        Using bulkCopy As SqlBulkCopy = New SqlBulkCopy(SQLconn)
            bulkCopy.DestinationTableName = "TableName"

            Try
                objDR = objCmdSelect.ExecuteReader
                bulkCopy.WriteToServer(objDR)
                objDR.Close()
                SQLconn.Close()

            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
        End Using
4

2 回答 2

0

如果您的电子邮件字段只是一个唯一索引,那么您可以更改属性

`Ignore Duplicate Key` 

并在索引定义 (Sql Management Studio) 的属性页上将其值设置为 Yes。
这样 SqlBulkCopy 将尝试添加,但如果出现重复记录将被丢弃而不会出现问题。此属性设置等同于INDEX_OPTION IGNORE_DUP_KEY = ON

另一种副作用较少但更复杂的选择是将您的值添加到临时表中并准备一个存储过程,将临时表中的记录复制到最后一个检查插入是否重复的存储过程。(这个我没试过)

于 2013-06-02T22:24:02.653 回答
0

您可以在 Excel 中添加另一个名为 UploadDate 的列,因此每次导入后,您只需在 excel 中更新此列,就可以了。

您必须将 SELECT 查询更新为“SELECT * FROM [Sheet1$] WHERE UploadDate is null”

如果您没有大量数据,那么您可能不需要使用批量导入。在这种情况下,您可以轻松生成如下所示的插入语句。

IF NOT EXISTS (SELECT * from tableName where email = @email)
    INSERT (column1, column2,...) values (val1, val2,...)

并立即执行这些。

于 2013-06-03T08:32:22.167 回答