用C#链接Oracle Database总是出错(ORA-12154: TNS: 无法解析指定的连接标识符)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C#链接Oracle Database总是出错(ORA-12154: TNS: 无法解析指定的连接标识符)相关的知识,希望对你有一定的参考价值。

抛出的exception是ORA-12154: TNS: 无法解析指定的连接标识符。
我写的代码是:
class Program

static void Main(string[] args)

string connectionString = " User Id=HR; Password=xxxxxx; Data Source=ORCL";
OracleConnection connection = new OracleConnection(connectionString);
connection.Open();
Console.WriteLine("ServerVersion: " + connection.ServerVersion
+ "\nDataSource: " + connection.DataSource);
Console.ReadKey();



三个问题:第一,我下载了ODP.NET package,是for 11g的。我的数据库是10g的。这个会不会是问题?
第二,用户名和密码是HR,和XXXX,我只用过登录iSQL*Plus,不知道是不是可以用在这里。
第三,ORCL是instance name,在tnsnames.ora里面有对应信息,如下:
# tnsnames.ora Network Configuration File: C:\oracle\product\10.2.0\db_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.

ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 150.212.4.31)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
(后面还有其他信息,省略了。)
会不会是这个ORCL使用错误,如果是的话,data source后面应该跟什么string呢?

非常感谢~

你的问题主要是找不到服务器。
你的监听文件监听的是你的ip地址,你有两个选择,要么把监听程序改为你的本机地址localhost或127.0.0.1 (建议你用这个,因为如果你监听的是ip的话,你拔掉网线,你的Oracle会出问题的)如果这么做的话,还要在lisnter.ora文件中把相应的地址改为你的本机地址。这时候再运行你的程序就应该没问题了。
如果你不想改这里,那你在程序里这样写应该可以DataSource=(ADDRESS=(PROTOCOL=TCP)(HOST=ipadress)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl))
不过这是就相当于是远程连接了
参考技术A 按你的描述,DataSource后面就是跟这个ORCL
你的连接字符串是没有问题的

你在C#这台机器上用SqlPlus连接一下ORCL,看能不能连上?
或者装一个PLSQL,连接一下ORCL,如果能连接上,那C#也应该能连上

如果连不上,那就要先配置好Oracle
参考技术B string connectionString ="Data Source=orcl;user=HR;password=xxxxx"

映射数据类型 Oracle 和 C# 时出错

【中文标题】映射数据类型 Oracle 和 C# 时出错【英文标题】:Error mapping data type Oracle and C# 【发布时间】:2018-04-28 06:44:30 【问题描述】:

我有一个带有ID NUMBER(18) 的表,我有一个带有public Int64 ID get; set; 属性的类来映射ID 形式C# 与Oracle。

我的表定义

但是当我得到这样的最大 ID 时出现错误:

    运行查询

    从 MYTABLE 中选择 MAX(ID) ID

    系统抛出错误:

    “'System.Decimal' 类型的对象无法转换为 'System.Int64' 类型。”

    但是当我像这样运行查询时:

    从中选择 ID( 按 ID DESC 从 MYTABLE 订单中选择 ID ) 其中 ROWNUM =1

    没关系。

我不知道为什么(1)抛出错误,为什么(2)完成?

数据类型 (1) 和 (2) 有什么区别?

【问题讨论】:

@lad2025: 查询 1 和 2 返回相同的值,为什么 1 错误和 2 完成? 请发布您的表格定义。看起来列元数据有问题 【参考方案1】:

可能的情况 1:

我猜你的表中有 NULL 值(所以你的两个查询不等价):

SELECT MAX(ID) ID FROM T_00_RQMM  -- aggregate func ignore NULLS

但是:

SELECT ID FROM(SELECT ID FROM T_00_RQMM ORDER BY ID DESC) WHERE ROWNUM = 1;  
-- NULL is the max value

DBFiddle Demo

无论如何你应该尝试映射:

using System.Numerics;
...
public BigInteger ID  get; set; 

编辑:

可能的情况 2:

可能是数据类型有问题(然后使用显式CAST):

SELECT CAST(MAX(ID) AS NUMBER(18,0)) ID FROM T_00_RQMM 

DBFiddle Demo 2

完整演示:

CREATE TABLE T_00_RQMM (ID NUMBER(18,0));
INSERT INTO T_00_RQMM VALUES(NULL);
INSERT INTO T_00_RQMM VALUES(100);

CREATE TABLE t1 AS SELECT MAX(ID) ID FROM T_00_RQMM;

CREATE TABLE t2 AS SELECT ID FROM(SELECT ID FROM T_00_RQMM ORDER BY ID DESC) 
                                  WHERE ROWNUM = 1;

CREATE TABLE t3 AS SELECT CAST(MAX(ID) AS NUMBER(18,0)) ID FROM T_00_RQMM;


SELECT TABLE_NAME, COLUMN_NAME, DATA_PRECISION, DATA_SCALE
FROM all_tab_cols
where table_name in ('T1', 'T2', 'T3')
ORDER BY Table_name;

输出:

+------------+-------------+----------------+------------+
| TABLE_NAME | COLUMN_NAME | DATA_PRECISION | DATA_SCALE |
+------------+-------------+----------------+------------+
| T1         | ID          | null           | null       |
| T2         | ID          | 18             | 0          |
| T3         | ID          | 18             | 0          |
+------------+-------------+----------------+------------+

【讨论】:

不,我已经仔细检查过了,它不为空。查询 1 和 2 返回相同的值。但是不知道为什么 1 抛出错误 @HongVanVit 好的,当使用MAX 数据类型为NUMBER 而不是NUMBER(18) 时,它看起来像元数据问题

以上是关于用C#链接Oracle Database总是出错(ORA-12154: TNS: 无法解析指定的连接标识符)的主要内容,如果未能解决你的问题,请参考以下文章

Oracle Database 下载第一个压缩文件就安装了,导致出错,该怎么办呢?

c# Timer编程出错

映射数据类型 Oracle 和 C# 时出错

大家帮我看看这个程序,我觉得没有错呀,可是链接时总是显示出错

C# 无法向Oracle数据库插入数据

C#中用datagridview显示ACCESS数据库中的“是不是”字段时总是出错!!