Как использовать SqlBulkCopy с обнуляемыми столбцами - PullRequest
2 голосов
/ 23 октября 2009

У меня проблема с использованием SqlBulkCopy, когда участвуют обнуляемые столбцы. Звучит так, как будто SqlBulkCopy не знает, как обращаться со столбцами, которые можно обнулять, и выдает ошибку недопустимого размера, когда встречается столбец нулевой длины. Ошибка: «Получена недопустимая длина столбца от клиента bcp ...»

Мне интересно, как лучше всего справляться с этим. Это , похоже, хороший пост на форуме, описывающий эту проблему и способы ее решения для чтения файла csv.

Я думаю, что моя ситуация довольно типична и проста. Мне нужно переместить неизвестное количество данных из одной таблицы базы данных в другую базу данных. Для меня более простым ответом было бы использовать SSIS / DTS или связанные серверы на сервере sql, однако клиент хочет, чтобы приложение выполняло перемещение данных.

Существует ли известное решение этой проблемы или лучшее решение для обработки паром для перемещения данных с обнуляемыми полями?

//access db
string src_db = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\SourceDB.mdb;Jet OLEDB ";
//sql db
string dest_db = @"Data Source=.\TEST;Initial Catalog=testdb;User Id=user;Password=password;";
string sql = "";
OleDbConnection sdb = new OleDbConnection( src_db );
OleDbCommand cmd = new OleDbCommand( sql, sdb );
OleDbDataReader rs = null;

SqlConnection db = new SqlConnection( dest_db );
SqlCommand clear = null;
SqlBulkCopy bulk_load = null;

// Read in the source table
sql = "select * from someTable";
sdb.Open();
cmd = new OleDbCommand( sql, sdb );
rs = cmd.ExecuteReader();

// Import into the destination table
bulk_load = new SqlBulkCopy( db );
bulk_load.DestinationTableName = "test";
bulk_load.WriteToServer( rs );

Ответы [ 2 ]

5 голосов
/ 23 ноября 2009

Класс SqlBulkCopy не может работать с пустыми полями. Он не проверяет, является ли поле пустым, прежде чем пытаться вычислить его длину. Таким образом выбрасывая ошибку.

Пост, который я цитировал в этом вопросе, ссылается на реализацию IDataReader, которая выдает DBNull.Value вместо просто нулевого значения - это работает вокруг дефекта с SqlBulkCopy.

0 голосов
/ 25 октября 2009

Это должно работать, если вы отметили nullable в поле назначения.

...