【问题标题】:Entity Framework SqlQuery Select LONG RAW into byte array实体框架 SqlQuery 将 LONG RAW 选择为字节数组
【发布时间】:2017-06-12 21:30:25
【问题描述】:

我正在 Entity Framework 中执行查询以将 LONG RAW 数据选择到字节数组中。

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

当我执行这段代码时,我得到一个字节数组列表,但它们都是空的。在数据库中它们不是空的。

MESSAGE 表如下所示:

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

我正在使用 ODP.NET,托管驱动程序作为数据库提供程序。

我猜这是一些映射问题,但我无法弄清楚。

欢迎任何帮助。

谢谢!

【问题讨论】:

  • FOCUS21.LOGBOOK的定义是什么?您为 EF 使用的 DB Provider 是什么?
  • 看看thisthis对你有没有帮助
  • @ElmerDantas 我看过了。问题是我正在使用实体框架。您提供的链接使用 ADO.net..
  • 当您使用异步方法时,您是否尝试将 byte[] 更改为 Task ?只是想知道......

标签: c# .net entity-framework oracle11g


【解决方案1】:

SqlQuery 需要一个 class,其成员名称等同于 SQL 列。

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 );

Oracle Docs 中的一些注释,https://docs.oracle.com/html/A96160_01/features.htm

创建包含 LONG 或 LONG RAW 类型的 OracleDataReader 时, OracleDataReader 延迟获取 LONG 或 LONG RAW 列数据。 LONG 的初始字符数或 LONG RAW 的字节数 在客户端获取取决于 InitialLONGFetchSize OracleCommand 的属性。默认情况下,InitialLONGFetchSize 为 0。

ODP.NET 不支持 CommandBehavior.SequentialAccess。所以, 可以随机获取 LONG 和 LONG RAW 数据。

要获取 InitialLONGFetchSize 字节或字符之外的数据, 必须在所选列的列表中提供主键列。 在适当的时候从数据库中获取请求的数据 类型化访问器方法(GetOracleString 用于 LONG 或 GetOracleBinary 用于 LONG RAW) 在 OracleDataReader 对象上调用。

所以尝试添加主键,看看是否可以检索数据。否则,如果您无法更改配置,您将不得不跳过 SqlQuery 并直接使用 ODP.NET 获取。或者您将不得不创建OracleConnection 的实例并将其作为参数传递给您的DbContext 的构造函数。

【讨论】:

猜你喜欢
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多