从 C# 访问 Oracle 数据库

Posted

技术标签:

【中文标题】从 C# 访问 Oracle 数据库【英文标题】:Accessing Oracle Database from C# 【发布时间】:2009-06-30 13:53:48 【问题描述】:

我有一个使用 System.Data.OracleClient 访问 oracle 数据库的 C# 程序。

代码使用 OracleCommand、OracleDataReader 对象。它使用 TNS 名称来引用特定的 oracle 服务器(在 tnsnames.ora 文件中定义)。

它在我的电脑上运行良好。然后我将二进制文件复制到另一台计算机,运行时遇到错误:

TNS:无法解析指定的连接标识符。

另一台计算机安装了相同版本的 oracle 客户端,并且 tnsnames.ora 的相同副本放在 oracle network/admin 文件夹中。另一台计算机也安装了 SQLDeveloper,我可以使用其 SQLDeveloper 中的这些 TNS 名称连接到 Oracle 服务器。

为什么c#程序抱怨无法解析TNS标识符?

我使用的连接字符串(硬编码到我的 c# 程序中)是 ;

"数据源=TNS 名称;用户 ID=user;密码=pass;"

谢谢

【问题讨论】:

我知道这并不能回答您的问题,但作为仅供参考,System.Data.OracleClient 已被弃用。 blogs.msdn.com/adonet/archive/2009/06/15/… 【参考方案1】:

打开一个命令窗口,输入tnsping yourdbname并回车,你应该会得到一堆信息,但你要查找的是

使用的参数文件:

C:\Oracle\product\10.1.0\Client_1\network\admin\sqlnet.ora

或类似的东西,这是系统上的“默认”Oracle 客户端,确保这与您拥有 tnsnames.ora 的路径相同(在我的情况下,我们使用 sqlnet.ora)

有时多个 Oracle 产品安装会产生多个潜在的 ORA_HOME,您至少可以确认“活动”客户端,这样您就可以确定文件在正确的位置。

另外,你可以使用 SQLPlus 连接到数据库吗?

【讨论】:

同意多房的可能性 很好的答案!每次我遇到类似的问题时,要么是路径中有多个家,要么是 sqlnet.ora 中的设置不正确。【参考方案2】:

是否无法定位或加载 tnsnames.ora 文件?尝试运行 ProcessMonitor (http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx),然后运行您的 c# 程序。您可以查看是否找不到.ora文件。

【讨论】:

【参考方案3】:

您还可以通过将环境变量 TNS_ADMIN 设置为您的 tnsnames.ora 和 sqlnet.ora 文件的位置(默认为 ORACLE_HOME/network/admin)来强制所有 Oracle 在固定位置查找网络文件。

那么您不必担心猜测您当前正在运行的特定 Oracle 进程正在使用哪个网络/管理文件夹。

【讨论】:

【参考方案4】:

最终我的问题是我的机器上安装了多个 Oracle 实例,并且需要更新我不知道的第三个 tnsnames.ora 文件。

不管怎样,我在运行tnsping [dbName] 时得到了误报响应。这是有用的信息,但需要进一步调查。去检查Windows环境变量的时候才注意到另一个Oracle路径,发现第三个tnsnames.ora

【讨论】:

以上是关于从 C# 访问 Oracle 数据库的主要内容,如果未能解决你的问题,请参考以下文章

C# 访问Oracle数据库

从访问中读取多值列到c#

C# 数据库访问:DBNull 与 null

从 C# 调用 Oracle 存储过程?

从 Oracle PL/SQL 匿名块填充 C# 数据表

c#从oracle函数中返回参数