CORRECÇÃO: Recebe uma mensagem de erro "ORA-01012" quando liga a uma base de dados da Oracle utilizando MSDAORA

Sintomas

Ligar a uma base de dados Oracle, utilizando o Microsoft OLE DB Provider para Oracle (MSDAORA) e, em seguida, terminar a ligação do lado do servidor. Quando abre uma nova ligação à base de dados Oracle da aplicação, recebe a seguinte mensagem de erro de excepção:

System.Data.OleDb.OleDbException: Erro não especificado
ORA-01012: não tem sessão iniciada

Causa

Quando terminar a ligação à base de dados Oracle no lado do servidor enquanto estiver a utilizar MSDAORA, a ligação quebrada é devolvida ao conjunto de ligação. O código de agrupamento de ligação incorrectamente interage com a propriedade ResetConnection do MSDAORA. Quando esta propriedade não é suportada pelo fornecedor, o código de agrupamento interpreta incorrectamente que a ligação é reposta e, se a ligação é válido. Quando o código do cliente abre uma nova ligação, é possível obter a ligação quebrada que foi devolvida ao conjunto de ligação. Por conseguinte, recebe a mensagem de erro mencionada na secção "Sintomas".

Resolução

Informações sobre correção

Agora tem uma correcção suportada disponível na Microsoft. Contudo, destina-se apenas a corrigir o problema descrito neste artigo. Aplique-a apenas em sistemas que tenham este problema específico. Esta correcção poderá ser submetida a testes adicionais. Por conseguinte, se não estiver a ser gravemente afectado por este problema, recomendamos que aguarde pelo próximo service pack que contenha esta correcção.

Para resolver este problema imediatamente, contacte o suporte técnico da Microsoft para obter a correcção. Para obter uma lista completa dos números de telefone do suporte técnico da Microsoft e informações sobre os custos de suporte, visite o seguinte Web site da Microsoft:

http://support.microsoft.com/contactus/?ws=supportNota Em casos especiais, os custos normalmente inerentes às chamadas de suporte poderão ser anulados se um técnico de suporte da Microsoft determinar que uma actualização específica resolverá o problema. Os custos de normais do suporte serão aplicados a questões de suporte adicionais e problemas que não se enquadrem na atualização específica em questão.

Informações de ficheiro

A versão inglesa desta correcção tem os atributos de ficheiro (ou atributos de ficheiro posteriores) listados na seguinte tabela. As datas e horas destes ficheiros são listadas na hora Universal Coordenada (UTC). Quando visualiza as informações do ficheiro, é convertido para a hora local. Para determinar a diferença entre a UTC e a hora local, utilize o separador Fuso horário na ferramenta Data e hora no painel de controlo.

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
O 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 correcção está disponível como parte de um pacote de correcções cumulativas. Quando receber esta correcção de suporte técnico da Microsoft, o número de artigo que está listado no pacote de correcção será 839801 para o MDAC 2.8 ou 836799 para o MDAC 2.7 SP1. Para mais informações, consulte o seguinte artigo na Microsoft Knowledge Base:



MDAC 2.8

CORRIGIR 839801 : correcções estão disponíveis para o MDAC 2.8

O MDAC 2.7 SP1

CORRIGIR 836799 : correcções estão disponíveis para o MDAC 2.7 Service Pack 1

Estado

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na secção "Aplica-se a".

Mais informações

Passos para reproduzir o comportamento

  1. Inicie o Microsoft Visual Studio .NET.

  2. No menu ficheiro , aponte para
    Novoe, em seguida, clique em projecto. Aparece a caixa de diálogo Novo projecto .

  3. Em Tipos de projecto, clique em Projectos do Visual Basice, em seguida, clique em Aplicação de consolaem modelos.

  4. Na caixa nome , escreva
    MyAppe, em seguida, clique em OK. Por predefinição, é criado o ficheiro de módulos Module1.

    Se estiver a utilizar o Microsoft Visual c# .NET, é criado o ficheiro Class1.cs.

  5. Adicione o seguinte código na parte superior:

    Código do Microsoft Visual Basic .NET

    Imports System
    Imports System.Data.OleDb

    Código do Visual c# .NET

    using System.Data.OleDb;
  6. Adicione o seguinte código ao procedimento principal:

    Código de 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()

    Código do 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();

    Nota Modificar a cadeia de ligação em conformidade com o seu ambiente.

  7. No menu de criação , clique em Build Solution.

  8. No menu Depurar , clique em
    A Iniciar. Verá que é apresentado um comando na janela da consola.

  9. No Oracle SQL * além disso, execute o comando que é apresentado na janela da consola.

  10. Prima ENTER. Na janela da consola, consulte a excepção de que é mencionada na secção "Sintomas".

Referências

Para mais informações sobre o fornecedor de Microsoft OLE DB para Oracle, visite o seguinte Web site da Microsoft Developer Network (MSDN):

http://msdn2.microsoft.com/en-us/library/ms810685.aspxPara obter informações adicionais, clique no número de artigo seguinte para visualizar o artigo na Microsoft Knowledge Base:

824684 descrição da terminologia padrão utilizada para descrever actualizações de software da Microsoft

Os produtos de outros fabricantes que este artigo aborda são fabricados por empresas independentes da Microsoft. Microsoft oferece nenhuma garantia, expressa ou implícita, relativamente ao desempenho ou fiabilidade destes produtos.

Precisa de mais ajuda?

Aumente os seus conhecimentos
Explore as formações
Seja o primeiro a obter novas funcionalidades
Aderir ao Microsoft insiders

As informações foram úteis?

Obrigado pelos seus comentários!

Obrigado pelo seu feedback! Parece que poderá ser benéfico reencaminhá-lo para um dos nossos agentes de suporte do Office.

×