使用 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 表

vb.net怎么从DataSet中读取一行的数据

将数据从 Excel 复制到 SQL 数据库 VB.NET

将特定数据从excel导入到datagrid vb.net

从 Excel 到 vb.net Picturebox 的图像

如何使用 vb.net 保存 excel 文件?