症状

对于 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 与本地时间之间的时差,请使用控制面板中的日期和时间工具中的时区选项卡。

Microsoft 数据访问组件 (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 

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

839801解决: 修补程序是可用的 MDAC 2.8MDAC 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 SystemImports System.Data.OleDb

    Visual C#.NET 代码

    using System.Data.OleDb;
  6. 将下面的代码添加到Main过程中: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()

    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 无关的公司生产的。对这些产品的性能或可靠性,微软并不保证,暗示或其他方式。

需要更多帮助?

需要更多选项?

了解订阅权益、浏览培训课程、了解如何保护设备等。