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 especificadoORA-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.8O 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 paraNovoe, 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 , escrevaMyAppe, 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 SystemImports 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 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()

    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 emA 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 MicrosoftOs 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?

Quer mais opções?

Explore os benefícios da subscrição, navegue em cursos de formação, saiba como proteger o seu dispositivo e muito mais.