Oracle.ManagedDataAccess查询在C#中失效但SQL Developer可正常运行
解决Oracle.ManagedDataAccess中“表或视图不存在”的问题
可能的原因及解决方案
1. 对象名称大小写不匹配
Oracle对带双引号的对象名称会严格区分大小写,不带双引号的名称则会自动转换为大写存储。
- 若你在SQL Developer中执行的是
SELECT * FROM "SCHEMA"."TABLE"(大写带引号),但C#代码里写的是SELECT * FROM ""schema"".""table""(小写带引号),Oracle会判定为不同对象,导致找不到。 - 解决方式:
- 若对象为默认创建(未用双引号),直接使用不带引号的大写名称:
SELECT * FROM SCHEMA.TABLE - 若对象是用双引号创建的特定大小写,严格匹配大小写并保留双引号:
SELECT * FROM "schema"."table"(需和创建时的大小写完全一致)
- 若对象为默认创建(未用双引号),直接使用不带引号的大写名称:
2. CURRENT_SCHEMA设置未正确生效
执行ALTER SESSION SET CURRENT_SCHEMA = schema后,必须在同一个会话连接中执行后续查询,且schema名称需匹配实际存储的大小写:
using (OracleConnection connection = new(_connectionString)) { await connection.OpenAsync(cancellationToken); // 先设置当前schema,注意名称大小写(默认创建的schema为大写) using (var setSchemaCmd = new OracleCommand("ALTER SESSION SET CURRENT_SCHEMA = SCHEMA", connection)) { setSchemaCmd.ExecuteNonQuery(); } // 无需指定schema,直接查询表(同样注意表名大小写) var sql = @"SELECT * FROM TABLE"; using (var cmd = new OracleCommand(sql, connection)) { cmd.ExecuteNonQuery(); } }
3. 验证权限与对象存在性
在C#中执行以下查询,确认目标对象是否对当前用户可见:
SELECT OWNER, TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'SCHEMA' AND TABLE_NAME = 'TABLE'
- 若查询无结果:说明当前用户
other_user没有该对象的访问权限,或对象名称/所有者拼写错误 - 若有结果:回到第一步检查查询语句的大小写问题
4. 确认连接字符串正确性
确保连接字符串中的User Id确实是拥有跨Schema查询权限的other_user,且Data Source指向正确的数据库实例,避免连接到错误环境。
内容的提问来源于stack exchange,提问作者Lóri Nóda
相关产品推荐
相关产品推荐

