使用 vb.net 从 excel 文件更新 SQL 表
Posted
技术标签:
【中文标题】使用 vb.net 从 excel 文件更新 SQL 表【英文标题】:Update SQL Table from excel file with vb.net 【发布时间】:2016-08-25 12:09:01 【问题描述】:我编写了一个小程序,它在输入中获取一个 .xlsx 文件(此文件会定期更新),并将数据提取到一个 sql 表中。 我想通过将 excel 文件的内容与 sql 表的内容进行比较来定期更新此 sql 表,并将所有新行(如果存在)插入其中。 我搜索了许多解决方案,但没有成功。 我该怎么办?
我的实际代码如下:
Dim ExcelConnection As New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & SourceFile & ";Extended Properties=""Excel 12.0 Xml;HDR=Yes""")
ExcelConnection.Open()
Dim RequeteExcelMat As String = "SELECT * FROM [feuil 1$]"
Dim objCmdSelect As OleDbCommand = New OleDbCommand(RequeteExcelMat, ExcelConnection)
Dim objDR As OleDbDataReader
Dim ConnexionBDDMat As New SqlConnection("SERVER=(local);DATABASE=MatStat;Trusted_Connection=True")
Try
ConnexionBDDMat.Open()
Catch ex As Exception
MsgBox(ex.Message)
End Try
Using bulkCopy As SqlBulkCopy = New SqlBulkCopy(ConnexionBDDMat)
bulkCopy.DestinationTableName = "dbo.Material"
'If SourceFile Content different from "Material" Sql Table Content Then
' Update "Material" Table by inserting the new rows from SourceFile
'Else
' MsgBox("Table is already updated")
'End If
Try
objDR = objCmdSelect.ExecuteReader
bulkCopy.WriteToServer(objDR)
objDR.Close()
ConnexionBDDMat.Close()
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Using
【问题讨论】:
【参考方案1】:我用它来处理一个小表来更新/插入数据从 Excel 到 SQL Server
Sub merge()
Dim CurConn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim SomeName As Worksheet
Dim Lastrow, Sql, n, i
Set SomeName = Sheets("SomeName")
Lastrow = SomeName.Range("B" & Rows.Count).End(xlUp).Row
For i = 2 To Lastrow
If i < Lastrow Then
Sql = Sql + "(" + CStr(SomeName.Range("A" & i).Value) + ", '" + SomeName.Range("B" & i).Value + "', '" + SomeName.Range("C" & i).Value + "', '" + SomeName.Range("D" & i).Value + "', '" + SomeName.Range("E" & i).Value + "', '" + SomeName.Range("F" & i).Value + "'),"
Else
Sql = Sql + "(" + CStr(SomeName.Range("A" & i).Value) + ", '" + SomeName.Range("B" & i).Value + "', '" + SomeName.Range("C" & i).Value + "', '" + SomeName.Range("D" & i).Value + "', '" + SomeName.Range("E" & i).Value + "', '" + SomeName.Range("F" & i).Value + "')"
End If
Next i
Set CurConn = New ADODB.Connection
CurConn.Open "Provider=SQLNCLI11;Server=SERVER\INSTANCE;Database=DATABASENAME;Trusted_Connection=yes;"
CurConn.CommandTimeout = 180
CurConn.CursorLocation = adUseClient
Sql = "MERGE [dbo].[SomeName] as target " _
& "USING (" _
& " SELECT [Userid]" _
& " ,[Login]" _
& " ,[name]" _
& " ,[org]" _
& " ,[pos]" _
& " ,[mail]" _
& " FROM (VALUES" _
& Sql _
& " ) as t([Userid],[Login],[name],[org],[pos],[mail])" _
& ") as source " _
& "ON target.[Userid] =source.[Userid] AND target.[Login] =source.[Login] " _
& "WHEN MATCHED THEN " _
& " UPDATE SET target.[name] =source.[name], " _
& " target.[org] =source.[org], " _
& " target.[pos] =source.[pos], " _
& " target.[mail] = Source.[mail] " _
& "WHEN NOT MATCHED THEN " _
& " INSERT ([Userid],[Login],[name],[org],[pos],[mail]) " _
& " VALUES (source.[Userid],source.[Login],source.[name],source.[org],source.[pos],source.[mail]); "
MsgBox ("Success!")
CurConn.Execute (Sql)
CurConn.Close
Set rst = Nothing
Set CurConn = Nothing
End Sub
将 Excel 表格转换为 VALUES (1,2,3,4,5,6),(7,8,9,10,11,12)..etc
很奇怪,但它工作正常。您可以采用此解决方案和 f.e.插入一些临时表,然后像上图那样合并它。
【讨论】:
【参考方案2】:使用相同的架构创建另一个名为 MaterialStaging 的表。批量插入此表而不是常规表。
然后,运行使用 MERGE 命令的存储过程来查找生产表和临时表之间的差异,并更新或插入差异。
【讨论】:
【参考方案3】:不要为此使用 VB。在 SQL Server 中执行此操作,并按照 Russ 的建议使用 MERGE 命令。
https://www.simple-talk.com/sql/learn-sql-server/the-merge-statement-in-sql-server-2008/
【讨论】:
以上是关于使用 vb.net 从 excel 文件更新 SQL 表的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 vb.net 中 excel 表中的数据更新 sql 表