Pertanyaan Mengapa Oracle.ManagedDataAccess tidak berfungsi ketika Oracle.DataAccess tidak?


Saya sedang mengembangkan aplikasi yang sangat sederhana yang akan saya gunakan untuk memecahkan masalah yang saya alami pada beberapa mesin tetapi sebelum saya bahkan sampai sejauh itu saya mengalami beberapa masalah, termasuk perbedaan arsitektur cpu dan pustaka database Oracle.

Saya memiliki server database yang terdaftar tnsnames.ora, duduk di dalam diriku C:\oracle\11g\network\admin direktori. Jika saya tnsping server ini saya mendapatkan respon yang diinginkan. Jika saya mengkodekan program C # untuk terhubung ke server ini dengan kode berikut menggunakan Oracle.DataAccess.Client, ia berfungsi.

string connectionString = "Data Source=DSDSDS;User Id=UNUNUN;Password=PWPWPW;";
DataTable dataTable = new DataTable();

using (var connection = new OracleConnection(connectionString)) {
    connection.Open();
    using (var command = new OracleCommand()) {
        command.Connection = connection;
        command.CommandText = sql;
        command.CommandType = CommandType.Text;
        using (var oda = new OracleDataAdapter(command)) {
            oda.Fill(dataTable);
        }
    }
}

Namun, Oracle.DataAccess bergantung pada arsitektur sistem yang dijalankannya. Saya melihat bahwa ada perpustakaan lain Oracle.ManagedDataAccess yang merupakan arsitektur independen. Ketika saya menggunakan pustaka ini tidak lagi dapat terhubung ke server. Sebuah ORA-12545: Network Transport: Unable to resolve connect hostname dilemparkan.

Kenapa ini masalahnya? Apa yang berbeda antara dua perpustakaan ini karena berdasarkan apa yang saya baca sejauh ini seharusnya tidak menjadi masalah.

Informasi tambahan:

  • % ORACLE_HOME% dan% TNS_ADMIN% TIDAK ditentukan (ingat bahwa tnsping dan Oracle.DataAccess bekerja)
  • PATH memiliki C:\oracle\11g\BIN didefinisikan.
  • Mesin saya hanya punya satu tnsnames.ora mengajukan

Jika saya memindahkan tnsnames.ora ke lokasi yang sama dengan file .exe saya, ini berfungsi. Mengapa Oracle.DataAccess dapat menemukan tnsnames.ora di C:\oracle\11g\network\admin direktori tetapi Oracle.ManagedAccess tidak bisa?


30
2017-07-03 18:56


asal


Jawaban:


Urutan diutamakan untuk menyelesaikan nama TNS di ODP.NET, Managed Driver adalah ini (lihat sini):

  1. sumber data alias di bagian 'dataSources' di bawah bagian dalam file konfigurasi NET.
  2. sumber data alias di file tnsnames.ora di lokasi yang ditentukan oleh 'TNS_ADMIN' di file konfigurasi NET.
  3. sumber data alias di file tnsnames.ora hadir di direktori yang sama dengan .exe.
  4. sumber data alias di file tnsnames.ora ada di% TNS_ADMIN% (di mana% TNS_ADMIN% adalah pengaturan variabel lingkungan).
  5. sumber data alias di file tnsnames.ora ada di% ORACLE_HOME% \ network \ admin (di mana% ORACLE_HOME% adalah pengaturan variabel lingkungan).

Saya percaya alasan sampel Anda bekerja dengan Oracle.DataAccess tetapi tidak dengan Oracle.ManagedDataAccess adalah bahwa konfigurasi berbasis registri Windows tidak didukung untuk yang terakhir (lihat dokumentasi) - instalasi ODP.NET menyetel kunci registri ORACLE_HOME (HLKM \ SOFTWARE \ Oracle \ Key_NAME \ ORACLE_HOME) yang hanya dikenali oleh bagian yang tidak dikelola.


50
2017-11-18 14:41



Coba tambahkan path ke tnsnames.ora ke file konfigurasi:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <oracle.manageddataaccess.client>
    <version number="4.112.3.60">
      <settings>
        <setting name="TNS_ADMIN" value="C:\oracle\product\10.2.0\client_1\NETWORK\ADMIN\" />
      </settings>
    </version>
  </oracle.manageddataaccess.client>
</configuration>

