你目前正处于脱机状态,正在等待 Internet 重新连接

FIX: 您可以接收 ORA-01012 错误消息时通过使用 MSDAORA 连接到 Oracle 数据库

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 834905
症状
通过在 Microsoft OLE DB 提供程序的 Oracle (MSDAORA),连接到 Oracle 数据库,然后在结束在服务器端连接。当您从您的应用程序到 Oracle 数据库打开一个新的连接时您会收到下面的异常错误消息:
System.Data.OleDb.OleDbException: 未指定的错误
在不登录 ORA 01012:
原因
当您结束与 Oracle 数据库服务器端的连接,以使用 MSDAORA 时,已中断的连接返回到连接池。不正确,连接池代码进行交互的 MSDAORA ResetConnection 属性中。当提供程序不支持此属性时,池代码错误地将解释连接被重置为,和该连接是一个有效。当客户端代码打开一个新连接时,可以检索已返回到连接池的断开的连接。因此,您收到"症状"部分中提到的错误消息。
解决方案

修补程序信息

现在可以从 Microsoft 获得支持的修补程序。但是,它被用于解决本文中介绍的此问题。它仅应用于出现这一特定问题的系统。此修补程序可能还会接受进一步的测试。因此,如果此问题没有对您造成严重的影响,我们建议您等待包含此修补程序的下一个 service pack。

要立即解决此问题,请联系 Microsoft 客户支持服务以获取此修复程序。有关 Microsoft 客户支持服务电话号码和关于支持费用的信息的完整列表,请访问下面的 Microsoft 网站:注意 在特殊的情况中如果 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 服务包 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 知识库中相应的文章:

2.8 MDAC
839801修补程序是可用的 MDAC 2.8 FIX:
MDAC 2.7 SP1
836799FIX: 修补程序是可用的 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 * Plus,运行在控制台窗口中显示的命令。
  10. 请按 ENTER 键。在控制台窗口中,您将看到"症状"一节中提到的异常。
参考
对于 Oracle 在 Microsoft OLE DB 提供程序的详细信息,请访问下面的 Microsoft 开发人员网络 (MSDN) 的网站:有关更多的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
824684用于描述 Microsoft 软件更新的标准术语的说明
本文讨论了在第三方产品是由独立于 Microsoft 的公司生产的。Microsoft 会使没有担保,或暗示或其他方式,性能或可靠性,这些产品。
OLEDB MSDAORA 连接池 ; 终止会话 ; Oracle; OleDbException

警告:本文已自动翻译

属性

文章 ID:834905 - 上次审阅时间:11/15/2007 14:12:14 - 修订版本: 3.6

Microsoft Data Access Components 2.8, Microsoft Data Access Components 2.7 Service Pack 1

  • kbmt kbhotfixserver kbqfe kbbug kbprovider kbconnectivity kbdatabase kboracle kbfix kbqfe KB834905 KbMtzh
反馈