Windows下VB.Net连接Oracle 21c XE失败问题求助
在Windows 11机器上安装了Oracle Database 21c Express Edition,已通过SQL Plus创建表空间和具备DBA权限的用户,同时配置了tnsnames.ora。相关SQL命令如下:
/* Creating Tablespace*/ create tablespace ts_Trading DATAFILE 'D:\Database\OracleTest\ORATest.dbf' size 10m autoextend on maxsize 1024m extent management local uniform size 64k /* Creating User */ create user ####### identified by ####### default tablespace ts_Trading temporary tablespace temp quota unlimited on ts_Trading quota 0 on system / grant DBA to #######
已通过SQL Plus使用#######/*****@XE格式成功测试新用户连接,tnsping工具也验证了Oracle客户端连通性。但使用.Net 6框架搭配OracleManagedDataAccess.Core的VB.Net窗体应用连接失败,代码如下:
Imports System.Data.OracleClient Imports Oracle.ManagedDataAccess.Client Imports Oracle.ManagedDataAccess.Types Public Class frmOracle Private Sub frmOracle_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim oradb As String = "Data Source=XE;User Id=#######;Password=*****;" Dim conn As New OracleConnection(oradb) conn.Open() End Sub End Class
报错信息:
Oracle.ManagedDataAccess.Client.OracleException: 'ORA-12154: Cannot connect to database. Cannot find alias XE in DataSources, , EZConnect'
直接使用EZConnect格式连接字符串
绕过tnsnames.ora的依赖,改用EZConnect格式编写连接字符串,两种写法可选:' 完整DESCRIPTION格式 Dim oradb As String = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XE)));User Id=#######;Password=*****;"或者更简洁的短格式:
Dim oradb As String = "Data Source=localhost:1521/XE;User Id=#######;Password=*****;"让OracleManagedDataAccessCore读取到正确的
tnsnames.ora
OracleManagedDataAccessCore读取配置文件的逻辑和传统Oracle客户端不同,可通过两种方式指定tnsnames.ora路径:- 在项目的
appsettings.json(或app.config)中添加配置节点,替换为你实际的tnsnames.ora所在目录:{ "OracleConfiguration": { "TnsAdmin": "D:\\Oracle\\product\\21c\\homes\\OraDB21Home1\\network\\admin" } } - 设置系统环境变量
TNS_ADMIN,指向tnsnames.ora所在目录,重启Visual Studio后再运行项目。
- 在项目的
检查OracleManagedDataAccess.Core版本兼容性
确保安装的NuGet包版本与Oracle 21c兼容,建议升级到最新稳定版,避免版本不匹配导致的连接问题。移除冲突的命名空间引用
代码中引用的System.Data.OracleClient是微软已弃用的Oracle客户端组件,与Oracle官方的Oracle.ManagedDataAccess.Client可能存在冲突,直接删除该引用即可。
内容的提问来源于stack exchange,提问作者Abu Ben Reaz

