그래서 SQL Server 2014 데이터베이스의 테이블에 행을 삽입하기 위해 SqlDataAdapter를 사용하고 있습니다.이 DataAdapter가 데이터베이스에 행을 삽입하지 않는 이유는 무엇입니까?
데이터 원본은 Excel 스프레드 시트입니다.
DataTable 개체를 몇 개의 For 루프를 사용하여 채우고 .Columns.Add 및 .Rows.Add를 사용하여 Excel 시트의 데이터를 복사하면 삽입이 제대로 작동합니다. 이 작업 코드는 여기에 포함되지 않았습니다.
그러나 OleDbDataReader를 사용하도록 코드를 리팩토링하고 있습니다. 함수에서 반환
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
내가 디버깅
, DataTable의 집합에 데이터가, 그렇지 않으면 코드의 이전 버전에서의 DataTable에 동일하게 나타납니다 : 여기 내 기능입니다. 데이터베이스를 업데이트하는 코드는 다음과 같습니다. 이 코드는 모두 이고 두 경우 모두입니다.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
예외가 발생하지 않습니다. adp.Update (dt) 행을 디버깅하면 쿼리가 전혀 실행되지 않는 것처럼 지연 시간이 없습니다. 그것이 행/열 추가 DT와 OleDB 채워진 DT 사이에 통보하는 유일한 차이점입니다. 데이터가 성공적으로 삽입 될 때 약간의 지연 시간이 있습니다.
기본 기능이나 속성 중 일부가 누락 되었습니까? DataTable
속성이나 누락 된 속성이 상속되었거나 생성되지 않았습니까? 내가 생각하지 못했던 다른 것입니까? 내 SqlDataAdapter
은 DataTable
이 수동으로 생성되고 소스가 DataTable
일 때 OleDbReader
으로 채워지는 경우 데이터를 데이터베이스에 삽입하는 이유는 무엇입니까? 그들이 있기 때문에
앞에'DataTable' 각 행의'RowState'을 추적, 그래서 그들은 모두'Added' 때문에 수동으로 추가 루프 작동 : 이것은 또 다른 하나 개의 데이터 저장소에서 데이터를 마이그레이션하는 데 매우 유용하다. 다른 소스에서로드하면 추가되거나 새로 추가되지 않습니다. (그 코드를 통해 아직도 걸어 가고있다) – Plutonix
adp.update 대신 cmd.ExecuteNonQuery를 사용해 보셨습니까? – Benno
dataadapter를 사용하여 테이블을 채우는 경우'myDA.AcceptChangesDuringFill = False'를 사용하여 행 상태 플래그가 지워지지 않도록 – Plutonix