2008-09-01 102 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是擁有這些表的用戶。

相關問題