Oracle
 sql >> Base de données >  >> RDS >> Oracle

VS2010 + pilote Oracle :ORA-12154 :TSN :impossible de résoudre l'identifiant de connexion spécifié

La meilleure solution que j'ai trouvée consistait à utiliser la bibliothèque Oracle Data Access Client et à inclure l'intégralité de l'entrée des noms TNS dans la chaîne de connexion. Cela permet au projet d'être facilement publié sur un serveur Web, ClickOnce, etc.

Voici les étapes nécessaires pour configurer le pilote Oracle fonctionnant dans votre projet :

1) Obtenir les DLL du package "Oracle Data Provider for .NET"

Téléchargez le fichier d'installation à partir de cet emplacement :http://www.oracle. com/technetwork/topics/dotnet/index-085163.html

Je suis allé de l'avant et j'ai installé l'ODAC complet de 200 Mo avec Oracle Developer Tools pour Visual Studio, mais vous n'avez vraiment besoin que de quatre DLL à partir de ce téléchargement. (Vous pourrez peut-être les extraire directement du package d'installation, au lieu de passer par tout le processus d'installation, ou peut-être que l'un des plus petits téléchargements les inclut tous.)

2) Référencez les DLL dans votre projet

Recherchez le répertoire d'installation d'Oracle Data Access Client et faites glisser les quatre DLL suivantes à la racine de votre projet :

  • Oracle.DataAccess.dll
  • oci.dll
  • oraciicus11.dll
  • OraOps11w.dll

Définissez la Copie vers le répertoire de sortie propriété tous les fichiers sauf Oracle.DataAccess.dll à Copier toujours .

Sous Projet --> Ajouter une référence... , cliquez sur Parcourir et sélectionnez le fichier Oracle.DataAccess.dll.

3) Utilisez le pilote avec la chaîne de connexion complète (facultatif)

Afin de ne pas avoir à me soucier de la configuration des fichiers de noms TNS sur les machines sur lesquelles l'application a été déployée, j'ai mis la définition complète dans le fichier comme indiqué par connectionstrings.com . Cela rend la chaîne de connexion un peu volumineuse, mais a supprimé de nombreux maux de tête liés au fichier TNS Names que je rencontrais auparavant :

Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=servername)(PORT=‌​1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=servicename)));User Id=username;Password=********;

Voici la classe complète que j'ai utilisée pour tester le pilote :

using System;
using System.Data;
using Oracle.DataAccess.Client;

static class Program
{
    [STAThread]
    static void Main()
    {
        TestOracle();
    }

    private static void TestOracle()
    {
        string connString = 
            "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)" + 
            "(HOST=servername)(PORT=‌​1521)))" +
            "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=servicename)));"+ 
            "User Id=username;Password=********;";
        using (OracleConnection conn = new OracleConnection(connString))
        {
            string sqlSelect = "SELECT * FROM TEST_TABLE";
            using (OracleDataAdapter da = new OracleDataAdapter(sqlSelect, conn))
            {
                var table = new DataTable();
                da.Fill(table);

                if (table.Rows.Count > 1) 
                    Console.WriteLine("Successfully read oracle.");
            }
        }
    }
}