Come utilizzare SqlBulkCopy con colonne nullable

nullable sql sqlbulkcopy sql-server

Domanda

Sto avendo un problema usando SqlBulkCopy quando sono coinvolte colonne nullable. Sembra che SqlBulkCopy non sappia come gestire le colonne nullable e genera un errore di dimensione non valido quando incontra una colonna di lunghezza zero. L'errore è "Ricevuta una lunghezza di colonna non valida dal client bcp ..."

Mi sto chiedendo quale sia la migliore pratica per affrontare questo. Questo sembra essere un buon post sul forum che descrive questo problema e come risolverlo per leggere un file CSV.

Penso che la mia situazione sia piuttosto generica e semplice. Ho bisogno di spostare una quantità sconosciuta di dati da una tabella di database ad un altro database. La risposta più semplice per me sarebbe quella di utilizzare SSIS / DTS o server collegati in SQL Server, tuttavia il cliente desidera che l'app esegua il movimento dei dati.

C'è un lavoro noto in giro per questa o una soluzione migliore per lo spostamento di dati con campi nullable?

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

Risposta accettata

La classe SqlBulkCopy non può gestire campi null. Non controlla se il campo è nullo prima di provare a calcolare la sua lunghezza. In questo modo si genera un errore.

Il post che ho citato nella domanda fa riferimento a un'implementazione di IDataReader che lancia DBNull.Value invece del solo valore null - questo aggira il difetto con SqlBulkCopy.


Risposta popolare

Dovrebbe funzionare se hai annullabile nel campo di destinazione in questione.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow