Συμπτώματα

Μπορείτε να συνδεθείτε σε μια βάση δεδομένων της 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:

http://support.microsoft.com/contactus/?ws=supportΣημείωση Σε ειδικές περιπτώσεις, οι χρεώσεις που υφίστανται κανονικά για κλήσεις υποστήριξης ίσως ακυρωθούν εάν ο επαγγελματίας υποστήριξης της 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 SystemImports System.Data.OleDb

    Visual C# .NET κώδικα

    using System.Data.OleDb;
  6. Προσθέστε τον ακόλουθο κώδικα στην κύριαδιαδικασία:Κώδικας 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 Developer Network (MSDN) στο Web:

http://msdn2.microsoft.com/en-us/library/ms810685.aspxΓια πρόσθετες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft:

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

Χρειάζεστε περισσότερη βοήθεια;

Θέλετε περισσότερες επιλογές;

Εξερευνήστε τα πλεονεκτήματα της συνδρομής, περιηγηθείτε σε εκπαιδευτικά σεμινάρια, μάθετε πώς μπορείτε να προστατεύσετε τη συσκευή σας και πολλά άλλα.