2010-09-08 14 views
1

J'essaie d'appeler la méthode ExecuteNonQuery() de deux objets différents de la classe OracleCommand. Les deux objets utilisent le même objet de connexion mais ont des commandText et des paramètres différents. J'utilise ODP.net, C# (framework .net 2.0) et Oracle 10g.Comment exécuter deux méthodes command.ExecuteNonQuery() en utilisant une connexion unique?

extrait de code est le suivant:

// OpenDatabaseConnection() methods checks and opens database connection 
bool connectionOpened = OpenDatabaseConnection(); 
if (connectionOpened) 
{ 
    command.ExecuteNonQuery(); 
    commitCommand.ExecuteNonQuery(); 
} 

Avant d'exécuter deux déclarations ci-dessus, je vérifie si la connexion est ouverte ou not.If son pas ouvert, je suis connexion d'ouverture. Mon problème est, après command.ExecuteNonQuery(); est exécuté, la connexion se ferme et je reçois une exception de «Connexion doit être ouverte pour effectuer cette opération» lorsque le contrôle tente d'exécuter la deuxième instruction. Pourquoi la connexion se ferme-t-elle automatiquement après l'exécution de la méthode ExecuteNonQuery()?

Quelqu'un peut-il s'il vous plaît me dire comment faire face à cette situation? Dans le deuxième objet de commande, j'essaie juste de valider les modifications, rien d'autre. Comment valider les modifications sans utiliser de transactions?

Merci à l'avance

**

EDIT

** Je voulais juste savoir, quelle est la meilleure pratique pour ouvrir et fermer la connexion? Allons-nous ouvrir la connexion à chaque ExecuteNonQuery(), ExecuteScalar(), etc. méthodes et fermer les connexions tant que cela est fait ou ouvrir la connexion au démarrage de l'application et maintenir la connexion ouverte jusqu'à la fin de l'application? S'il vous plaît éclairer !!

+0

s'il vous plaît ajouter un peu plus de code –

+0

créez la commande que vous dans une déclaration à l'aide? Je soupçonne que cela pourrait être la raison. – Aliostad

Répondre

1

Quelle est votre commande de validation? Est-ce juste pour commettre le travail? Si tel est le cas, vous n'avez pas besoin de le faire car une transaction serait implicitement créée et validée lors de l'exécution de la première requête, que cela vous plaise ou non.

Si les deux requêtes doivent être exécutés et se sont engagés dans son ensemble alors il semble que vous voulez peut-être envie d'utiliser des transactions

using(var connection = new OracleConnection(connectionString)) 
{ 
    var firstCommand = new OracleCommand(firstCommandString); 
    var secondCommand = new OracleCommand(secondCommandString); 

    var transaction = connection.BeginTransaction("SampleTransaction"); 

    firstCommand.Connection = connection; 
    firstCommand.Transaction = transaction; 

    secondCommand.Connection = connection; 
    secondCommand.Transaction = transaction; 

    firstCommand.ExecuteNonQuery(); 
    secondCommand.ExecuteNonQuery(); 

    transaction.Commit(); 
} 
+0

Merci. En fait, j'ai essayé d'utiliser la transaction, mais j'avais un problème avec la méthode commit. J'ai donc pensé à valider les mises à jour en utilisant un autre objet de commande. – Shekhar

+0

si l'objet de connexion est null en raison d'une exception ou quelque chose, alors ne devrions-nous pas d'abord vérifier l'objet de connexion et ensuite l'utiliser? – Shekhar

+0

Je ne crois pas que l'objet de connexion serait jamais nul "new OracleConnection" garantira de retourner un objet ou de lancer une exception. Si une exception est déclenchée, le reste du code ne s'exécutera pas. Vous pouvez envelopper la transaction dans un bloc try-catch et annuler la transaction si une erreur s'est produite. –

4

Comment valider les modifications sans utiliser les transactions ?

Cela n'a aucun sens. Si vous n'utilisez pas explicitement une transaction, les modifications sont validées automatiquement.

+0

Oh..ok, merci Winston. – Shekhar