在不同的模式中引用相同的表名

时间:2008-09-01 14:51:31

标签: .net sql oracle

我在基于.net 2.0的Windows应用程序中遇到Oracle Query问题。我正在使用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)

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

5 个答案:

答案 0 :(得分:2)

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

MyTempTable创建公共SYNONYM MyTempTable ;

此外,错误结果,错误数据,错误消息究竟是什么意思?


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

答案 1 :(得分:2)

连接到数据库问题上午

ALTER SESSION SET CURRENT_SCHEMA=abc;

其中abc是拥有表的用户。

答案 2 :(得分:1)

对于初学者,我建议您使用Oracle的.net数据提供程序 - 如果可能的话。如果你在一个项目中开始,这将是最好的方法来节省自己的痛苦。您可以从here

获取它们

答案 3 :(得分:1)

要扩展stjohnroe所说的内容,看起来你得到不同结果的原因是因为不同模式中存在两个具有相同名称的不同表。
通过将myDB用户名添加到查询的前面,您现在可以使用您期望的数据访问该表。 (因为你说数据不属于“myDB”,这可能意味着写入数据的app / proc也写入了错误的表格。) 决议是:
1.如果表格确实不属于“myDB”,请将其删除以保持整洁(现在运行代码时可能会发现904表未找到错误)
2.创建您真正想要访问的模式和表的同义词(例如,创建SYNONYM myTable FOR aschema.myTable;)
3.不要忘记从拥有该表的模式授予访问权限(例如:GRANT SELECT,INSERT,DELETE on myTable to myDB;(此处myDB指的是用户/模式))

答案 4 :(得分:0)

尝试添加

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

在连接字符串中。