Импорт данных Excel в таблицу SQL Server с использованием приложения VB.Net - PullRequest
0 голосов
/ 22 мая 2019

Я нашел несколько статей на эту тему, но проблемы разные. Я пытаюсь импортировать данные из файла Excel 2016 в SQL Server 2017 с помощью приложения VB.net, чтобы конечным пользователям не нужно было устанавливать SQL Server на своих компьютерах. Я запустил приложение в режиме отладки, чтобы определить проблему.

Я снова читаю статьи о различных случаях, связанных со следующей ошибкой:

Поставщик «Microsoft.ACE.OLEDB.15.0» не зарегистрирован на локальном компьютере

Мой код:

Dim TheData As DataTable = GetExcelData(OpenFileDialog1)

Private Function GetExcelData(File As OpenFileDialog) As DataTable
    Dim oleDbConnection As New OleDbConnection

    Try
        OpenOLEDBConnections(oleDbConnection, "Provider=Microsoft.ACE.OLEDB.15.0;Data Source=" & File.InitialDirectory & _
        File.FileName & "; ;Extended Properties=""Excel 12.0 XML;HDR=YES;""")

        Dim oleDbDataAdapter As OleDbDataAdapter = New OleDbDataAdapter("Select '' as ID, 'AL' as Supplier, LTRIM(RTRIM(GRADE)) AS GRADE, [ship date] as shipdate, LTRIM(RTRIM(coil)) AS coil, L15*1000 AS L15, H15*1000 AS H15 FROM [sheet1$] where COIL is not null group by GRADE, [SHIP DATE], COIL, L15, H15", oleDbConnection)
        Dim dataTable As DataTable = New DataTable()
        oleDbDataAdapter.Fill(dataTable)
        oleDbConnection.Close()

        Return dataTable
    Catch ex As Exception
        oleDbConnection.Close()

        Return Nothing
    End Try

End Function

Private Sub OpenOLEDBConnections(ByRef cnData As OleDbConnection, cnDataConstr As String)

    If Not cnData.State = ConnectionState.Closed Then cnData.Close()
    If cnData.State = ConnectionState.Closed Then
        cnData.ConnectionString = cnDataConstr
        cnData.Open()
    End If

End Sub

enter image description here

Ответы [ 3 ]

0 голосов
/ 22 мая 2019

Попробуйте установить поставщика ACE по следующей ссылке

https://www.microsoft.com/en-us/download/confirmation.aspx?id=13255

Как импортировать Excel в SQL Server, ознакомьтесь с

https://www.red -gate.com / простой разговор / DotNet / с-программирование / офис-развитие-в-визуальной студии /

Или попробуйте использовать этот фрагмент

Imports System
Imports System.Collections.Generic
Imports System.Data
Imports System.Data.OleDb
Imports System.Data.SqlClient
Imports System.Runtime.InteropServices
Imports Excel = Microsoft.Office.Interop.Excel


Public Module Program
    Public Sub Main()
        Dim officeType = Type.GetTypeFromProgID("Excel.Application")

        If officeType Is Nothing Then
            Console.WriteLine("Sorry, Excel must be installed!")
            Console.WriteLine("Press any key to exit")
            Console.ReadLine()
            Return
        End If

        Const fileToRead As String = "C:\TMP\FirstTest.xlsx"
        Dim xlApp As Excel.Application = Nothing
        Dim workbooks As Excel.Workbooks = Nothing
        Dim xlWorkBook As Excel.Workbook = Nothing
        Dim sheets As Excel.Sheets = Nothing
        Dim t1 As Excel.Worksheet = Nothing

        Try
            xlApp = New Excel.Application()
            Console.WriteLine($"Trying to open file {fileToRead}")
            workbooks = xlApp.Workbooks
            xlWorkBook = workbooks.Open(fileToRead, 0, True, 5, "", "", True, Origin:=Excel.XlPlatform.xlWindows, Delimiter:=vbTab, Editable:=False, Notify:=False, Converter:=0, AddToMru:=True, Local:=1, CorruptLoad:=0)
            sheets = xlApp.ActiveWorkbook.Sheets
            Dim dic = New List(Of String)()

            For Each mSheet In sheets

                dic.Add($"[{t1.Name}$]")
            Next

            Using myConnection = New OleDbConnection($"Provider=Microsoft.Ace.OLEDB.12.0;Data Source={fileToRead};Extended Properties='Excel 12.0 Xml;HDR = YES;'")

                Using dtSet = New DataSet()

                    For Each s In dic
                        Console.WriteLine($" Processing {s} table")
                        Dim myCommand = New OleDbDataAdapter($"select * from {s};", myConnection)
                        myCommand.TableMappings.Add("Table", s)
                        myCommand.Fill(dtSet)
                    Next

                    For Each t As DataTable In dtSet.Tables
                        Console.WriteLine($" Table {t.TableName} has {t.Rows.Count} records")
                    Next
                End Using
            End Using

            dic = Nothing
            Console.WriteLine("Successfully imported!")
            Console.WriteLine("After closing Console Windows start Task Manager and be sure that Excel instance is not there!")
            Console.WriteLine("Press any key to exit")
            Console.ReadLine()
        Catch e As Exception
            Console.WriteLine($"Error importing from Excel : {e.Message}")
            Console.ReadLine()
        Finally
            GC.Collect()
            GC.WaitForPendingFinalizers()

            If sheets IsNot Nothing Then
                Marshal.FinalReleaseComObject(sheets)
                sheets = Nothing
            End If

            xlWorkBook.Close()

            If xlWorkBook IsNot Nothing Then
                Marshal.FinalReleaseComObject(xlWorkBook)
                xlWorkBook = Nothing
            End If

            xlApp.Quit()

            If xlApp IsNot Nothing Then
                Marshal.FinalReleaseComObject(xlApp)
                xlApp = Nothing
            End If

            GC.Collect()
            GC.WaitForPendingFinalizers()
        End Try
    End Sub


End Module
0 голосов
/ 23 мая 2019

После того, как я провел полтора дня, мне каким-то образом удалось решить проблему, перейдя по следующей ссылке и попробовав опцию, упомянутую Manju K Gowda Понедельник, 14 мая 2012 г. 12:14 Microsoft.ACE.OLEDB.15.0 , а также изменил мой поставщик строки подключения с OLEDB 15.0 до 12.0.

Если быть точным, при построении решения в режиме отладки или выпуска сохраните Configuration Manager для x86 вместо AnyCPU

enter image description here

0 голосов
/ 22 мая 2019

Не то чтобы это серебряная пуля, но мне не нравится внешний вид вашей строки подключения. Там, кажется, ";" не к месту. Попробуйте это

Dim XLSFile As String = "C:\DATA\test.xlsx"
Dim connstring As String = "Provider=Microsoft.ACE.OLEDB.12.0;" &
    "Data Source=" & XLSFile & ";Extended Properties=""Excel 12.0 Xml;HDR=YES;"""
...