wake-up-neo.com

Warum funktioniert Oracle.ManagedDataAccess nicht, wenn Oracle.DataAccess funktioniert

Ich entwickle eine sehr einfache Anwendung, die ich zur Behebung eines Problems verwenden möchte, das auf einigen Computern vorkommt, aber noch bevor ich soweit gekommen bin, bin ich auf ein paar Probleme gestoßen, darunter Unterschiede in der CPU-Architektur und Oracle-Datenbankbibliotheken.

Ich habe einen Datenbankserver in tnsnames.ora, der sich in meinem C:\Oracle\11g\network\admin-Verzeichnis befindet. Wenn ich diesen Server tnsping, erhalte ich die gewünschte Antwort. Wenn ich mein C # -Programm mit dem folgenden Code mithilfe von Oracle.DataAccess.Client für die Verbindung zu diesem Server programmiere, funktioniert es.

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

Oracle.DataAccess ist jedoch von der Architektur des Systems abhängig, auf dem es ausgeführt wird. Ich habe gesehen, dass es eine andere Bibliothek Oracle.ManagedDataAccess gibt, die unabhängig von der Architektur ist. Wenn ich diese Bibliothek verwende, kann ich keine Verbindung mehr zum Server herstellen. Ein ORA-12545: Network Transport: Unable to resolve connect hostname wird geworfen.

Warum ist das so? Was ist zwischen diesen beiden Bibliotheken anders, denn basierend auf dem, was ich bisher gelesen habe, sollte dies kein Problem sein.

Zusatzinformation:

  • % Oracle_HOME% und% TNS_ADMIN% sind NICHT definiert (Denken Sie daran, dass tnsping und Oracle.DataAccess funktionieren).
  • PATH hat C:\Oracle\11g\BIN definiert.
  • Mein Rechner hat nur eine tnsnames.ora-Datei

Wenn ich tnsnames.ora an den gleichen Ort wie meine EXE-Datei verschiebe, funktioniert es. Warum kann Oracle.DataAccess tnsnames.ora im Verzeichnis C:\Oracle\11g\network\admin finden, Oracle.ManagedAccess jedoch nicht?

35
Rakshasas

Die Reihenfolge der Auflösung von TNS-Namen in ODP.NET, Managed Driver lautet wie folgt (siehe hier ):

  1. datenquellenalias im Abschnitt 'dataSources' unter Abschnitt in der .NET-Konfigurationsdatei.
  2. datenquellenalias in der Datei "tnsnames.ora" an dem durch 'TNS_ADMIN' in der .NET-Konfigurationsdatei angegebenen Speicherort.
  3. datenquellenalias in der Datei tnsnames.ora, die sich in demselben Verzeichnis wie die EXE-Datei befindet.
  4. datenquellenalias in der Datei "tnsnames.ora" in% TNS_ADMIN% (wobei% TNS_ADMIN% eine Umgebungsvariableneinstellung ist).
  5. datenquellenalias in der Datei "tnsnames.ora" unter% Oracle_HOME%\network\admin (wobei% Oracle_HOME% eine Einstellung für die Umgebungsvariable ist). 

Ich glaube, der Grund, warum Ihr Beispiel mit Oracle.DataAccess funktioniert, nicht jedoch mit Oracle.ManagedDataAccess, liegt darin, dass die Windows-basierte Konfiguration für die Registrierung nicht unterstützt wird (siehe documentation ). Die ODP.NET-Installation legt einen Oracle_HOME-Registrierungsschlüssel (HLKM) fest\SOFTWARE\Oracle\Key_NAME\Oracle_HOME), das nur vom nicht verwalteten Teil erkannt wird.

51
metalheart

Versuchen Sie, den Pfad zu tnsnames.ora zur Konfigurationsdatei hinzuzufügen:

<?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>
13
kolbasov

Um zu vermeiden, dass der Oracle-Durcheinander weiß, wo er nach TNSNAMES.ORA sucht (ich habe die Verwirrung mehrerer Oracle-Versionen und 32/64 Bit), können Sie die Einstellung aus Ihrer vorhandenen TNSNAMES.ORA in Ihre eigene Konfiguration kopieren Datei und verwenden Sie diese für Ihre Verbindung.
Angenommen, Sie sind zufrieden mit der "DSDSDS" -Referenz in TNSNAMES.ORA, die etwa folgenden Elementen entspricht:

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

Sie können den Text nach dem ersten '=' verwenden und überall dort verwenden, wo Sie 'DSDSDS' verwenden. TNSNAMES.ORA muss nicht gefunden werden, um die Verbindung herzustellen.
Nun würde Ihre Verbindungszeichenfolge so aussehen:
string connectionString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(Host=DSDSDSHost)(Port=4521)))(CONNECT_DATA=(SERVICE_NAME=DSDSDSService)));User Id=UNUNUN;Password=PWPWPW;";

