我在基于 .net 2.0 的 Windows 应用程序中遇到 Oracle 查询问题。我在用 System.Data.OracleClient 连接到oracle数据库。数据库名称是 myDB. 。在我正在使用的连接字符串下方:

Data Source=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)
(HOST =  172.16.0.24)(PORT = 1522)))(CONNECT_DATA =(SERVICE_NAME = ORCL)));
User ID=myDB;Password=myDB;Unicode=True

如果我运行下面的查询,那么它将给出错误的结果(这里错误的结果意味着不正确的数据。该数据不属于 myDB):

SELECT ID, NAME  
FROM MyTempTable
WHERE ID IN (10780, 10760, 11890)

但是如果我附加数据库名称,它会给出正确的结果:

SELECT ID, NAME
FROM "myDB".MyTempTable
WHERE ID IN (10780, 10760, 11890)

我的限制是我无法附加数据库名称,因为这是一个通用应用程序,可以在运行时与任何数据库一起运行。请帮忙。

有帮助吗?

解决方案

这看起来像是名称解析的问题,请尝试在表上创建公共同义词:

创建公共同义词 我的临时表 为了 我的临时表;

另外,你到底是什么意思 错误的结果, 、数据错误、错误信息?


编辑:所需表所属的架构名称是什么?听起来您尝试从中选择的表与属于您所连接的用户的表处于不同的架构中。

其他提示

连接到数据库后出现问题

ALTER SESSION SET CURRENT_SCHEMA=abc;

其中 abc 是拥有这些表的用户。

对于初学者,我建议您使用 Oracle 的 .net 数据提供程序 - 如果可能的话。如果你刚开始一个项目,这将是避免你日后痛苦的最好方法。你可以从 这里

扩展 stjohnroe 所说的内容,您得到不同结果的原因似乎是因为不同模式中存在两个具有相同名称的不同表。
通过将 myDB 用户名添加到查询的前面,您现在可以访问包含所需数据的表。(既然你说数据不属于“myDB”,这可能意味着正在写入数据的应用程序/过程也写入了错误的表)。
决议是:
1.如果该表确实不属于“myDB”,那么为了整洁起见将其删除(现在,当您运行代码时,您可能会收到 904 table not found 错误)
2.创建您真正想要访问的模式和表的同义词(例如 CREATE SYNONYM myTable FOR aschema.myTable;)
3.不要忘记从拥有该表的模式授予访问权限(例如:将 myTable 上的选择、插入、删除权限授予 myDB;(这里 myDB 指的是用户/模式))

尝试添加

CONNECT_DATA=(SID=myDB)(SERVICE_NAME=ORCL)

在连接字符串中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top