2017-09-21 15 views
2

그래서 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 속성이나 누락 된 속성이 상속되었거나 생성되지 않았습니까? 내가 생각하지 못했던 다른 것입니까? 내 SqlDataAdapterDataTable이 수동으로 생성되고 소스가 DataTable 일 때 OleDbReader으로 채워지는 경우 데이터를 데이터베이스에 삽입하는 이유는 무엇입니까? 그들이 있기 때문에

+1

앞에'DataTable' 각 행의'RowState'을 추적, 그래서 그들은 모두'Added' 때문에 수동으로 추가 루프 작동 : 이것은 또 다른 하나 개의 데이터 저장소에서 데이터를 마이그레이션하는 데 매우 유용하다. 다른 소스에서로드하면 추가되거나 새로 추가되지 않습니다. (그 코드를 통해 아직도 걸어 가고있다) – Plutonix

+0

adp.update 대신 cmd.ExecuteNonQuery를 사용해 보셨습니까? – Benno

+0

dataadapter를 사용하여 테이블을 채우는 경우'myDA.AcceptChangesDuringFill = False'를 사용하여 행 상태 플래그가 지워지지 않도록 – Plutonix

답변

2

DataTable 트랙의 행의 RowState, 그래서 수동 루프에 데이터를 추가하는 것은 작동 모든 Added (가 수동으로 DataTable을 만드는 아무 상관이 없다 - 그것 을). Excel과 같은 다른 소스에서로드 할 때 이 아니고이 추가/새로 추가되었습니다. 테이블을 채우기 위해 DataAdapter를 사용하는 경우

, 당신은 변경되지 않은에 RowState를 설정하지알 수 있습니다.

myDA.AcceptChangesDuringFill = False 
... 
rows = myDA.Fill(xlDT)