FIX: Anda menerima pesan galat "ORA-01012" ketika Anda menyambung ke database Oracle menggunakan MSDAORA

Gejala

Anda menyambung ke database Oracle menggunakan Microsoft OLE DB penyedia untuk Oracle (MSDAORA), dan kemudian Anda mengakhiri sambungan di sisi server. Ketika Anda membuka sambungan baru ke Oracle database dari aplikasi Anda, Anda menerima pesan galat pengecualian berikut ini:

System.Data.OleDb.OleDbException: Unspecified error
ORA-01012: tidak masuk

Penyebab

Saat Anda mengakhiri sambungan ke database Oracle di sisi server saat menggunakan MSDAORA, sambungan rusak kembali ke pool sambungan. Kode pooling sambungan salah berinteraksi dengan properti ResetConnection MSDAORA. Saat ini tidak didukung oleh penyedia, kode pooling salah menafsirkan sambungan reset, dan bahwa sambungan yang valid. Ketika klien kode membuka sambungan baru, sambungan rusak yang dikembalikan ke pool sambungan dapat diakses. Oleh karena itu, Anda menerima pesan galat yang disebutkan di bagian "gejala".

Pemecahan masalah

Informasi Hotfix

Sekarang tersedia hotfix yang didukung dari Microsoft. Namun, ini ditujukan untuk memperbaiki masalah yang dijelaskan di artikel ini. Terapkan hanya ke sistem yang mengalami masalah khusus ini. Perbaikan terbaru ini dapat menerima pengujian tambahan. Oleh karena itu, jika Anda tidak terlalu dipengaruhi oleh masalah ini, kami sarankan Anda menunggu paket layanan berikutnya yang berisi perbaikan terbaru ini.

Untuk segera menyelesaikan masalah ini, hubungi layanan dukungan pelanggan Microsoft untuk mendapatkan hotfix. Untuk daftar lengkap nomor telepon layanan dukungan pelanggan Microsoft dan informasi mengenai biaya dukungan, kunjungi situs Web Microsoft berikut ini:

http://support.microsoft.com/contactus/?ws=supportCatatan Dalam kasus tertentu, biaya yang biasanya diadakan untuk panggilan dukungan mungkin dibatalkan apabila profesional dukungan Microsoft menentukan bahwa pembaruan khusus akan memecahkan masalah Anda. Biaya dukungan biasa akan berlaku untuk pertanyaan dan masalah yang tidak termasuk pada pembaruan tertentu yang dimaksud dukungan tambahan.

Informasi file

Versi bahasa Inggris dari hotfix ini memiliki atribut berkas (atau atribut berkas yang lebih baru) yang tercantum dalam tabel berikut. Tanggal dan waktu untuk berkas-berkas tersebut dicantumkan dalam Waktu Universal Terkoordinasi (UTC). Ketika Anda melihat informasi berkas, akan diubah ke waktu lokal. Untuk menemukan perbedaan antara waktu UTC dan waktu lokal, gunakan tab zona waktu di alat tanggal dan waktu di Panel kontrol.

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

Hotfix ini tersedia sebagai bagian dari paket hotfix kumulatif. Ketika Anda menerima perbaikan terbaru ini dari layanan dukungan produk Microsoft, nomor artikel yang tercantum dalam paket hotfix akan 839801 untuk MDAC 2.8 atau 836799 untuk MDAC 2,7 SP1. Untuk informasi selengkapnya, lihat artikel berikut di Pangkalan Pengetahuan Microsoft:



MDAC 2.8

MEMPERBAIKI 839801 : perbaikan terbaru tersedia untuk MDAC 2.8

MDAC 2,7 SP1

MEMPERBAIKI 836799 : perbaikan terbaru tersedia untuk MDAC 2,7 Paket Layanan 1

Status

Microsoft telah memastikan bahwa ini merupakan masalah di dalam produk Microsoft sebagaimana tercantum di bagian "Berlaku untuk".

Informasi lebih lanjut

Langkah-langkah untuk mereproduksi perilaku

  1. Mulai Microsoft Visual Studio .NET.

  2. Pada File menu, arahkan ke
    Baru, dan kemudian klik Project. Kotak dialog Proyek Baru akan muncul.

  3. Di bawah Jenis proyek, klik Proyek Visual Basic, dan kemudian klik Aplikasi konsolpada pola dasar.

  4. Di kotak nama , ketik
    MyApp, dan kemudian klik OK. Secara asali, berkas Module1.vb dibuat.

    Jika Anda menggunakan Microsoft Visual C# .NET, dibuat berkas Class1.cs.

  5. Tambahkan kode berikut di atas:

    Kode Microsoft Visual Basic .NET

    Imports System
    Imports System.Data.OleDb

    Visual C# .NET kode

    using System.Data.OleDb;
  6. Tambahkan kode berikut untuk prosedur utama:

    Kode 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 kode

    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();

    Catatan Mengubah rangkaian sambungan berdasarkan lingkungan Anda.

  7. Membangun menu, klik Membangun solusi.

  8. Pada Debug menu, klik
    Mulai. Anda akan melihat bahwa perintah yang ditampilkan di jendela konsol.

  9. Dalam Oracle SQL * Plus, jalankan perintah yang ditampilkan di jendela konsol.

  10. Tekan ENTER. Di jendela konsol, Anda akan melihat pengecualian yang disebutkan di bagian "gejala".

Referensi

Untuk informasi selengkapnya tentang Microsoft OLE DB penyedia Oracle, kunjungi situs Web Microsoft Developer Network (MSDN) berikut:

http://msdn2.microsoft.com/en-us/library/ms810685.aspxUntuk informasi tambahan, klik nomor artikel berikut ini untuk melihat artikel di Pangkalan Pengetahuan Microsoft:

824684 Deskripsi tentang terminologi standar yang digunakan untuk menjelaskan pembaruan perangkat lunak Microsoft

Produk pihak ketiga yang dibahas di artikel ini dibuat oleh perusahaan yang independen terhadap Microsoft. Microsoft tidak memberikan garansi, baik tersirat maupun tersurat, mengenai kinerja atau keandalan produk ini.

Perlu bantuan lainnya?

Kembangkan keterampilan Anda
Jelajahi pelatihan
Dapatkan fitur baru terlebih dahulu
Gabung Microsoft Insider

Apakah informasi ini bermanfaat?

Terima kasih atas umpan balik Anda!

Terima kasih atas umpan balik Anda! Sepertinya menghubungkan Anda ke salah satu agen dukungan Office kami akan sangat membantu.

×