ORA-12154本质是.NET Core未找到或未正确解析tnsnames.ora:Oracle.ManagedDataAccess默认不读该文件,需显式设TNS_ADMIN(进程启动前)、确保UTF-8无BOM、别名顶格且大小写严格匹配;优先用直连字符串绕过解析。
ora-12154 不是数据库连不上,而是 .net core 进程根本没找到或没读对 tnsnames.ora —— 它连“去哪查”都不知道。
这决定你该不该折腾 tnsnames.ora:
Oracle.ManagedDataAccess(.NET Core 推荐),它默认不读 tnsnames.ora,只认连接字符串里的完整地址;改文件无效Oracle.DataAccess(旧版非托管驱动),它才依赖本地 Oracle Client 和 tnsnames.ora,但需确保加载的 oci.dll 来自你配置的路径(可用 Process Explorer 查进程加载的 dll 路径)哪怕你用了 Oracle.ManagedDataAccess,某些版本或场景下仍会尝试读取(尤其配合 sqlnet.ora 时),所以必须确保变量被 .NET Core 进程实际继承:
Environment.SetEnvironmentVariable("TNS_ADMIN", @"C:oracleinstantclient_21_12NETWORKADMIN");
set TNS_ADMIN=xxx —— IDE 启动、IIS 托管、Windows 服务都不会自动继承Environment.GetEnvironmentVariable("TNS_ADMIN") 必须返回非空路径,否则整个目录被跳过哪怕路径对了,一个不可见字符就让解析失败,报错仍是 ORA-12154,且不提示具体哪行错:
ORCL = 是错的,ORCL= 才对# 开头(不是 !);右括号必须换行闭合tnsnames.ora 里写的是 ORCL=,连接字符串里就不能写 orcl
开发阶段优先用直连格式,彻底排除名称解析链路干扰:
Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.10)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)));User Id=scott;Password=tiger;
orclpdb1),别误写成 SIDsqlnet.ora,且含 names.directory_path = (tnsnames),否则别名直接失效真正容易被忽略的点是:tnsping 成功 ≠ 应用能连 —— tnsping 用的是你命令行环境下的 Oracle Client,而 .NET Core 进程可能加载了另一个 Instant Client 或完全没读 TNS_ADMIN。验证必须落到进程内,而不是外部工具输出。