У нас есть устаревшее приложение, которое сбрасывает большие объемы данных в файлы с разделителями табуляции. Каждый файл содержит один тип записи, а все поля фиксированной длины.Импорт данных с использованием SQLBulkCopy
Эти файлы могут быть легко импортированы в соответствующие таблицы в нашей базе данных SQL Server с использованием утилиты BCP из командной строки. У нас есть программа VB.Net, написанная на VS 2003, которая импортирует эти файлы с помощью процедуры SQLDMO.BulkCopy.
Мы обновляем систему для использования VS 2010 с SQL Server 2008 и согласно документации Microsoft SQLDMO больше недоступна.
Я искал в Интернете и переписал процедуру импорта для импорта файлов с разделителями табуляции в DataTable с использованием поставщика Microsoft.Jet.OLEDB.4.0. Объект SqlClient.BulkCopy затем используется для импорта этого DataTable. Эта проблема связана с тем, что поля в файле с разделителями табуляции, которые заданы в пробелы, обрабатываются как NULL при импорте в DataTable. Когда DataTable обрабатывается SqlClient.BulkCopy, копия завершается с ошибкой, потому что нулевые значения отклоняются полями таблицы SQL, которые определены как NOT NULL.
Код тестируется показан ниже
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim data As DataTable = RetrieveSourceData()
CopyData(data)
End Sub
Private Function RetrieveSourceData() As DataTable
Dim connstring As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\temp\;Extended Properties='text;HDR=No;FMT=TabDelimited'"
Dim sourcedata As New DataTable
Using conn As New OleDb.OleDbConnection(connstring)
conn.Open()
Dim command As New OleDb.OleDbCommand("Select * from X1.CSV", conn)
Dim adapter As New OleDb.OleDbDataAdapter(command)
adapter.Fill(sourcedata)
conn.Close()
End Using
Return sourcedata
End Function
Private Sub CopyData(SourceData As DataTable)
Dim dbConnString As String = "Data Source=(local);Initial Catalog=XtractDB;User ID=xxxx;Password=yyyy;"
Using bcp As New SqlClient.SqlBulkCopy(dbConnString)
bcp.DestinationTableName = "X1"
bcp.BatchSize = 1000
bcp.WriteToServer(SourceData)
End Using
End Sub
Для того, чтобы входной файл, чтобы быть признанным в качестве TabDelimited мне пришлось создать Schema.ini файл в том же каталоге, что и входной файл. Содержание приведены ниже
[X1.CSV]
Format=TabDelimited
Есть ли способ, что я могу заставить поля с пробелами не должны рассматриваться как NULL при создании DataTable?
Это лучший подход для обработки массовой копии через программу VB.Net?
ТИА,
Энди
Сохранить в: По умолчанию
Переключить цвет темы
Выберите цвет фона сообщение ...
Выбор ширины область сообщений ...
Настройка текстового сообщения шрифта размер ...
Отключить авто ссылки Включить аббревиатуры Отключить заголовок сообщенияEnable Auto цитату обновить название этой нити ... SQL Bulk Copy Thread # 1544244 Сообщение # 1544244
Мне удалось запустить эту работу, как было запланировано, путем загрузки DataTable в RetrieveSourceData с использованием средства чтения потока, а не с помощью OleDb. – Andy