Cómo usar SqlBulkCopy con columnas anulables

nullable sql sqlbulkcopy sql-server

Pregunta

Estoy teniendo un problema con el uso de SqlBulkCopy cuando están involucradas las columnas anulables. Parece que SqlBulkCopy no sabe cómo tratar con columnas que admiten nulos y arroja un error de tamaño no válido cuando encuentra una columna de longitud cero. El error es "Se recibió una longitud de columna no válida del cliente bcp ..."

Me pregunto cuál es la mejor práctica para lidiar con esto. Esto parece ser una buena publicación en el foro que describe este problema y cómo resolverlo para leer un archivo csv.

Creo que mi situación es bastante típica y simple. Necesito mover una cantidad desconocida de datos de una tabla de base de datos a otra base de datos. La respuesta más simple para mí sería usar SSIS / DTS o servidores vinculados en un servidor SQL, sin embargo, el cliente desea que la aplicación realice el movimiento de datos.

¿Existe alguna solución conocida para esto o una mejor solución de vaporización para mover datos con campos que admiten nulos?

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

Respuesta aceptada

La clase SqlBulkCopy no puede hacer frente a los campos nulos. No comprueba si el campo es nulo antes de intentar calcular su longitud. Así tirando un error.

La publicación que cité en la pregunta hace referencia a una implementación de IDataReader que arroja DBNull.Value en lugar de solo el valor nulo; esto soluciona el defecto con SqlBulkCopy.


Respuesta popular

Debería funcionar si tiene nullable marcado en el campo de destino en cuestión.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué