FIX: MSDAORA का उपयोग करके Oracle डेटाबेस से कनेक्ट करते समय आपको एक त्रुटि संदेश "ORA-01012" प्राप्त


लक्षण


Oracle (MSDAORA के लिए) Microsoft OLE DB प्रदाता का उपयोग करके Oracle डेटाबेस से कनेक्ट करें, और तब आप सर्वर-साइड कनेक्शन समाप्त। जब आप अपने अनुप्रयोग से Oracle डेटाबेस के लिए कोई नया कनेक्शन खोलने, तो आपको निम्न अपवाद त्रुटि संदेश प्राप्त होता है:
System.Data.OleDb.OleDbException: अनिर्दिष्ट त्रुटि
ORA-01012: लॉग ऑन नहीं

कारण


जब आप MSDAORA का उपयोग करते हुए कनेक्शन Oracle डेटाबेस सर्वर साइड पर बंद, भंग कनेक्शन कनेक्शन पूल करने के लिए दिया जाता है। गलत तरीके से कनेक्शन pooling कोड MSDAORA के ResetConnection गुण के साथ इंटरैक्ट करता है। यह गुण प्रदाता द्वारा समर्थित नहीं है, जब pooling कोड गलत तरीके से कनेक्शन रीसेट है, और कि कनेक्शन है एक मान्य interprets. कोड क्लाइंट कोई नया कनेक्शन खोलता है, जब भंग कनेक्शन कनेक्शन पूल में वापस किया गया था जो प्राप्त हो सकता है। इसलिए, आप "लक्षण" खंड में वर्णित त्रुटि संदेश प्राप्त होता है।

समाधान


हॉटफिक्स जानकारी

अब एक समर्थित हॉटफिक्स Microsoft से उपलब्ध है। हालाँकि, यह केवल इस आलेख में वर्णित समस्या को ठीक करने के लिए अभिप्रेत है। यह जो इस विशिष्ट समस्या का अनुभव कर रहे हैं केवल उन्ही सिस्टमों पर लागू करें। यह हॉटफ़िक्स अतिरिक्त परीक्षण प्राप्त हो सकता है। इसलिए, अगर आप इस समस्या से बुरी तरह प्रभावित नहीं हैं, तो हम अनुशंसा करते कि आप जिसमें ये हॉटफिक्स शामिल अगले सर्विस पैक के लिए प्रतीक्षा करें।

इस समस्या को तुरंत हल करने के लिए, हॉटफिक्स प्राप्त करने के लिए 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 ज्ञानकोश में देखें:



MDAC 2.8
839801 ठीक करें: हॉटफिक्सेस MDAC 2.8 के लिए उपलब्ध हैं

MDAC 2.7 SP1
836799 ठीक करें: हॉटफिक्सेस MDAC 2.7 सर्विस पैक 1 के लिए उपलब्ध हैं

स्थिति


Microsoft ने पुष्टि की है कि यह "इन पर लागू" खण्ड में सूचीबद्ध Microsoft उत्पादों में एक समस्या है.

अधिक जानकारी


व्यवहार को पुन: उत्पन्न करने के लिए चरण

  1. Microsoft Visual Studio .NET प्रारंभ करें।
  2. फ़ाइल मेनू पर, इंगित करने के लिए
    नया, और उसके बाद प्रोजेक्टक्लिक करें। नया प्रोजेक्ट संवाद बॉक्स प्रकट होता है।
  3. प्रोजेक्ट प्रकारके अंतर्गत Visual Basic प्रोजेक्टक्लिक करें, और उसके बाद कंसोल अनुप्रयोगके अंतर्गत टेम्पलेट्स
  4. नाम बॉक्स में, टाइप करें
    MyApp, और उसके बाद ठीकक्लिक करें। डिफ़ॉल्ट रूप से, Module1.vb फ़ाइल बनाई जाती है।

    Class1.cs फ़ाइल बनाई जाती है, तो आप Microsoft Visual c# .NET का उपयोग कर रहे हैं।
  5. ऊपरी भाग में निम्न कोड जोड़ें:

    Microsoft Visual Basic .NET कोड
    Imports System
    Imports System.Data.OleDb
    दृश्य c# .NET कोड
    using System.Data.OleDb;
  6. मुख्यप्रक्रिया करने के लिए निम्न कोड जोड़ें:

    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# .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) वेब साइट पर जाएँ:अतिरिक्त जानकारी के लिए, Microsoft नॉलेज़ बेस में आलेख देखने के लिए निम्न आलेख संख्या पर क्लिक करें:
824684 Microsoft सॉफ़्टवेयर अद्यतनों का विवरण देने में प्रयुक्त होने वाले मानक शब्दों वर्णन

यह आलेख चर्चा करता है कि तृतीय-पक्ष उत्पाद Microsoft से स्वतंत्र कंपनियों द्वारा निर्मित किए गए हैं. Microsoft कोई वारंटी, निहित या अन्यथा, प्रदर्शन या विश्वसनीयता इन उत्पादों के संबंध में बनाता है।