【问题标题】:Error retrieving BLOB field using System.Data.SQLite.SQLIteDataReader.GetBlob使用 System.Data.SQLite.SQLIteDataReader.GetBlob 检索 BLOB 字段时出错
【发布时间】:2017-04-23 20:01:30
【问题描述】:

由于我无法控制的原因,我正在创建一个 .NET 2.0 程序集,我在其中加载一个 SQLite 数据库并从中检索一些二进制数据。具体来说,PDF 文档。

System.Data.SQLite.SQLiteDataReader.GetBlob(int i, bool ReadOnly) 的文档说:(强调我的)

以 System.Data.SQLite.SQLiteBlob 对象的形式检索列。 这不适用于在没有 ROWID 的情况下创建的表 - 或 - 如果查询不包含“rowid”列或其别名之一 - 或 - 如果 System.Data.SQLiteDataReader 不是使用系统创建的。 Data.CommandBehavior.KeyInfo 标志。

这是我的 SQLiteCommand:

using (SQLiteCommand getBooklet = new SQLiteCommand($"SELECT \"rowid\", File_Name FROM Booklets WHERE Id = {int.Parse(key)}", dbConnection))

我已经像这样实例化了我的 SQLiteDataReader:

using (SQLiteDataReader currentCustomerReader = getBooklet.ExecuteReader(System.Data.CommandBehavior.KeyInfo & System.Data.CommandBehavior.SequentialAccess))

我调用GetBlob(int i, bool ReadOnly)函数如下:

currentCustomerPdf = currentCustomerReader.GetBlob(1, true);

我收到了这样的问候:

System.InvalidOperationException: No RowId is available
    at System.Data.SQLite.SQLiteBlob.Create(SQLiteDataReader dataReader, Int32 i, Boolean readOnly)
    at System.Data.SQLite.SQLiteDataReader.GetBlob(Int32 i, Boolean readOnly)
...

我做错了吗?我错过了一步吗?我需要提交错误吗? .NET 2.0 是否存在已在较新版本中解决的问题?

【问题讨论】:

  • 您真的需要随机访问 blob 吗?你不能把它读成一个字节数组吗?
  • 我现在正在研究如何做到这一点。我只是不确定为什么会发生这种情况——我真的很想知道——而且 Blob 对象的代码更简单,行数更少。
  • SQLiteBlob 对象显然使用了incremental blob I/O。但我不明白为什么它在这种情况下不起作用。
  • 谢谢。我不明白为什么它也不起作用。对我来说闻起来像个虫子。

标签: c# sqlite blob .net-2.0 system.data.sqlite


【解决方案1】:

要使此代码正常工作,请删除 System.Data.CommandBehavior.SequentialAccess 标志并至少选择 rowid 和 blob 字段。

【讨论】:

  • rowid 不是必需的。使用CommandBehavior.KeyInfo 创建阅读器就足够了(而不是顺序访问,正确)。
【解决方案2】:

虽然 keyinfo 有效,但由于 executereader 方法的内存消耗大(与 blob 大小相等),它并不能解决大 blob 对象的增量 blob I/O。避免大量内存使用的一种方法是在单独的查询中获取 rowid 并重载 sqliteblob.create 方法并直接传递 rowid。所以如果你可以重载 sqliteblob.create 方法,这里基本上不需要 keyinfo。

【讨论】:

    猜你喜欢
    • 2010-10-15
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    相关资源
    最近更新 更多