2017-01-27 48 views
3

我在實體框架中執行查詢以將LONG RAW數據選擇到字節數組中。實體框架SqlQuery在字節數組中選擇LONG RAW

var result = db.Database.SqlQuery<byte[]>("SELECT MESSAGE FROM FOCUS.ENTRIES"); 
var list = await result.ToListAsync(); 

當我執行這個代碼,我得到字節數組列表,但個個都是空的。在數據庫中它們不是空的。

消息表看起來是這樣的:

CREATE TABLE "FOCUS"."ENTRY" 
    ( "PRIMKEY" NUMBER, 
    "TITLE" VARCHAR2, 
    "MESSAGE" LONG RAW 
); 

我使用ODP.NET,管理驅動程序爲DB提供程序。

我想這是一些映射問題,但我無法弄清楚。

任何幫助將受到歡迎。

謝謝!

+0

'FOCUS21.LOGBOOK'的解釋是什麼?您使用什麼數據庫提供程序用於EF? – Richard

+0

看看[this](http://stackoverflow.com/questions/8014913/retrieving-a-byte-array-from-a-long-raw-from-oracle-db)或[this](http:// stackoverflow.com/questions/9277262/read-image-stored-in-oracle-using-long-datatype)幫助你 –

+0

@ElmerDantas我看過它。問題是我正在使用實體框架。您提供的鏈接使用ADO.net .. – yadejo

回答

2

SqlQuery希望class的成員名稱等同於SQL列。從Oracle文檔

public class MessageInfo{ 
    public byte[] Message; 
} 

var result = await db.Database 
    .SqlQuery<MessageInfo>("SELECT MESSAGE FROM FOCUS.ENTRIES") 
    .ToListAsync(); 
var list = result.Select(x => x.Message); 

幾個音符,https://docs.oracle.com/html/A96160_01/features.htm

當創建OracleDataReader含有LONG或LONG RAW類型, OracleDataReader推遲的LONG或LONG RAW列數據的提取。 客戶端讀取的LONG或LONG RAW 的字符的初始字符數取決於OracleCommand的InitialLONGFetchSize 屬性。默認情況下,InitialLONGFetchSize爲0.

ODP.NET不支持CommandBehavior.SequentialAccess。因此, LONG和LONG RAW數據可以隨機取出。

要獲取超出InitialLONGFetchSize字節或字符的數據,必須在所選列的列表中提供 主鍵列。 當在OracleDataReader對象上調用適當的 類型的訪問器方法(GetOracleString for LONG或GetOracleBinary for LONG RAW)時,將從數據庫中獲取所請求的數據。

因此,請嘗試添加主鍵並查看是否可以檢索數據。否則,如果無法更改配置,則必須跳過SqlQuery並直接使用ODP.NET進行提取。或者您將不得不創建OracleConnection的實例,並將其作爲參數傳入您的DbContext的構造函數中。

+0

我已經嘗試過。相同的結果... – yadejo

+0

@yadejo你讀過這個http://stackoverflow.com/questions/2644572/c-sharp-how-to-get-oracle-long-raw-type-value? –