Συμπτώματα
Μπορείτε να συνδεθείτε σε μια βάση δεδομένων της 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 που παρατίθενται στην ενότητα "Ισχύει για".
Περισσότερες πληροφορίες
Βήματα για την αναπαραγωγή της συμπεριφοράς
-
Ξεκινήστε το Microsoft Visual Studio .NET.
-
Στο μενού " αρχείο ", μεταβείτε στην επιλογή
Δημιουργίακαι, στη συνέχεια, κάντε κλικ στο έργο. Εμφανίζεται το παράθυρο διαλόγου Νέο έργο . -
Στην περιοχή Τύπους έργων, κάντε κλικ στο κουμπί Έργα της Visual Basicκαι, στη συνέχεια, κάντε κλικ στο κουμπί Εφαρμογή κονσόλαςστην περιοχή πρότυπα.
-
Στο πλαίσιο όνομα , πληκτρολογήστε
MyApp, και στη συνέχεια κάντε κλικ στο κουμπί OK. Από προεπιλογή, δημιουργείται το αρχείο Module1.vb.
Εάν χρησιμοποιείτε Microsoft Visual C# .NET, δημιουργείται το αρχείο Class1.cs. -
Προσθέστε τον ακόλουθο κώδικα στην κορυφή:
Κώδικα Microsoft Visual Basic .NETImports System
Imports System.Data.OleDbVisual C# .NET κώδικα
using System.Data.OleDb;
-
Προσθέστε τον ακόλουθο κώδικα στην κύριαδιαδικασία:
Κώδικας Visual Basic .NETDim 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();Σημείωση Τροποποιήστε τη συμβολοσειρά σύνδεσης ανάλογα με το περιβάλλον σας.
-
Από το μενού Δημιουργία , κάντε κλικ στο κουμπί Δημιουργία λύσης.
-
Από το μενού Εντοπισμός σφαλμάτων , κάντε κλικ στο κουμπί
Έναρξη. Μπορείτε να δείτε ότι μια εντολή εμφανίζεται στο παράθυρο της κονσόλας. -
Στο Oracle SQL * συν, εκτελέστε την εντολή που εμφανίζεται στο παράθυρο της κονσόλας.
-
Πιέστε το πλήκτρο ENTER. Στο παράθυρο της κονσόλας, μπορείτε να δείτε την εξαίρεση που αναφέρεται στην ενότητα "Συμπτώματα".
Αναφορές
Για περισσότερες πληροφορίες σχετικά με την υπηρεσία παροχής Microsoft OLE DB για Oracle, επισκεφθείτε την ακόλουθη τοποθεσία του Microsoft Developer Network (MSDN) στο Web:
http://msdn2.microsoft.com/en-us/library/ms810685.aspxΓια πρόσθετες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft:
824684 περιγραφή της βασικής ορολογίας που χρησιμοποιείται για την περιγραφή ενημερωμένων εκδόσεων λογισμικού της Microsoft
Τα προϊόντα τρίτων κατασκευαστών που περιγράφει αυτό το άρθρο έχουν κατασκευαστεί από εταιρείες που είναι ανεξάρτητες της Microsoft. Η Microsoft δεν παρέχει καμία εγγύηση, σιωπηρή ή άλλη, όσον αφορά τις επιδόσεις ή την αξιοπιστία αυτών των προϊόντων.