【问题标题】:Oracle database TNS The value's length for key 'data source' exceeds it's limit of '128'Oracle 数据库 TNS 键“数据源”的值长度超过了“128”的限制
【发布时间】:2014-09-12 20:52:06
【问题描述】:

所以我有一个到 Oracle 数据库的连接字符串,基本上我直接从 sql developer 复制了它,然后剪掉了空白。

我稍后以编程方式添加用户名和密码。问题是当我尝试打开 SQLConnection 对象时。我得到了错误:

The value's length for key 'data source' exceeds it's limit of '128'

我对 oracle TNS 连接知之甚少。我使用了这个连接字符串,因为当我粘贴它并测试连接时它在向导中工作。而你看到的基本上就是我粘贴 TNS 名称后 Visual Studio 生成的内容。

Data Source="(DESCRIPTION=(ADDRESS= (PROTOCOL=TCP)
(HOST=qprd-scan.website.com)(PORT=3726))(CONNECT_DATA=(SERVER=dedicated 
(SERVICE_NAME=DBprd_developer)))";

这个数据源键已经有大约 160 个字符了。

我在看this post on the MSDN forums.

这家伙基本上说要从数据源中删除一些其他部分并将它们放在其他地方。我只是不确定该怎么做。

The MSDN on connection strings 并没有真正告诉我太多。

The MSDN on Connection strings and configuration files 也没有帮助。

如果被问到,我很乐意展示更多来自 app.config 的代码或内容

【问题讨论】:

标签: c# sql oracle visual-studio-2012 tnsnames


【解决方案1】:

您尚未向我们展示用于连接数据库的完整代码,但从评论到另一个答案似乎您正在使用 OLE DB。我会避免使用它,特别是如果它似乎对数据源有 128 个字符的任意限制。

我还要指出,您还可以避免安装 Oracle 客户端,正如另一位回答者所建议的那样。我对“即时”客户端没有太多经验,但完整的客户端需要大量下载,而且不仅仅是为了能够将 C# 程序连接到 Oracle。

相反,我们可以使用 Oracle 托管数据访问库。您可以使用 NuGet 安装它。为此:

  • 转到工具 > 库包管理器 > 包管理器控制台,
  • 确保在“默认项目”下拉列表中选择了正确的项目,
  • 输入

    Install-Package odp.net.managed
    

这应该添加从 NuGet 下载库并将 Oracle.ManagedDataAccess 添加到项目的引用。

然后,如果为Oracle.ManagedDataAccess.Client 添加using 指令,则以下代码应与Oracle 数据库通信:

string connStr = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<hostname>)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=<service_name>)));User Id=<user>;Password=<password>";
Console.WriteLine("Connection string has length " + connStr.Length);
using (var connection = new OracleConnection() { ConnectionString = connStr })
{
    connection.Open();
    OracleCommand command = new OracleCommand("SELECT * FROM DUAL", connection);
    using (OracleDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            Console.WriteLine(reader.GetString(0));
        }
    }
}

【讨论】:

  • 这看起来很不错。我肯定会测试它,与此同时,有没有办法读取二维字符串数组?其实现在我很好奇它会以什么格式返回多列数据。
  • @AlexanderRyanBaggett:请就二维字符串数组提出一个单独的问题。
  • 我正在使用 Oracle.ManagedDataAccess.Client,但我仍然遇到这个问题。我想避免使用完整的 oracle 客户端,但这意味着 TnsNames.ora 文件中的数据源定义被塞进了连接字符串中。
  • @PhilJollans:如果您使用的是 Oracle Managed Data Access 并且仍然达到 128 个字符的限制,请提出单独的问题。还请包括您用于连接数据库的代码,以及任何异常的完整堆栈跟踪。如果我或其他任何人只需要继续上面的评论,那根本不可能帮助你。
  • 我同意并且我已经这样做了here,谢谢。
【解决方案2】:

这是我通过自定义企业库访问的 ODP.NET 的 app.config 的样子(我将 EnterpriseLibrary5.0 的数据层从 System.Data.OracleClient 转换为 ODP.NET 的 Oracle.DataAccess.Client。请注意publickey 是我自己制作的唯一的,版本也是我自己的版本号)。为什么要自定义呢,那是因为System.Data.OracleClient超过32kb就不能处理CLOB了。

<configSections>
  <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, Version=5.1.0.0, Culture=neutral, PublicKeyToken=4133a635bb2789db" requirePermission="true" />
</configSections>

<dataConfiguration defaultDatabase="DatabaseConnectionString" />
<connectionStrings>
    <add name="DatabaseConnectionString" connectionString="Data Source=TestDb;Persist Security Info=True;User ID=Usrname;Password=Pwd!;Max Pool Size=500;" providerName="Oracle.DataAccess.Client" />        
</connectionStrings>

还有我在 tnsnames.ora 文件中的 TNS

TestDb=
  (DESCRIPTION=
    (ADDRESS=
      (PROTOCOL=TCP)
      (HOST=10.10.10.1)
      (PORT=1234)
    )
    (CONNECT_DATA=
      (SID=TestDb)
    )
  )

希望 app.config 和 tnsnames.ora 能帮助你解决这个问题。

【讨论】:

  • 我从未使用过 .ora 文件。嗯,我把文件放在解决方案的哪个位置有关系吗?
  • 您在 VS 解决方案中使用 oracleclient 的 oracle 文件。这是您的 oracle 客户端的连接映射。 product\12.1.0\client_3\Network\Admin\tnsnames.ora
  • 你已经安装了oraclie client,对吧?
  • 不,我从未使用过 ODP.net。我只是在为 OLE DB 使用 vanilla Visual Studio oracle 提供程序。
猜你喜欢
  • 2016-09-13
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 1970-01-01
  • 2020-07-01
相关资源
最近更新 更多