2012-05-25 3 views
1

У нас есть устаревшее приложение, которое сбрасывает большие объемы данных в файлы с разделителями табуляции. Каждый файл содержит один тип записи, а все поля фиксированной длины.Импорт данных с использованием 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

+0

Мне удалось запустить эту работу, как было запланировано, путем загрузки DataTable в RetrieveSourceData с использованием средства чтения потока, а не с помощью OleDb. – Andy

ответ

0

Sqldmo осуждается в SQL Server 2012, но он доступен до SQLServer 2008 R2 версии. SqlBulkCopy доступен во всех инфраструктурах .net до 4.5, кроме 1.1.

Refer this link for verification

Вы можете использовать BULK INSERT (утилиты командной строки), чтобы вставить несколько записей одновременно.

BULK 
INSERT Tablename 
FROM 'c:\csvtest.txt' 
WITH 
(
    FIELDTERMINATOR = ',' 
    ,ROWTERMINATOR = '\n' 
    --,FIRSTROW = 2 
    --,MAXERRORS = 0 
) 
GO 
+0

Спасибо Ромиль - хочу использовать vb.чистая процедура как часть более крупного процесса, который предоставляет услуги ведения журнала и планирования. Также нужно избегать SqlDmo, если будет устаревшим. – Andy

Смежные вопросы