使用 System.Data.SQLite.SQLIteDataReader.GetBlob 检索 BLOB 字段时出错
Error retrieving BLOB field using System.Data.SQLite.SQLIteDataReader.GetBlob
由于我无法控制的原因,我正在创建一个 .NET 2.0 程序集,我在其中加载 SQLite 数据库并从中检索一些二进制数据。具体来说,PDF 文档。
System.Data.SQLite.SQLiteDataReader.GetBlob(int i, bool ReadOnly) 的文档说:(强调我的)
Retrieves the column as a System.Data.SQLite.SQLiteBlob object. This will not work for tables that were created WITHOUT ROWID -OR- if the query does not include the "rowid" column or one of its aliases -OR- if the System.Data.SQLiteDataReader was not created with the System.Data.CommandBehavior.KeyInfo flag.
这是我的 SQLite 命令:
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 的问题是否已在较新版本中得到解决?
要使此代码正常工作,请删除 System.Data.CommandBehavior.SequentialAccess
标志并 select 至少删除 rowid 和 blob 字段。
虽然keyinfo可以,但是由于executereader方法内存消耗大(相当于blob大小),所以没有解决大blob对象的增量blobI/O。避免大量内存使用的一种方法是在单独的查询中获取 rowid 并重载 sqliteblob.create 方法并直接传递 rowid。因此,如果您可以重载 sqliteblob.create 方法,那么这里基本上不需要 keyinfo。
由于我无法控制的原因,我正在创建一个 .NET 2.0 程序集,我在其中加载 SQLite 数据库并从中检索一些二进制数据。具体来说,PDF 文档。
System.Data.SQLite.SQLiteDataReader.GetBlob(int i, bool ReadOnly) 的文档说:(强调我的)
Retrieves the column as a System.Data.SQLite.SQLiteBlob object. This will not work for tables that were created WITHOUT ROWID -OR- if the query does not include the "rowid" column or one of its aliases -OR- if the System.Data.SQLiteDataReader was not created with the System.Data.CommandBehavior.KeyInfo flag.
这是我的 SQLite 命令:
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 的问题是否已在较新版本中得到解决?
要使此代码正常工作,请删除 System.Data.CommandBehavior.SequentialAccess
标志并 select 至少删除 rowid 和 blob 字段。
虽然keyinfo可以,但是由于executereader方法内存消耗大(相当于blob大小),所以没有解决大blob对象的增量blobI/O。避免大量内存使用的一种方法是在单独的查询中获取 rowid 并重载 sqliteblob.create 方法并直接传递 rowid。因此,如果您可以重载 sqliteblob.create 方法,那么这里基本上不需要 keyinfo。