2008-09-01 87 views
3

我在基于.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) 

我的限制是,因为这是一个通用的应用程序,我不能追加数据库名称,可以运行与任何数据库运行时间。请帮忙。

回答

2

这看起来像名称解析问题,请尝试在桌子上创建一个公共同义词:

CREATE PUBLIC SYNONYM MyTempTableMyTempTable;

另外,你究竟是什么意思错误的结果,错误的数据,错误信息?


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

+0

DBA不赞成公有同义词,因为它意味着数据库不能用于其他事情。 – 2011-06-04 21:51:58

0

尝试连接字符串中添加

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

1

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

1

为了扩大stjohnroe的说法,看起来你获得不同结果的原因是因为两个不同的表具有相同的名字存在于不同的模式中。
通过将myDB用户名添加到查询的前面,您现在可以使用您期望的数据访问该表。 (既然你说数据不属于“myDB”,这可能意味着正在写入数据的app/proc也写入错误的表)。
分辨率为:
1.如果该表确实没有对“MYDB”属于然后放下它tidyness缘故(现在当你运行你的代码,你可能会得到904个表中未发现错误)
2.创建与您真正想访问的模式和表的同义词(例如CREATE SYNONYM myTable for aschema.myTable;)
3。不要忘记从拥有该表的模式中授予访问权(例如:GRANT SELECT,INSERT,DELETE ON myTable TO myDB;(这里myDB指用户/模式))

2

当连接到数据库问题am

ALTER SESSION SET CURRENT_SCHEMA=abc; 

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

相关问题