2010-07-28 16 views
4

J'ai du code qui utilise SqlBulkCopy. Et maintenant, nous réorganisons notre code pour utiliser les fonctions de base de données de la bibliothèque d'entreprise au lieu des fonctions standard. La question est comment puis-je instancier SqlBulkCopy? Il accepte SqlConnection, et je n'ai que DbConnection.Comment faire fonctionner SqlBulkCopy avec MS Enterprise Library?

var bulkCopy = new SqlBulkCopy(connection) // here connection is SqlConnection 
{ 
    BatchSize = Settings.Default.BulkInsertBatchSize, 
    NotifyAfter = 200, 
    DestinationTableName = "Contacts" 
}; 

Répondre

7

vraiment facile, nous l'utilisons comme ça et il fonctionne parfaitement:

using (DbConnection connection = db.CreateConnection()) 
{ 
    connection.Open(); 
    //blah blah 

    //we use SqlBulkCopy that is not in the Microsoft Data Access Layer Block. 
    using (SqlBulkCopy copy = new SqlBulkCopy((SqlConnection) connection, SqlBulkCopyOptions.Default, null)) 
    { 
     //init & write blah blah 
    } 
} 

La solution est de lancer la connexion: (SqlConnection) connection

+1

Oh, c'est vraiment facile. J'y ai pensé, mais je n'ai pas essayé. Avez-vous essayé d'utiliser TransactionScope avec SqlBulkCopy? J'ai quelque chose comme: connexion à l'aide (nouvelle TransactionScope()) { en utilisant (connexion var = db.CreateConnection()) { en utilisant (var BULKCOPY = new SqlBulkCopy ((SqlConnection)) {/ * blabla * /}} } et il jette System.Transactions.TransactionManagerCommunicationException dire que MSDTC est éteint, bien que je l'ai allumé. – HiveHicks

+0

Non désolé. jamais utilisé TransactionScope. Nous utilisons le paramètre de transaction du paramètre SqlBulkCopy (la dernier paramètre du constructeur, 'null' dans l'exemple ci-dessus) –

+0

Si vous avez juste besoin d'une transaction pour le BulkCopy, vous pouvez chan ge le deuxième paramètre de 'SqlBulkCopyOptions.Default' à' SqlBulkCopyOptions.UseInternalTransaction'. Voir http://msdn.microsoft.com/en-us/library/tchktcdk%28VS.80%29.aspx –