Почему моя программа VB выдает исключение, жалующееся на то, что OleDbDataReader закрыт, когда он должен быть абсолютно открытым? - PullRequest
2 голосов
/ 21 февраля 2020

Я пытаюсь использовать OleDB и SQLBulkCopy для извлечения данных из электронной таблицы Excel в базу данных SQL. Когда я пытаюсь выполнить свой код, я получаю следующее исключение, которое вызывается параметром «bulkCopy.WriteToServer (objDR)» (которое также описано в заголовке вопроса): данные исключения

OleDB успешно читает лист Excel, который затем корректно заполняется в DataGridView, который я создал в WinForm для целей отладки.

Ниже приведен фрагмент соответствующего кода.

Dim ExcelConnection As New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\damon\Everyone\sheet1erictest.xlsx;Extended Properties=""Excel 12.0 Xml;HDR=Yes""")
    ExcelConnection.Open()
    Dim sheet As String = "Sheet5$"
    Dim expr As String = "SELECT * FROM [" + sheet + "]"

    Dim objCmdSelect As OleDbCommand = New OleDbCommand(expr, ExcelConnection)
    Dim objDR As OleDbDataReader

    Dim SQLconn As New SqlConnection()
    Dim ConnString As String = "SERVER=SqlDEV;DATABASE=Freight;Integrated Security=True"
    SQLconn.ConnectionString = ConnString
    SQLconn.Open()


    Using bulkCopy As SqlBulkCopy = New SqlBulkCopy(SQLconn)
        bulkCopy.DestinationTableName = "dbo.test"

        Try

            objDR = objCmdSelect.ExecuteReader

            Dim dt = New DataTable()
            dt.Load(objDR)
            DataGridView1.AutoGenerateColumns = True
            DataGridView1.DataSource = dt
            DataGridView1.Refresh()
            bulkCopy.WriteToServer(objDR)

            objDR.Close()
            SQLconn.Close()

        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Using
End Sub

1 Ответ

1 голос
/ 21 февраля 2020

Ваш объект чтения используется DataTable, поэтому закомментируйте эти строки и запустите их отдельно позже с новым экземпляром:

objDR = objCmdSelect.ExecuteReader

'Dim dt = New DataTable()
'dt.Load(objDR)
'DataGridView1.AutoGenerateColumns = True
'DataGridView1.DataSource = dt
'DataGridView1.Refresh()
bulkCopy.WriteToServer(objDR)
...