Por que este DataAdapter não insere linhas no banco de dados?

Portanto, tenho uma situação em que estou usando um SqlDataAdapter para inserir linhas em uma tabela em um banco de dados do SQL Server 2014.

A fonte dos dados é uma planilha do Excel.

A inserção funciona bem quando o objeto DataTable é preenchido usando alguns loops For e .Columns.Add e .Rows.Add para copiar os dados da planilha do Excel. Este código de trabalho eu não incluí aqui.

No entanto, estou refatorando o código para usar um OleDbDataReader. Aqui está a minha função:

Private Function FillDataTable(path As String, name As String) As DataTable
        Dim fullpath As String = path
        Dim wsname As String = name
        Dim dt = New DataTable()
        Try
            Dim connectionstring As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & fullpath & "';Extended Properties= 'Excel 8.0;HDR=Yes;IMEX=1'"
            Dim commandstring As String = "Select * From " & wsname
            Using con As New OleDbConnection(connectionstring)
                Using cmd As New OleDbCommand(commandstring, con)
                    con.Open()
                    Using dr As OleDbDataReader = cmd.ExecuteReader()
                        With dt
                            For Each c In aryFieldList
                                .Columns.Add(c.FieldName, ConvertType(c.DataType))
                            Next

                            .Columns.Add("SubmID")
                            .Columns("SubmID").DefaultValue = 0

                            .Columns.Add("S_ORDER")
                            .Columns("S_ORDER").DefaultValue = 0

                            .Columns.Add("C_ORDER")
                            .Columns("C_ORDER").DefaultValue = 0
                        End With
                        dt.Load(dr)
                    End Using
                End Using
            End Using

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
        Return dt

    End Function

Quando depuro, o DataTable retornado da função possui dados no conjunto e, caso contrário, parece ser idêntico ao DataTable da versão anterior do código. Aqui está o código para atualizar o banco de dados. Este código éinalterado para os dois casos.

    Dim dt = New DataTable()
    dt = FillDataTable(fullpath, wsname)

Using cn = New SqlConnection(ConfigurationManager.ConnectionStrings("Connection").ConnectionString)
    cn.Open()
    Using adp = New SqlDataAdapter()
        Dim sb As New StringBuilder

        [...StringBuilder code to build the Insert command here...]

        Dim cmd As New SqlCommand(sb.ToString, cn)

        With adp
            .InsertCommand = cmd
            .InsertCommand.Parameters.Add("SubmID", SqlDbType.Int, 1, "SubmID")
            .InsertCommand.Parameters.Add("S_ORDER", SqlDbType.Int, 1, "S_ORDER")
            .InsertCommand.Parameters.Add("C_ORDER", SqlDbType.Int, 1, "C_ORDER")

            For Each p In aryFieldList
                If p.Excluded = False Then
                    .InsertCommand.Parameters.Add(p.FieldName, p.DataType, p.Length, p.FieldName)
                End If
            Next
                adp.Update(dt)

        End With 'adp
    End Using 'adp
End Using 'cn

Nenhuma exceção é lançada. A depuração da linha adp.Update (dt) não tem latência como se a consulta não fosse executada. Essa é a única diferença que noto entre a DT de linhas / colunas adicionadas e a DT preenchida com OleDB - Há um leve tempo de latência quando os dados são inseridos com êxito.

Estou faltando algum tipo de funcionalidade básica ou propriedade doDataTable ou talvez uma propriedade herdada ou criada durante o carregamento? É algo mais que eu não pensei? Por que meuSqlDataAdapter insira dados no banco de dados quando a fonte for umaDataTable criado manualmente versus umDataTable preenchido peloOleDbReader?

questionAnswers(1)

yourAnswerToTheQuestion