Как использовать SqlBulkCopy со столбцами, допускающими значение NULL

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

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

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

Есть ли способ обойти это или лучшее решение для перемещения данных с полями, допускающими значение NULL?

//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 );

person Chad    schedule 23.10.2009    source источник


Ответы (3)


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

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

person Chad    schedule 23.11.2009

Он должен работать, если вы отметили значение NULL в соответствующем поле назначения.

person MkUltra    schedule 25.10.2009
comment
столбцы в базе данных помечены как допускающие значение NULL. Выше приведен код, выполняющийся в этой таблице. - person Chad; 28.10.2009

Проверка значений, допускающих значение NULL, будет решена во много раз. Но у меня все еще были проблемы со значениями DateTime, которые не могут быть нулевыми в базе данных. Мой источник - CSV, поэтому значения могут быть нулевыми. Установка нулевых значений для DateTime.MinValue не была решением из-за разницы значений C # datetime min и значений Sql min.

Установив для столбцов назначения значение DateTime2, все проблемы с столбцами DateTime были решены. Другие столбцы (например, int) могут иметь значение NULL без проблем.

person Dennis Coppens    schedule 13.02.2020