12
2017-08-06 07:05



Untuk menghindari semua kekacauan Oracle karena tidak tahu di mana ia mencari TNSNAMES.ORA (Saya memiliki kebingungan tambahan dari beberapa versi Oracle dan 32/64 bit), Anda dapat menyalin pengaturan dari TNSNAMES.ORA yang ada ke konfigurasi Anda sendiri file dan gunakan itu untuk koneksi Anda.
Katakanlah Anda senang dengan referensi 'DSDSDS' di TNSNAMES.ORA yang memetakan ke sesuatu seperti:

DSDSDS = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (Host = DSDSDSHost) (Port = 4521))) (CONNECT_DATA = (SERVICE_NAME = DSDSDSService)))

Anda dapat mengambil teks setelah '=' pertama dan menggunakannya di mana pun Anda menggunakan 'DSDSDS' dan tidak perlu mencari TNSNAMES.ORA untuk mengetahui cara menyambungkan.
Sekarang string koneksi Anda akan terlihat seperti ini:
string connectionString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(Host=DSDSDSHost)(Port=4521)))(CONNECT_DATA=(SERVICE_NAME=DSDSDSService)));User Id=UNUNUN;Password=PWPWPW;";


2
2017-10-05 16:02



Saya memiliki masalah yang sama ...... untuk menyelesaikan ini apa yang saya lakukan adalah untuk meng-uninstall ODP. Bersih dan instal ulang di direktori yang sama dengan server oracle ...... dengan opsi server Anda akan melihat bahwa sebagian besar produk sudah diinstal (sementara instalasi database 12c) jadi cukup pilih fitur lain dan akhirnya selesaikan pemasangan. ...

Harap perhatikan bahwa solusi ini hanya berfungsi jika Anda telah memasang 12c pada mesin yang sama yaitu pada laptop Anda ............

Jika database Anda terletak di mesin server selain laptop Anda maka silakan pilih opsi klien dan bukan server dan kemudian sertakan TNS_ADMIN di app.config Anda dan jangan lupa untuk menentukan versi ...

karena instalasi saya ada di laptop saya sehingga App.config saya adalah sebagai berikut:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    </startup>
</configuration>


 /////////the below code is a sample from oracle company////////////////


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Common;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Oracle.ManagedDataAccess.Client;

///copy these lines in a button click event 
    string constr = "User Id=system; Password=manager; Data Source=orcl;";
// Click here and then press F9 to insert a breakpoint
        DbProviderFactory factory =
    DbProviderFactories.GetFactory("Oracle.ManagedDataAccess.Client");
            using (DbConnection conn = factory.CreateConnection())
            {
                conn.ConnectionString = constr;
                try
                {
                    conn.Open();
                    OracleCommand cmd = (OracleCommand)factory.CreateCommand();
                    cmd.Connection = (OracleConnection)conn;

//to gain access to ROWIDs of the table
//cmd.AddRowid = true;
                    cmd.CommandText = "select * from all_users";

                    OracleDataReader reader = cmd.ExecuteReader();

                    int visFC = reader.VisibleFieldCount; //Results in 2
                    int hidFC = reader.HiddenFieldCount;  // Results in 1

                    MessageBox.Show(" Visible field count: " + visFC);

                    MessageBox.Show(" Hidden field count: " + hidFC);


                    reader.Dispose();
                    cmd.Dispose();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                      MessageBox.Show(ex.StackTrace);
                }
            }

1
2018-03-22 16:02



Setelah saya menemukan format apa yang dicari dalam string koneksi, itu bekerja dengan baik seperti ini dengan Oracle.ManagedDataAccess. Tanpa harus dipusingkan dengan apa pun secara terpisah.

DATA SOURCE=DSDSDS:1521/ORCL;

1
2017-09-30 15:18



Saya menerima pesan kesalahan yang sama. Untuk mengatasi ini saya baru saja menggantikan Oracle.ManagedDataAccess berkumpul dengan yang lebih tua Oracle.DataAccess majelis. Solusi ini mungkin tidak berfungsi jika Anda memerlukan fitur-fitur baru yang ditemukan di rakitan baru. Dalam kasus saya, saya memiliki banyak masalah prioritas yang lebih tinggi kemudian mencoba untuk mengkonfigurasi yang baru Oracle majelis.


0
2018-06-12 15:18