без изменений. Это очень полезно для переноса данных из одного хранилища данных в другое:
му у меня есть ситуация, когда я использую SqlDataAdapter для вставки строк в таблицу в базе данных SQL Server 2014.
Источником данных является электронная таблица 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, добавленным в строки / столбцы, и DT, заполненным OleDB. Существует небольшая задержка, когда данные вставляются успешно.
Я пропускаю какую-то базовую функциональность или свойствоDataTable
или, может быть, свойство, унаследованное или созданное во время загрузки? Это что-то еще, о чем я не думал? Почему мойSqlDataAdapter
вставить данные в базу данных, когда источником являетсяDataTable
создан вручную по сравнению сDataTable
заполненыOleDbReader
?