2009-08-27 7 views
0

Je développe un module en DNN 4.9 pour importer des utilisateurs.Importer des utilisateurs DotNetNuke en utilisant des transactions avec des classes DNN

J'ai besoin de support de transaction mais je dois utiliser des classes DNN pour importer/créer des utilisateurs. Hors de la boîte les classes ne semblent pas soutenir les transactions.

J'utilise l'objet ci-dessous pour créer des utilisateurs:

UserController.CreateUser(ref UserInfo) ... 

Comme je l'amélioration d'un module existant et une réécriture complète/changement de la façon comment importer n'est pas une option. (Comme l'utilisation des instructions SQL directement pour créer des utilisateurs)

Répondre

0

Je ne suis pas un utilisateur DNN, mais whithin le contexte d'une transaction CLR toute opération de ADO.Net adhéreront automatiquement dans la transaction:

using(TransactionScope scope = new TransactionScope(
    TransactionScopeOption.Required)) 
{ 
     UserController.CreateUser(ref UserInfo) 
     ... 
     scope.Complete(); 
} 

À moins certains codes DNN explicitement désactive la portée de la transaction (en créant une nouvelle portée avec l'option Supress), puis le travail de base de données sera inscrit dans la transaction appropriée (par exemple, toute opération SqlClient sera inscrite dans une transaction SqlTransaction).

Mise à jour

champ d'opération est un objet de contexte qui est associé au thread courant. Une fois créés, les composants .Net qui vérifient son existence le trouveront et sauront qu'ils doivent participer à la transaction.

L'opération de fichier ne peut pas s'inscrire dans une étendue de transaction car le système de fichiers sous-jacent ne prend pas en charge les transactions (du moins jusqu'à Win7). Des composants tels que le fournisseur SQL Server, Oracle Provider, l'accesseur MSMQ et d'autres composants .Net prenant en charge les transactions démarrent une transaction et l'ajoutent à la portée actuelle. Lorsque la portée est 'complète', l'équivalent SqlTransaction est validé. Si la portée 'termine' (c'est-à-dire que sa méthode Dispose est appelée parce qu'elle atteint la fin du bloc using) mais qu'elle n'est pas 'complète', la transaction SqlTransaction est annulée.

Si plusieurs composants s'inscrivent dans une même étendue de transaction, ils feront partie d'une transaction distribuée. Cela peut arriver avec quelque chose d'aussi simple que d'utiliser deux connexions distinctes dans le cadre d'une transaction. L'ADO.Net les inscrira automatiquement dans un vrai distributed transaction.

+0

merci! Je sais quelque part à l'arrière de ma tête que cela existe. Pouvez-vous expliquer un peu plus en détail ce qu'est la portée? Est-ce que cela inclut des actions comme les opérations sur les fichiers? Comment puis-je vous donner la prime maintenant? – Johannes

+0

Voir mes mises à jour. La prime est récompensée par la réponse que vous avez choisie comme «acceptée». –