У нас есть устаревшее приложение, которое сбрасывает большие объемы данных в файлы с разделителями табуляции. Каждый файл содержит один тип записи, а все поля фиксированной длины.
Эти файлы можно легко импортировать в соответствующие таблицы в нашей базе данных 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?
ТИА,
Энди
Сохранить в: По умолчанию
Переключить цветовую тему
Выберите цвет фона сообщения ...
Выберите ширину области сообщений ...
Настройка размера шрифта текстового сообщения ...
Отключить автоматические ссылки Включить аббревиатуры Отключить заголовок сообщения Включить автоматическую цитату Обновить заголовок этого потока ... SQL Bulk Copy Thread # 1544244 Сообщение # 1544244
SqlDMO устарел на сервере Sql 2012 года, но он доступен до версии Sqlserver 2008 R2. SqlBulkCopy доступен во всех инфраструктурах .net до 4.5, кроме 1.1.
Ссылка на эту ссылку для проверки
Вы можете использовать BULK INSERT (утилита командной строки) для вставки нескольких записей одновременно.
BULK
INSERT Tablename
FROM 'c:\csvtest.txt'
WITH
(
FIELDTERMINATOR = ','
,ROWTERMINATOR = '\n'
--,FIRSTROW = 2
--,MAXERRORS = 0
)
GO