【发布时间】: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