2013-06-02 116 views
0

我已经设法通过VB.net从Excel表中获取数据到我的SQL SERVER表中,但每次运行查询(单击按钮)时,都会将相同的数据再次上传到我的表中。有没有办法只导入额外的数据? (在我的SQLSERVER表中,'Email'字段应该是唯一的)下面是我的代码:如何使用Excel表中的新数据更新sql server表?

感谢您的帮助!

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 
+0

您的EMAil字段是唯一索引还是主键? – Steve

回答

0

如果你的电子邮件字段仅仅是一个独特的指数,那么你可以更改属性

`Ignore Duplicate Key` 

,并为索引定义(SQL Management Studio中)在属性页上其值设置为是。
用这种方法,SqlBulkCopy会尝试添加,但是如果重复,记录将被丢弃而没有问题。此属性设置等同于INDEX_OPTION IGNORE_DUP_KEY = ON

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

+0

嗨史蒂夫,是的,它是一个独特的索引..我想创建一个过程,但如果有一个更简单的方法,我会去用它...将尝试你的忽略想法重复键。谢谢 ! –

0

你能不能只给excel添加一个名为UploadDate的列,所以在每次导入之后,你只需要在excel中更新这个列,而且你很好。

你必须更新你的SELECT查询到类似“SELECT * FROM [工作表Sheet1 $]其中UploadDate为空”

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

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

并立即执行这些。