ΕΠΙΔΙΌΡΘΩΣΗ: Λαμβάνετε ένα μήνυμα λάθους "ORA-01012" όταν συνδέεστε σε μια βάση δεδομένων της Oracle χρησιμοποιώντας MSDAORA


Συμπτώματα


Μπορείτε να συνδεθείτε σε μια βάση δεδομένων της Oracle με τη χρήση της υπηρεσίας Microsoft OLE DB για Oracle (MSDAORA) και, στη συνέχεια, μπορείτε να τερματίσετε τη σύνδεση στο διακομιστή. Όταν ανοίγετε μια νέα σύνδεση με τη βάση δεδομένων της Oracle από την εφαρμογή σας, λαμβάνετε το ακόλουθο μήνυμα λάθους εξαίρεσης:
System.Data.OleDb.OleDbException: Απροσδιόριστο σφάλμα
ORA-01012: δεν έχετε συνδεθεί

Αιτία


Όταν τερματίζετε τη σύνδεση με τη βάση δεδομένων της Oracle στο διακομιστή κατά τη χρήση του MSDAORA, επιστρέφεται διακοπής της σύνδεσης στο χώρο συγκέντρωσης σύνδεσης. Ο κωδικός ομαδοποίησης σύνδεσης εσφαλμένα αλληλεπιδρά με την ιδιότητα ResetConnection του MSDAORA. Όταν αυτή η ιδιότητα δεν υποστηρίζεται από την υπηρεσία παροχής, ο κωδικός ομαδοποίησης ερμηνεύει εσφαλμένα ότι η σύνδεση έχει επαναφερθεί, και ότι η σύνδεση είναι έγκυρη. Όταν ο κωδικός προγράμματος-πελάτη ανοίγει μια νέα σύνδεση, η σύνδεση διακόπτεται που επιστράφηκε στο χώρο συγκέντρωσης σύνδεσης μπορεί να ανακτηθεί. Επομένως, θα εμφανιστεί το μήνυμα λάθους που αναφέρεται στην ενότητα "Συμπτώματα".

Προτεινόμενη αντιμετώπιση


Πληροφορίες άμεσης επιδιόρθωσης

Μια υποστηριζόμενη άμεση επιδιόρθωση είναι τώρα διαθέσιμη από τη Microsoft. Ωστόσο, προορίζεται για τη διόρθωση μόνο του ζητήματος που περιγράφεται σε αυτό το άρθρο. Eφαρμόστε τη μόνο σε συστήματα που αντιμετωπίζουν το συγκεκριμένο ζήτημα. Αυτή η επείγουσα επιδιόρθωση ενδέχεται να υποβληθεί σε πρόσθετο έλεγχο. Επομένως, εάν αυτό το ζήτημα δεν σας επηρεάζει ιδιαίτερα, σας συνιστούμε να περιμένετε έως το επόμενο service pack που περιέχει αυτήν την επείγουσα επιδιόρθωση.

Για να επιλύσετε αυτό το ζήτημα αμέσως, επικοινωνήστε με υπηρεσίες υποστήριξης πελατών της Microsoft για να αποκτήσετε την επείγουσα επιδιόρθωση. Για μια πλήρη λίστα αριθμών τηλεφώνου υπηρεσίες υποστήριξης πελατών της Microsoft και πληροφορίες σχετικά με το κόστος υποστήριξης, επισκεφθείτε την ακόλουθη τοποθεσία της Microsoft στο Web:Σημείωση Σε ειδικές περιπτώσεις, οι χρεώσεις που υφίστανται κανονικά για κλήσεις υποστήριξης ίσως ακυρωθούν εάν ο επαγγελματίας υποστήριξης της Microsoft κρίνει ότι μια συγκεκριμένη ενημερωμένη έκδοση θα επιλύσει το ζήτημά σας. Οι συνηθισμένες χρεώσεις υποστήριξης θα ισχύει για πρόσθετες ερωτήσεις υποστήριξης και για θέματα που δεν αφορούν τη συγκεκριμένη ενημερωμένη έκδοση.

Πληροφορίες αρχείων

Η αγγλική έκδοση αυτής της άμεσης επιδιόρθωσης έχει τα χαρακτηριστικά αρχείου (ή νεότερα χαρακτηριστικά αρχείου) που παρατίθενται στον παρακάτω πίνακα. Οι ημερομηνίες και οι ώρες για τα αρχεία αυτά αναφέρονται σε Συντονισμένη παγκόσμια ώρα (UTC). Όταν προβάλλετε τις πληροφορίες του αρχείου, μετατρέπεται σε τοπική ώρα. Για να βρείτε τη διαφορά μεταξύ της ώρας UTC και της τοπικής ώρας, χρησιμοποιήστε την καρτέλα ζώνη ώρας στο εργαλείο "ημερομηνία και ώρα" στον πίνακα ελέγχου.
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
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, ο αριθμός άρθρου που περιλαμβάνεται στο πακέτο επείγουσας επιδιόρθωσης θα 839801 για το MDAC 2.8 ή 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, και στη συνέχεια κάντε κλικ στο κουμπί OK. Από προεπιλογή, δημιουργείται το αρχείο 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. Προσθέστε τον ακόλουθο κώδικα στην κύριαδιαδικασία:

    Κώδικας 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 Developer Network (MSDN) στο Web:Για πρόσθετες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft:
824684 περιγραφή της βασικής ορολογίας που χρησιμοποιείται για την περιγραφή ενημερωμένων εκδόσεων λογισμικού της Microsoft

Τα προϊόντα τρίτων κατασκευαστών που περιγράφει αυτό το άρθρο έχουν κατασκευαστεί από εταιρείες που είναι ανεξάρτητες της Microsoft. Η Microsoft δεν παρέχει καμία εγγύηση, σιωπηρή ή άλλη, όσον αφορά τις επιδόσεις ή την αξιοπιστία αυτών των προϊόντων.