CORRECTIF : Vous recevez un message d’erreur « ORA-01012 » lorsque vous vous connectez à une base de données Oracle à l’aide de MSDAORA


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 :Remarque 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

  1. Démarrez Microsoft Visual Studio .NET.
  2. Dans le menu fichier , pointez sur
    De Nouveau, puis cliquez sur projet. La boîte de dialogue Nouveau projet s’affiche.
  3. Sous Types de projets, cliquez sur Projets de Visual Basic, puis cliquez sur Application Consolesous modèles.
  4. 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éé.
  5. Ajoutez le code suivant en haut :

    Code de Microsoft Visual Basic .NET
    Imports System
    Imports System.Data.OleDb
    Code de Visual C# .NET
    using System.Data.OleDb;
  6. Ajoutez le code suivant à la procédure Main:

    Code Visual Basic .NET
    Dim 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.
  7. Dans le menu Générer , cliquez sur Générer la Solution.
  8. Dans le menu Déboguer , cliquez sur
    Démarrer. Vous voyez qu’une commande s’affiche dans la fenêtre de console.
  9. Dans Oracle SQL * Plus, exécutez la commande qui s’affiche dans la fenêtre de console.
  10. 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 :Pour 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.