2012-02-26 72 views
0

我正在從.NET應用程序訪問Oracle數據庫。我的代碼結構如下:Oracle SQL語句不能從DB獲取

using (OracleConnection conn = new OracleConnection(Oradb)) 
{ 
    conn.Open(); 

    string sql = "SELECT RI_DESCRIPTION 
        FROM RI_RISK 
       WHERE RI_CODE = 'GAIL'"; 
    OracleCommand cmd = new OracleCommand(sql, conn); 
    cmd.CommandType = CommandType.Text; 

    OracleDataReader dr = cmd.ExecuteReader(); 
    dr.Read(); 

    var result = dr.GetString(0); 

    Assert.AreEqual("Golden Arches Insurance", result); 
} 

現在,我不能讓這個語句返回任何東西 - 斷言失敗,結果=「」;

但是,我能得到這個語句返回的期望是什麼:

string sql = "SELECT CLI_ABBRNAME 
       FROM CLI_CLIENT 
       WHERE CLI_CLIENTNUMBER = 00404"; 

我已經檢查了若干倍,表和列名是否正確。我能看到的唯一區別是數據類型:

  • RI_DESCRIPTION是LONG
  • RI_CODE是VARCHAR2
  • CLI_CLIENTNUMBER是VARCHAR2
  • CLI_ABBRNAME是VARHCHAR2

因此,是不是我必須處理我沒有在代碼中執行的LONG操作?

此外,CLI_CLIENTNUMBER實際上是一個VARCHAR2,爲什麼我不需要在00404左右的單引號,而對於RI_CODE這是VARCHAR2我顯然需要圍繞'GAIL'的撇號(否則我會得到一個無效標識符例外

**編輯

聲明中完美的作品以及對SQL加上

**編輯 - ?解答

這一招,在答案的鏈接下面,是設置OracleC ommand對象InitialLONGGetchSize爲-1。

+0

的DB似乎是一個爛攤子:描述不應該是一個數(LONG),和一個數字(LONG)不能是「金色拱門保險」 。 – 2012-02-27 00:11:28

+1

直接針對數據庫運行sql(不是來自您的應用程序) - 驗證您是否獲得了預期的結果 – 2012-02-27 00:38:44

回答

1

一,你不應該使用LONG。您應該將此字段轉換爲CLOB。 LONGs已被棄用。

如果您使用的是ODP.NET,我在"Obtaining LONG and LONG RAW Data"上找到了這個。它看起來像一個參數,InitialLONGFetchSize,內在地設置爲0,你需要增加它來檢索LONG。

而且,從技術上講,您確實需要引號,但由於您將列與數字進行比較,我認爲存在隱式轉換。你在做什麼就相當於:

SELECT CLI_ABBRNAME 
    FROM CLI_CLIENT 
WHERE TO_NUMBER(CLI_CLIENTNUMBER) = 404 
+0

這是修復它!我非常感謝你的幫助,夥伴。 – Hanshan 2012-02-27 02:42:35