Symptômes
Vous vous connectez à une base de données Oracle en utilisant le fournisseur Microsoft OLE DB pour Oracle (MSDAORA) et ensuite vous mettre fin à la connexion côté serveur. Lorsque vous ouvrez une nouvelle connexion à la base de données Oracle à partir de votre application, le message d’erreur d’exception suivant s’affiche :
System.Data.OleDb.OleDbException : Erreur non spécifiéeORA-01012 : pas ouvert de session
Cause
Lorsque vous terminez la connexion à la base de données Oracle sur le serveur lors de l’utilisation de MSDAORA, l’interruption de la connexion est retournée au pool de connexions. Le code de regroupement de connexion est incorrectement interagit avec la propriété ResetConnection de MSDAORA. Lorsque cette propriété n’est pas pris en charge par le fournisseur, le code de regroupement interprète à tort que la connexion est réinitialisée, et que la connexion est valide. Lorsque le code client ouvre une nouvelle connexion, l’interruption de la connexion qui a été retourné au pool de connexions peut-être être récupérée. Par conséquent, vous recevez le message d’erreur qui est mentionné dans la section « Symptômes ».
Résolution
Informations sur le correctif
Un correctif pris en charge est désormais disponible auprès de Microsoft. Toutefois, il est conçu pour résoudre uniquement le problème décrit dans cet article. Il s’applique uniquement aux systèmes rencontrant ce problème spécifique. Ce correctif peut subir des tests supplémentaires. Par conséquent, si vous n’êtes pas sérieusement concerné par ce problème, nous vous recommandons d’attendre le prochain service pack qui comprendra ce correctif.Pour résoudre ce problème immédiatement, contactez les Services de Support technique Microsoft pour obtenir le correctif. Pour obtenir une liste complète des numéros de téléphone des Services de Support technique Microsoft et des informations sur les coûts de support, visitez le site Web de Microsoft à l’adresse suivante :
http://support.microsoft.com/contactus/?ws=supportRemarque Dans des cas particuliers, des frais généralement encourus pour les appels au support technique peuvent être annulés si un technicien du support technique Microsoft détermine qu'une mise à jour spécifique peut résoudre votre problème. Les coûts habituels du support technique s’appliqueront aux autres questions et problèmes qui ne relèvent pas de la mise à jour spécifique en question.
Informations sur les fichiers
La version anglaise de ce correctif dispose des attributs de fichier (ou version ultérieure) répertoriés dans le tableau suivant. Les dates et heures de ces fichiers sont répertoriées en temps universel coordonné (UTC). Lorsque vous affichez les informations de fichier, elles sont converties en heure locale. Pour trouver la différence entre l’UTC et l’heure locale, utilisez l’onglet Fuseau horaire dans l’outil Date et heure dans le Panneau de configuration.
Microsoft Data Access Components (MDAC) 2.8
Date Time Version Size File name --------------------------------------------------------- 10-Mar-2004 04:22 2.80.1036.0 225,280 Msdaora.dll 10-Mar-2004 04:22 2000.85.1036.0 24,576 Odbcbcp.dll 10-Mar-2004 04:21 2.80.1036.0 442,368 Oledb32.dll 10-Mar-2004 04:21 2000.85.1036.0 401,408 Sqlsrv32.dll
MDAC 2.7 Service Pack 1
Date Time Version Size File name --------------------------------------------------------- 10-Mar-2004 02:19 2000.81.9046.0 61,440 Dbnetlib.dll 10-Mar-2004 02:20 2.71.9046.0 221,184 Msdaora.dll 10-Mar-2004 02:15 2.71.9046.0 126,976 Msdart.dll 10-Mar-2004 02:15 3.520.9046.0 204,800 Odbc32.dll 10-Mar-2004 02:20 2000.81.9046.0 24,576 Odbcbcp.dll 10-Mar-2004 02:20 3.520.9046.0 98,304 Odbccp32.dll 10-Mar-2004 02:16 2.71.9046.0 417,792 Oledb32.dll 10-Mar-2004 02:19 2000.81.9046.0 471,040 Sqloledb.dll 10-Mar-2004 02:19 2000.81.9046.0 385,024 Sqlsrv32.dll
Ce correctif est disponible en tant que partie d’un package de correctif cumulatif. Lorsque vous recevez ce correctif à partir des Services de Support technique de Microsoft, le numéro de l’article qui figure dans le package de correctifs seront 839801 pour MDAC 2.8 ou 836799 pour MDAC 2.7 SP1. Pour plus d’informations, consultez l’article suivant dans la Base de connaissances Microsoft :MDAC 2.8
839801 correctif : les correctifs sont disponibles pour MDAC 2.8MDAC 2.7 SP1
836799 correctif : les correctifs sont disponibles pour MDAC 2.7 Service Pack 1
État
Microsoft a confirmé l'existence de ce problème dans les produits Microsoft répertoriés dans la section « S'applique à ».
Plus d'informations
Procédure pour reproduire le comportement
-
Démarrez Microsoft Visual Studio .NET.
-
Dans le menu fichier , pointez surDe Nouveau, puis cliquez sur projet. La boîte de dialogue Nouveau projet s’affiche.
-
Sous Types de projets, cliquez sur Projets de Visual Basic, puis cliquez sur Application Consolesous modèles.
-
Dans la zone nom , tapezMyApp, puis cliquez sur OK. Par défaut, le fichier Module1.vb est créé.Si vous utilisez Microsoft Visual C# .NET, le fichier Class1.cs est créé.
-
Ajoutez le code suivant en haut :Code de Microsoft Visual Basic .NET
Imports SystemImports System.Data.OleDb
Code de Visual C# .NET
using System.Data.OleDb;
-
Ajoutez le code suivant à la procédure Main:Code Visual Basic .NET
Dim cn As OleDbConnectionDim cmd As OleDbCommandDim r As OleDbDataReaderDim sid As StringDim orlcmd As StringDim connString As String = "Provider=MSDAORA;DataSource=<data source>;User ID=<user name>;Password=<password>;"Try 'Create a new connection to the Oracle database by using MSDAORA. cn = New OleDbConnection cn.ConnectionString = connString cn.Open() cmd = New OleDbCommand cmd.CommandText = "SELECT SID , SERIAL# FROM V$SESSION WHERE SID = (SELECT SID FROM V$MYSTAT WHERE ROWNUM=1)" cmd.Connection = cn r = cmd.ExecuteReader() sid = "" If (r.Read()) Then sid = r.GetValue(0).ToString() + "," + r.GetValue(1).ToString() End If orlcmd = "Alter System Kill Session '" + sid + "' Immediate;" Console.WriteLine("Open the SQL Plus window, run the following command, and then press ENTER:") Console.WriteLine(orlcmd) Console.ReadLine() r.Close() cmd.CommandText = "SELECT count(*) from TAB" Try 'Expecting this command to fail because connection has been killed r = cmd.ExecuteReader() Catch orlex As OleDbException Console.WriteLine(orlex.Message) cmd.Dispose() 'Close the bad connection. cn.Close() System.Threading.Thread.Sleep(1000) cn.ConnectionString = connString cn.Open() cmd = New OleDbCommand cmd.CommandText = "SELECT count(*) FROM TAB" cmd.Connection = cn 'This command will fail, but it will work when a new connection is used. r = cmd.ExecuteReader() If (r.Read()) Then Console.WriteLine(r.GetValue(0)) End If End TryCatch ex As OleDbException Console.WriteLine(ex.ToString())End TryConsole.WriteLine("Press ENTER to exit...")Console.ReadLine()
Code de Visual C# .NET
OleDbConnection cn;OleDbCommand cmd;OleDbDataReader r;String sid;String orlcmd;String connString="Provider=MSDAORA;DataSource=<data source>;User ID=<user name>;Password=<password>;";try{ //Create a connection to the Oracle database by using MSDAORA. cn= new OleDbConnection(); cn.ConnectionString=connString; cn.Open(); cmd=new OleDbCommand(); cmd.CommandText="SELECT SID , SERIAL# FROM V$SESSION WHERE SID = (SELECT SID FROM V$MYSTAT WHERE ROWNUM=1)"; cmd.Connection=cn; r=cmd.ExecuteReader(); sid=""; if(r.Read()) { sid=r.GetValue(0).ToString()+","+r.GetValue(1).ToString(); } orlcmd="Alter System Kill Session '"+sid+"' Immediate;"; Console.WriteLine("Open the SQL Plus window, run the following command, and then press ENTER:"); Console.WriteLine(orlcmd); Console.ReadLine(); r.Close(); cmd.CommandText="SELECT count(*) from TAB"; try { //Expecting this to fail because the connection is killed. r=cmd.ExecuteReader(); } catch(OleDbException orlex) { Console.WriteLine(orlex.Message); cmd.Dispose(); //Close the bad connection. cn.Close(); System.Threading.Thread.Sleep(1000); cn.ConnectionString=connString; cn.Open(); cmd=new OleDbCommand(); cmd.CommandText="SELECT count(*) FROM TAB"; cmd.Connection=cn; //This command will fail, but it will work when a new connection is used. r=cmd.ExecuteReader(); if(r.Read()) { Console.WriteLine(r.GetValue(0).ToString()); } }}catch(OleDbException ex){ Console.WriteLine(ex.ToString());}Console.WriteLine("Press ENTER to exit...");Console.ReadLine();
Remarque Modifiez la chaîne de connexion en fonction de votre environnement.
-
Dans le menu Générer , cliquez sur Générer la Solution.
-
Dans le menu Déboguer , cliquez surDémarrer. Vous voyez qu’une commande s’affiche dans la fenêtre de console.
-
Dans Oracle SQL * Plus, exécutez la commande qui s’affiche dans la fenêtre de console.
-
Appuyez sur ENTRÉE. Dans la fenêtre de la console, vous voyez l’exception qui est mentionnée dans la section « Symptômes ».
Références
Pour plus d’informations sur le fournisseur Microsoft OLE DB pour Oracle, visitez le site Web de Microsoft Developer Network (MSDN) à l’adresse suivante :
http://msdn2.microsoft.com/en-us/library/ms810685.aspxPour plus d’informations, cliquez sur le numéro ci-dessous pour afficher l’article correspondant dans la Base de connaissances Microsoft :
Description 824684 terminologie standard utilisée pour décrire les mises à jour logicielles de MicrosoftLes produits tiers dont traite cet article sont fabriqués par des sociétés indépendantes de Microsoft. Microsoft ne fait aucune garantie, implicite ou autre, concernant les performances ou la fiabilité de ces produits.