修复: 您可以收到"ORA 01012"错误消息,当您使用 MSDAORA 连接到 Oracle 数据库

对于 Oracle (MSDAORA),使用 Microsoft OLE DB 提供程序连接到 Oracle 数据库,然后结束在服务器端的连接。当您打开一个新连接到 Oracle 数据库从您的应用程序时,您会收到以下异常的错误消息:

System.Data.OleDb.OleDbException: 未指定的错误
ORA 01012: 未登录

结束时连接到 Oracle 数据库在服务器端使用 MSDAORA 时,断开的连接返回到连接池。连接池代码不正确地使用 MSDAORA 的ResetConnection属性交互。提供程序不支持此属性,当池代码错误地解释,连接被重置,并且该连接是一个有效。当客户端代码打开新连接时,可以检索返回到连接池的连接中断。因此,您会收到"症状"一节中提到的错误消息。

受支持的修补程序现已从 Microsoft 推出。但是,它被用于纠正本文中描述的问题。它仅应用于正经历此特定问题的系统。此修补程序可能会接受进一步的测试。因此,如果这个问题没有对您造成严重的影响,我们建议您等待包含此修复程序的下一个 service pack。

要立即解决此问题,请联系 Microsoft 客户支持服务,以获取此修复程序。Microsoft 客户支持服务的电话号码以及有关支持费用的信息的完整列表,请访问下面的 Microsoft 网站:

http://support.microsoft.com/contactus/?ws=support注意: 在特殊情况下,如果 Microsoft 支持专业人员确定某个特定的更新能够解决您的问题,可能取消的通常情况下收取的电话支持服务费用。照常收取支持费用将应用于其他支持问题和对于特定更新无法解决的问题。

此修复程序的英文版具有的文件属性 (或更新的文件属性)在下表中列出。日期和为这些文件的时间以协调世界时 (UTC) 列出。当您查看文件信息时,它将转换为本地时间。要了解 UTC 与本地时间之间的时差,请使用控制面板中的日期和时间工具中的时区选项卡。

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

此修补程序可作为累积修补程序包的一部分。当您从 Microsoft 产品支持服务收到此修复程序时,此修补程序包中列出的文章编号将 MDAC 2.8 的 839801 或 836799 的 MDAC 2.7 SP1。有关详细信息,请参阅以下文章 Microsoft 知识库中相应的文章:



MDAC 2.8

839801解决: 修补程序是可用的 MDAC 2.8

MDAC 2.7 SP1

836799解决: 修复程序可以提供有关 MDAC 2.7 Service Pack 1

Microsoft 已经确认这是“适用于”一节中列出的 Microsoft 产品中的问题。

  1. 启动 Microsoft Visual Studio.NET。

  2. 文件菜单中,指向
    新建,然后单击项目。出现新建项目对话框。

  3. 项目类型,单击Visual Basic 项目,然后单击模板下的控制台应用程序

  4. 名称框中,键入
    MyApp,然后单击确定。默认情况下,创建的 Module1.vb 文件。

    如果您使用的 Microsoft Visual C#.NET,则创建 Class1.cs 文件。

  5. 在顶部添加以下代码:

    Microsoft Visual Basic.NET 代码

    Imports System
    Imports System.Data.OleDb

    Visual C#.NET 代码

    using System.Data.OleDb;
  6. 将下面的代码添加到Main过程中:

    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()

    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();

    注意:修改连接字符串,根据您的环境。

  7. 单击生成菜单上的生成解决方案

  8. 调试菜单上,单击
    启动。您将看到一个命令将显示在控制台窗口中。

  9. 在 Oracle SQL * 另外,运行在控制台窗口中显示的命令。

  10. 按 enter 键。在控制台窗口中,您将看到"症状"一节中提到的异常。

有关 Microsoft OLE DB 提供程序适用于 Oracle 的详细信息,请访问下面的 Microsoft 开发人员网络 (MSDN) Web 站点:

http://msdn2.microsoft.com/en-us/library/ms810685.aspx有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

用于描述 Microsoft 软件更新的标准术语的824684说明

本文讨论的第三方产品是由与 Microsoft 无关的公司生产的。对这些产品的性能或可靠性,微软并不保证,暗示或其他方式。

需要更多帮助?

扩展你的技能
了解培训
抢先获得新功能
加入 Microsoft 内部人员

此信息是否有帮助?

谢谢您的反馈意见!

×