2009-11-21 6 views
0

J'ai un code VB.NET qui crée une instance TransactionScope:instanciation TransactionScope retourne null

LoggingUtility.LogDebug("UpdateCallTable", "SatComCallDataImporter", "About to associate call data with contracts") 
Using ts = New TransactionScope() 
    LoggingUtility.LogDebug("UpdateCallTable", "SatComCallDataImporter", "Getting all unimported SatCom calls") 

Mon application jette une exception sur l'appel à la création d'une nouvelle TransactionScope, avec « référence d'objet non définie à une instance d'un objet. ". L'exception n'est pas lancée sur ma machine de développement ou sur ma machine de test. seulement sur la machine de production des clients, et je ne sais pas pourquoi. J'ai placé des lignes de débogage immédiatement avant et après cette ligne, donc je suis certain que c'est cette ligne qui cause le problème. A ont utilisé TransactionScopes dans toute l'application et c'est le seul endroit qui lève l'exception sur la machine client. "A propos d'associer des données d'appel à des contrats" est écrit dans le journal et l'entrée de journal suivante est la "Référence d'objet non définie sur une instance d'un objet".

Le code fonctionne correctement si je le retire d'une transaction. J'ai lutté avec cela pendant 4 jours maintenant et n'ai pas eu plus près.

+0

Silly moi. L'erreur a été l'annulation de la transaction, donc bien sûr, mes journaux de débogage n'étaient pas écrits (dans la base de données). La cause réelle était une différence entre la spécification d'importation et les données en cours d'importation. Un champ qui n'aurait jamais dû être nul était en fait nul. Je ne l'ai jamais pris en compte parce que j'avais un fichier de spécifications avec lequel tester, et pas de vraies données. Cela semble trop évident maintenant. –

+0

ARgg, fait celui-là. C'est encore mieux si vous essayez de mettre un peu de logique dans "si avorté faire ceci" et vous finissez par sauvegarder le tout. FYI Nouveau TransactionScope (TransactionScopeOption.Supress) vous permettra de faire des choses à un DB en dehors de la transaction en cours. – Spence

Répondre

1

Vous avez peut-être un problème avec MSDTC?

Je pencherais plutôt vers une erreur de codage, car l'objet TransactionScope devrait être initialisé et non nul, mais il indiquera une erreur.

Peut-être que l'affichage de ce code pourrait nous aider? MISE À JOUR: J'ai eu de l'expérience avec les moteurs de journalisation qui n'arrivaient pas à enregistrer la ligne avant une exception, parfois provoquée par le réapprovisionnement en mode édition, ou la routine ne se viderait pas activement.

Je suggère de placer une ligne de journalisation directement après avoir utilisé l'instruction() pour affirmer que TransactionScope n'est pas null. Étant donné la façon dont vous avez utilisé le code, il est IMPOSSIBLE que le résultat de ce code renvoie null, le constructeur doit lancer une exception si le constructeur échoue, sinon vous avez une portée de transaction non nulle.

Peut-être un peu plus de code et ce test pourrait vous aider?

+0

Heureux d'afficher le code si cela aide, mais c'est la ligne de code qui échoue. Les lignes environnantes sont des lignes de débogage. J'ai vérifié les paramètres MSDTC sur toutes les machines et ils sont identiques. –

+0

Mis à jour ma réponse – Spence

+0

En fait mettre dans une ligne qui indique If IsNothing (ts) puis lancer une nouvelle NullReferenceException() Ajouter un essai attraper autour de lui aussi! – Spence

Questions connexes