我已经设法通过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
答案 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,...)
立刻执行这些。