4
user3902302

Ich hatte ein ähnliches Problem ...... um dieses Problem zu lösen, musste ich das ODP deinstallieren. Stellen Sie sicher, dass die meisten Produkte bereits installiert sind (während der 12c-Datenbankinstallation). Wählen Sie einfach die anderen Funktionen aus und schließen Sie die Installation ab. ...

Bitte beachten Sie, dass diese Problemumgehung nur funktioniert, wenn Sie 12c auf demselben Computer installiert haben, d. H. Auf Ihrem Laptop.

Wenn sich Ihre Datenbank auf einem anderen Server als Ihrem Laptop befindet, wählen Sie bitte Client-Option und nicht den Server aus und fügen Sie TNS_ADMIN in Ihre app.config ein. Vergessen Sie nicht, die Version anzugeben.

da meine Installation auf meinem Laptop ist, ist meine App.config wie folgt:

<?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
Siddiqui

Nachdem ich herausgefunden hatte, welches Format in der Verbindungszeichenfolge gesucht wurde, funktionierte es mit Oracle.ManagedDataAccess genau so. Ohne sich mit irgendetwas separat herumspielen zu müssen.

DATA SOURCE=DSDSDS:1521/ORCL;
1
Underground

In meinem Fall war alles in Ordnung, aber ich habe noch ORA-12545: Network Transport: Unable to resolve connect hostname erhalten.

Ich habe versucht, den Oracle-Computer per Ping zu erreichen, und habe herausgefunden, dass ich ihn nicht sehen kann. Er wurde der Datei hosts hinzugefügt. Dann erhielt ich eine weitere Fehlermeldung ORA-12541: TNS:no listener. Nach einer Untersuchung stellte ich fest, dass der gleiche Hostname von verschiedenen Rechnern mit unterschiedlichen IP-Adressen abgerufen wurde (ich weiß nicht warum), und ich änderte die IP-Adresse in meiner Hostdatei, wodurch das Problem zu 100% gelöst wurde.

Ich habe mir die Mühe gemacht, meine Erfahrung zu schreiben, da es offensichtlich ist, aber obwohl ich mir sicher war, dass das Problem in den obigen Einstellungen liegt, habe ich total vergessen zu prüfen, ob ich die Remote-DB-Maschine wirklich dort sehen kann. Denken Sie daran, wenn Sie keine Ideen haben, was los ist ...

Diese Links haben mir sehr geholfen:

http://www.moreajays.com/2013/03/ora-12545-connect-failed-because-target.htmlhttp://www.orafaq.com/wiki/ORA- 12541

0
ppenchev

Eine "kleine" Verspätung für die Party, aber die richtige Antwort darauf - wenn Sie den Oracle.ManagedDataAccess - ODP.NET-Provider verwenden, sollten Sie Dinge wie network\admin, Oracle client, Oracle_Home Usw.

Hier ist was Sie brauchen

  1. Downloaden und installieren Sie Oracle Developer Tools für VS oder ODAC . Hinweis - Dev Tools installieren ODAC für Sie. Dadurch wird eine relativ kleine Installation unter C:\Program Files (x86) erstellt. Mit vollen Entwicklungswerkzeugen unter 60Mb
  2. In Ihrem Projekt installieren Sie das Nuget-Paket mit der entsprechenden Version von ODP.net (Oracle.ManagedDataAccess.dll), auf die Sie verweisen
  3. Zu diesem Zeitpunkt haben Sie zwei Möglichkeiten, eine Verbindung herzustellen.

    • a) Legen Sie in der Verbindungszeichenfolge datasource im folgenden Format fest

      DataSource=ServerName:Port/SID . . . Oder DataSource=IP:Port/SID . . .

    • b) Erstellen Sie eine tnsnames.ora - Datei (nur wird sie sich von früheren Erfahrungen unterscheiden). Habe Eintrag drin:

      AAA = (DESCRIPTION =
      (ADDRESS = (PROTOKOLL = TCP) (Host = ServerNameOrIP) (PORT = 1521))
      (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = SIDNAME))

      Und platzieren Sie diese Datei in Ihrem bin-Ordner, in dem Ihre Anwendung ausgeführt wird. Jetzt können Sie sich mit Ihrem Verbindungsnamen verbinden - DataSource=AAA . . . Also, obwohl Sie tnsnames.ora haben, mit ODP.net verwaltet funktioniert es ein bisschen anders - Sie erstellen eine lokale TNS-Datei. Und jetzt ist es einfach, es zu handhaben.

Zusammenfassend lässt sich sagen, dass mit verwaltet kein umfangreicher Oracle-Client, Oracle_home Oder Kenntnisse über die Tiefe der Oracle-Installationsordner erforderlich sind. Alles kann innerhalb Ihrer .net-Anwendungsstrukturen durchgeführt werden.

0
T.S.