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
?