如何使用Excel工作表中的新数据更新sql server表?

时间:2013-06-02 21:40:01

标签: sql sql-server vb.net

我已经设法通过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

2 个答案:

答案 0 :(得分:0)

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

`Ignore Duplicate Key` 

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

等效

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

答案 1 :(得分: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,...)

立刻执行这些。