VS2010 + Oracle驱动程序:ORA-12154:TSN:无法解析指定的连接标识符

时间:2010-11-19 19:40:22

标签: .net visual-studio oracle driver

我正在使用:

  • Visual Studio 2010
  • .Net Framework for Oracle数据提供程序
  • 适用于Visual Studio的Oracle开发人员工具(来自Oracle网站)

我尝试安装'Oracle Developer Tools for Visual Studio'并在我的C:\ app \ [我的用户名] \ product \ 11.2.0 \ client_1 \ Network \ Admin目录中创建了tnsnames.ora和sqlnet.ora文件。

他们看起来像这样:

# tnsnames.ora

ORATEST =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = dbs-oratest)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = [ORATEST])
    )
  )

# sqlnet.ora

SQLNET.AUTHENTICATION_SERVICES= (ALL)
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

当我尝试使用.Net Framework数据提供程序for Oracle驱动程序来设置新连接(或任何其他驱动程序:OLE,ODBC等)时,它会给出错误:

ORA-12154:TSN:无法解析指定的连接标识符

在没有的机器上使用OLE驱动程序安装了Oracle客户端但是可以工作:

OleDbConnection conn = new OleDbConnection(
    "Provider=MSDAORA;Data Source=ORATEST;" + 
    "Persist Security Info=True;Password=readonly;User ID=readonlyuser");

我做错了什么?在线是否有关于如何安装基本Oracle驱动程序的简单说明?

提前谢谢!

4 个答案:

答案 0 :(得分:4)

我找到的最佳解决方案是使用Oracle数据访问客户端库,并在连接字符串中包含整个TNS名称条目。这允许项目轻松发布到Web服务器,ClickOnce等。

以下是在项目中设置Oracle驱动程序所需的步骤:

1)从“Oracle Data Provider for .NET”软件包中获取DLL

从此位置下载安装程序文件:http://www.oracle.com/technetwork/topics/dotnet/index-085163.html

我继续使用适用于Visual Studio的Oracle Developer Tools安装了完整的200 MB ODAC,但您只需要从此下载中获得四个DLL。 (您可以直接从安装程序包中提取它们,而不是通过整个安装过程,或者可能是较小的下载之一包含所有这些。)

2)项目中的参考DLL

搜索Oracle Data Access Client的安装目录,并将以下四个DLL拖到项目的根目录中:

  • Oracle.DataAccess.dll
  • OCI.DLL
  • oraciicus11.dll
  • OraOps11w.dll

复制到输出目录属性设置为除Oracle.DataAccess.dll之外的所有文件始终复制

项目下 - > 添加引用... ,单击浏览选项卡,然后选择Oracle.DataAccess.dll文件。

3)使用带有完整连接字符串的驱动程序(可选)

为了不必担心在部署应用程序的机器上设置TNS名称文件,我将整个定义放在文件中,如connectionstrings.com所示。它使连接字符串有点笨重,但删除了我之前遇到的很多TNS名称文件头痛:

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

这是我用来测试驱动程序的完整类:

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

答案 1 :(得分:1)

您应该使用Oracle Data Access Client库,然后使用OracleConnection对象。

http://www.oracle.com/technology/sample_code/tech/windows/odpnet/howto/connect/index.html

我知道Oracle对TNS名称文件有点挑剔。我通常依靠DBA来做这件事。 SQL-Server更容易上手......

答案 2 :(得分:0)

使用本地IIS Web服务器而不是Visual Studio开发服务器(项目设置 - WEB)为我做了诀窍!

Tns-12154让我把头发拉出来...网站在VS2008中工作得很好......

此致

麦克

答案 3 :(得分:0)

我使用的代码就是上面的代码。

P.S。:我已多次测试过。使用Visual Studio .Net 2010(VB.Net 2010)。

Dim conn As New Odbc.OdbcConnection
Dim cmd As New Odbc.OdbcCommand
Dim drResult As Odbc.OdbcDataReader
Dim connString As String
Dim QuerySQL As String

connString = "Driver={Microsoft ODBC for Oracle};CONNECTSTRING=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ORACLEDB01)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORACLE_INSTANCE_NAME)));Uid=john;Pwd=mypassword;"
QuerySQL = "select first_name, last_name from employees where id = 28"

conn.ConnectionString = connString
conn.Open()
cmd.Connection = conn
cmd.CommandText = QuerySQL
drResult = cmd.ExecuteReader()

While drResult.Read
    TextBox1.Text = TextBox1.Text & drResult("last_name") & ", " & drResult("first_name") & Environment.Newline
End While
drResult.Close()