REVISIÓN: Recibe un mensaje de error "ORA-01012" cuando se conecta a una base de datos de Oracle utilizando MSDAORA

Síntomas

Conectarse a una base de datos de Oracle utilizando el proveedor de Microsoft OLE DB para Oracle (MSDAORA) y, a continuación, termina la conexión en el servidor. Cuando se abre una nueva conexión a la base de datos de Oracle desde su aplicación, recibirá el mensaje de error de excepción siguiente:
System.Data.OleDb.OleDbException: Error no especificado
ORA-01012: no ha iniciado sesión

Causa

Cuando termina la conexión a la base de datos de Oracle en el servidor mientras utiliza MSDAORA, la interrupción de la conexión se devuelve a la agrupación de conexiones. El código de agrupación de conexión incorrectamente interactúa con la propiedad ResetConnection de MSDAORA. Cuando esta propiedad no es compatible con el proveedor, el código de agrupación interpreta incorrectamente que se restablece la conexión, y que la conexión es válida. Cuando el código de cliente abre una conexión nueva, se puede recuperar la conexión rota que se devolvió al grupo de conexiones. Por lo tanto, recibirá el mensaje de error que se menciona en la sección "Síntomas".

Solución

Información de la revisión

Ahora hay una revisión compatible de Microsoft. Sin embargo, se pretende corregir el problema que se describe en este artículo. Aplíquela sólo a sistemas que experimenten este problema específico. Esta revisión puede ser sometida a comprobaciones adicionales. Por lo tanto, si no se ve muy afectado por este problema, recomendamos que espere al próximo service pack que contenga esta revisión.

Para resolver este problema inmediatamente, póngase en contacto con los servicios de soporte técnico de Microsoft para obtener la revisión. Para obtener una lista completa de números de teléfono de los servicios de soporte al cliente de Microsoft e información acerca de los costos de soporte técnico, visite el siguiente sitio Web de Microsoft:Nota: En casos especiales, los costos derivados normalmente de las llamadas al soporte técnico pueden cancelarse si un profesional de soporte técnico de Microsoft determina que una actualización específica resolverá el problema. Los costos habituales de soporte se aplicarán a las preguntas de soporte técnico adicionales y problemas que no guarden relación con la actualización en cuestión.

Información de archivo

La versión en inglés de esta revisión tiene los atributos de archivo (o atributos del archivo más reciente) mostrados en la tabla siguiente. Las fechas y horas de estos archivos se muestran en la hora Universal coordinada (UTC). Al ver la información del archivo, se convierte en hora local. Para encontrar la diferencia entre la hora UTC y la hora local, utilice la ficha zona horaria en la herramienta fecha y hora del Panel de Control.
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
Esta revisión está disponible como parte de un paquete acumulativo de revisiones. Cuando reciba esta revisión de Microsoft Product Support Services, será el número de artículo que aparece en el paquete de revisiones 839801 para MDAC 2.8 o 836799 para MDAC 2.7 SP1. Para obtener más información, consulte el artículo siguiente en Microsoft Knowledge Base:



MDAC 2.8
CORREGIR 839801 : existen revisiones de MDAC 2.8

MDAC 2.7 SP1
CORREGIR 836799 : existen revisiones de MDAC 2.7 Service Pack 1

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft que se enumeran en la sección "Aplicable a".

Más información

Pasos para reproducir el comportamiento

  1. Inicie Microsoft Visual Studio. NET.
  2. En el menú archivo , elija
    De nuevoy, a continuación, haga clic en proyecto. Aparecerá el cuadro de diálogo Nuevo proyecto .
  3. En Tipos de proyecto, haga clic en Proyectos de Visual Basicy, a continuación, haga clic en Aplicación de consolaen plantillas.
  4. En el cuadro nombre , escriba
    MyAppy, a continuación, haga clic en Aceptar. De forma predeterminada, se crea el archivo Module1.vb.

    Si está utilizando Microsoft Visual C#. NET, se crea el archivo Class1.cs.
  5. Agregue el código siguiente en la parte superior:

    Código de Microsoft Visual Basic .NET
    Imports SystemImports System.Data.OleDb
    Código de Visual C#.
    using System.Data.OleDb;
  6. Agregue el código siguiente al procedimiento Main:

    Código de Visual Basic .NET
    Dim cn As OleDbConnectionDim 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()

    Código de Visual C#.
    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();

    Nota: Modifique la cadena de conexión según su entorno.
  7. En el menú Generar , haga clic en Generar solución.
  8. En el menú Depurar , haga clic en
    Iniciar. Verá que aparece un comando en la ventana de consola.
  9. En Oracle SQL * Plus, ejecute el comando que se muestra en la ventana de la consola.
  10. Presione ENTRAR. En la ventana de consola, verá la excepción que se menciona en la sección "Síntomas".

Referencias

Para obtener más información sobre el proveedor de Microsoft OLE DB para Oracle, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):Para obtener información adicional, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
824684 descripción de la terminología estándar que se utiliza para describir las actualizaciones de software de Microsoft

Los productos de terceros que se indican en este artículo están fabricados por compañías independientes de Microsoft. Microsoft no otorga ninguna garantía, implícita o de otro tipo, respecto al rendimiento o la confiabilidad de estos productos.
Propiedades

Id. de artículo: 834905 - Última revisión: 17 ene. 2017 - Revisión: 1

Comentarios