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ée
ORA-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.8
MDAC 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 sur
De 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 , tapez
MyApp, 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 .NETImports System
Imports System.Data.OleDbCode de Visual C# .NET
using System.Data.OleDb;
-
Ajoutez le code suivant à la procédure Main:
Code Visual Basic .NETDim cn As OleDbConnection
Dim cmd As OleDbCommand
Dim r As OleDbDataReader
Dim sid As String
Dim orlcmd As String
Dim 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 Try
Catch ex As OleDbException
Console.WriteLine(ex.ToString())
End Try
Console.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 sur
Dé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 Microsoft
Les 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.