Tâche de script SSIS inscrite dans la transaction en cours

c# script-task sqlbulkcopy ssis

Question

J'ai un paquet dans SSIS avec la tâche multiple. Je charge un fichier, si la tâche du système de fichiers à la fin échoue, je veux pouvoir annuler la transaction. Mon paquetage ressemble à ça. general_package J'aime pouvoir annuler toutes les opérations que le script SSIS a été effectuées. Pour ce faire, j'ai besoin du script SSIS à inscrire dans la transaction créée par la tâche BEGIN_TRANSACTION SQL.

En ssis pour rassembler la transaction je fais:

 object rawConnection = Dts.Connections["destination_ado"].AcquireConnection(Dts.Transaction);
             myADONETConnection = (SqlConnection)rawConnection;

Ensuite, je fais un BulkCopy:

using (SqlBulkCopy sbc = new SqlBulkCopy(myADONETConnection))
                    {
                        sbc.DestinationTableName = "[" + SCHEMA_DESTINATION + "].[" + TABLE_DESTINATION + "]";
                        //  sbc.DestinationTableName = "test_load";
                        // Number of records to be processed in one go
                        sbc.BatchSize = 10000;


                        // Finally write to server
                        sbc.WriteToServer(destination);
                    }
                    myADONETConnection.Close();

Comment dire à SqlBulkCopy d'utiliser la transaction existante? Dans les options de connexion dans SSIS, utilisez RetainSameConnection: true

Merci pour toutes vos pensées

Vincent

Réponse populaire

J'ai donc trouvé une solution. Sur le premier bloc de script (extraire et charger), je crée une transaction avec ce code:

SqlTransaction tran = myADONETConnection.BeginTransaction(IsolationLevel.ReadCommitted);

Ensuite, j'utilise cette transaction dans SqlBulkCopy de cette façon:

using (SqlBulkCopy sbc = new SqlBulkCopy(myADONETConnection,SqlBulkCopyOptions.Default,tran))

Passez l'objet de transaction à une variable SSIS:

Dts.Variables["User::transaction_object"].Value = tran;

Ensuite, sur mes deux blocs, à la fin de la transaction de validation et de la transaction Rolloback, j’utilise le script SSIS, lit la variable et valide ou annule la transaction:

SqlTransaction tran = (SqlTransaction)Dts.Variables["User::transaction_object"].Value;
tran.Commit();

En conséquence, si un fichier ne peut pas être déplacé vers le dossier Archive, je ne suis pas chargé deux fois, une transaction est déclenchée pour chaque fichier. Par conséquent, si un fichier ne peut pas contenir plus de données, seules les données relatives à ce fichier sont restaurées et l'énumérateur continue aller à la suivante.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi