Pourquoi Oracle?ManagedDataAccess ne fonctionne pas lorsque Oracle.DataAccess?

je développe une application très simple que j'ai l'intention d'utiliser pour résoudre un problème que j'ai sur quelques machines, mais avant même d'en arriver là, j'ai rencontré quelques problèmes, y compris les différences d'architecture cpu et les bibliothèques de bases de données Oracle.

j'ai un serveur de base de données énumérés dans tnsnames.ora, assis dans mon C:oraclegnetworkadmin répertoire. Si j'utilise ce serveur, j'obtiens la réponse désirée. Si je code mon programme C# pour me connecter à ce serveur avec le code suivant en utilisant Oracle.DataAccess.Client, il fonctionne.

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

Cependant Oracle.DataAccess dépend de l'architecture du système, il fonctionne sur. J'ai vu qu'il y a un autre Oracle de bibliothèque.ManagedDataAccess qui est indépendant de l'architecture. Lorsque j'utilise cette bibliothèque, il n'est plus en mesure de se connecter au serveur. ORA-12545: Network Transport: Unable to resolve connect hostname est levée.

Pourquoi est-ce le cas? Ce qui est différent entre ces deux bibliothèques parce que basé sur ce que j'ai lu jusqu'à présent ce ne devrait pas être un question.

information supplémentaire:

  • % ORACLE_HOME % et %TNS_ADMIN% ne sont pas définis (rappelez-vous que tnsping et Oracle.DataAccess work)
  • PATH a C:oraclegBIN défini.
  • Ma machine n'a qu'un seul tnsnames.ora le fichier

si je déplace les noms.ora au même endroit que mon .exe fichier, il fonctionne. Pourquoi Oracle?DataAccess find tnsnames.ora dans le C:oraclegnetworkadmin répertoire mais Oracle.ManagedAccess ne peut pas?

32
demandé sur Rakshasas 2013-07-03 22:56:18

6 réponses

l'ordre de priorité pour la résolution des noms TNS dans ODP.NET, Managed Driver is this (see ici):

  1. alias source de données dans la section "sources de données" dans la section "fichier de configuration.net".
  2. alias source de données dans les noms de domaine.ora file à l'emplacement spécifié par' TNS_ADMIN ' dans le fichier de configuration .NET.
  3. alias source de données dans les noms de domaine.ora fichier présent dans le même répertoire que le .EXE.
  4. source de données alias in le tnsnames.Ora fichier présent à %TNS_ADMIN% (où %TNS_ADMIN% est un paramètre de variable d'environnement).
  5. alias source de données dans les noms de domaine.ora fichier présent à %ORACLE_HOME % \network\admin (où %ORACLE_HOME% est un paramètre de variable d'environnement).

je crois que la raison pour laquelle votre échantillon fonctionne avec Oracle.DataAccess mais pas avec Oracle.ManagedDataAccess signifie que la configuration basée sur le registre Windows N'est pas supportée pour ce dernier (voir documentation) - les ODP.NET l'installation définit une clé de registre ORACLE_HOME (HLKM\SOFTWARE\Oracle\Key_NAME\ORACLE_HOME) qui n'est reconnue que par la partie non gérée.

51
répondu metalheart 2013-11-18 14:41:15

essayez d'ajouter le chemin vers les noms de domaine.ero dans le fichier de configuration:

<?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.2.0\client_1\NETWORK\ADMIN\" />
      </settings>
    </version>
  </oracle.manageddataaccess.client>
</configuration>
12
répondu kolbasov 2013-08-06 07:05:54

pour éviter tout le désordre Oracle de ne pas savoir où il cherche les noms de TNS.ORA (j'ai ajouté la confusion de plusieurs versions D'Oracle et 32/64 bit), Vous pouvez copier le paramètre à partir de vos noms de tâches existants.ORA à votre propre fichier de configuration et utilisez-le pour votre connexion.

Dites que vous êtes satisfait de la référence "DSDSDS" dans les noms de domaine.ORA qui correspond à quelque chose comme:

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


Vous pouvez prendre le texte après le premier ' = ' et utiliser cela où que vous utilisiez 'DSDSD' et il n'aura pas besoin de trouver des noms de domaine.ORA pour savoir comment se connecter.

Maintenant, votre chaîne de connexion ressemblerait à ceci:

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
répondu user3902302 2016-10-05 16:02:42

j'avais le même problème......pour résoudre ce ce que j'ai fait était de désinstaller L'ODP. Net et re-install dans le même répertoire que Oracle server......avec l'option server, vous remarquerez que la plupart des produits sont déjà installés (tandis que l'installation de la base de données 12c) donc il suffit de sélectionner les autres fonctionnalités et finalement terminer l'installation....

veuillez noter que cette solution ne fonctionne que si vous avez installé 12c sur la même machine, c'est-à-dire sur votre portable............

si votre base de données est située sur la machine serveur autre que votre ordinateur portable, veuillez sélectionner l'option client et non le serveur et ensuite inclure TNS_ADMIN dans votre application.config et n'oubliez pas de spécifier la version...

depuis mon installation sur mon portable donc mon Application.la config est comme ci-dessous:

<?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
répondu Siddiqui 2014-03-22 16:02:58

Une fois que j'ai trouvé le format qu'il cherchait dans la chaîne de connexion, il fonctionnait très bien comme ceci avec Oracle.ManagedDataAccess. Sans avoir à jouer avec quoi que ce soit séparément.

DATA SOURCE=DSDSDS:1521/ORCL;
1
répondu Underground 2015-09-30 15:18:15

j'ai reçu le même message d'erreur. Pour résoudre ce problème, je viens de remplacer le Oracle.ManagedDataAccess assemblage avec l'ancien Oracle.DataAccess assemblée. Cette solution peut ne pas fonctionner si vous avez besoin de nouvelles fonctionnalités dans la nouvelle assemblée. Dans mon cas, j'ai beaucoup plus de problèmes prioritaires que d'essayer de configurer le nouveau Oracle assemblée.

-1
répondu Coleman 2015-10-06 07:43:48