2014-03-28 54 views
2

我只是嘗試簡單使用oracle db與C#連接。應該沒什麼大不了的。但它總是失敗。它在MS-Access中工作。哪裏有問題 ? (OLEDB或ODBC沒什麼區別就在這裏,我想兩者)爲什麼在Oracle中SQL連接失敗?

編輯:

  • 可能會Oracle版本是什麼問題? (好像我們使用8.1.7.0.0和8.1.5.0.0模塊)

代碼:

using System; 
using System.Data.Odbc; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string n = Environment.NewLine + "--------------------------------" + Environment.NewLine + Environment.NewLine; 

      // connect 
      string connectionString = "dsn=TEST;uid=read;pwd=myPwd"; 
      OdbcConnection connection = new OdbcConnection(connectionString); 
      connection.Open(); 

      // select (key is actually text not numeral) 
      string query = "select * from INFOR.ZEITEN where (KEY = 0)"; 
      query = "select a.KEY, b.GREG from INFOR.ZEITEN a inner join INFOR.ZEITEN b on (a.AUSWEIS = b.AUSWEIS) where (a.KEY like '1')"; 

      try 
      { 
       query = query.Replace(Environment.NewLine, " "); 
       Console.WriteLine(n + query); 
       OdbcCommand command = new OdbcCommand(query, connection); 
       OdbcDataReader reader = command.ExecuteReader(); // throws exception 
       if (reader != null) 
        Console.WriteLine(n + "success, now read with reader!"); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(n + e.Message + n + e.StackTrace); 
      } 

      // wait 
      Console.ReadKey(); 
     } 
    } 
} 

輸出:

enter image description here

而成功,簡單的選擇:

enter image description here

+3

這似乎與C#沒有任何關係。如果兩個SQL語句之一失敗,您應該檢查它是否有效。您是否嘗試過使用查詢工具執行語句? –

+0

@PanagiotisKanavos是的,我知道。你告訴那些昨天當我問我爲什麼在oracle_上失敗的SO用戶時!他們想看看C#代碼。 – Bitterblue

+1

你正在使用什麼驅動程序版本,以及你連接的數據庫版本是什麼?有可能其中的一個太舊以至於無法支持'join'語法。這看起來不太可能,但我們似乎仍然對8i有疑問,所以誰知道。 (你還可以在Pro * C中設置'dbms = v8',它也有這個效果)。 –

回答

4

ANSI加入(例如inner join)在9i中首次得到支持。您將需要使用舊的語法:

select a.KEY, b.GREG 
from INFOR.ZEITEN a, 
     INFOR.ZEITEN b 
where (a.AUSWEIS = b.AUSWEIS) 
     and (a.KEY like '1') 

注意,like運算符相當於=在這種情況下,但你可能知道,

+0

這似乎是正確的。現在,當我改變語法時,我的連接查詢失敗了。我可以使用舊的語法來使用各種連接嗎?還是有一些限制? – Bitterblue

+0

「(+)」支持左/右外連接,但不支持全外連接。這裏有一些信息:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6585774577187 – Joe

1

單詞key是保留字。這意味着對於身份來說這是一個非常糟糕的選擇。您需要用雙引號將其轉義。這可能會實現:

 query = "select a.\"KEY\", b.GREG 
       from INFOR.ZEITEN a inner join 
         INFOR.ZEITEN b 
         on (a.AUSWEIS = b.AUSWEIS) 
       where (a.\"KEY\" like '1')"; 

我猜\"會在這方面的工作,但也有可能是插入這個角色的另一種方法。

+0

會喜歡'1'是有效的? – brumScouse

+1

如果是這樣的話,第二個陳述不應該失敗嗎? –

+0

@JeffRosenberg。 。 。他們都應該失敗。 'KEY' *真的是* SQL中的保留字。這很好奇。這裏有一個簡單的例子:http://www.sqlfiddle.com/#!4/6010c/3。 –

1

我認爲KEY是數字,那麼你不能使用LIKE。這是因爲WHERE KEY = 0工作正常。

+0

'KEY'是文本。我自己創建了該表來進行測試和調試。 – Bitterblue

0

有什麼錯誤?你可以編輯你的問題,並添加系統拋給你的實際錯誤嗎?首先,我個人推薦使用ODP .NET(用於.NET的Oracle數據提供程序)。您可以下載最新版本的Oracle 12c here。或者查看您需要的版本。 ODBC是用C編寫的非常舊的驅動程序,它使用本機Windows RPC技術工作。 對於完整的.NET支持,您最好使用ODP .NET。 其次,檢查是否有任何限制導致sql失敗的表。

+1

這並沒有真正回答這個問題。大多數(如果不是全部的話)應該是評論。 –

+0

@AlexPoole我認爲這通過了答案。據我瞭解,有選擇使用額外的軟件包,可以幫助我避免我遇到的版本問題...?其實我不願意使用額外的軟件包/驅動程序。這增加了更多的依賴性。因爲我有解決方法去使用舊的語法。 – Bitterblue