代码之家  ›  专栏  ›  技术社区  ›  sonicbhoc

使用System.Data.SQLite.SQLIteDataReader.GetBlob检索BLOB字段时出错

  •  1
  • sonicbhoc  · 技术社区  · 8 年前

    由于我无法控制的原因,我正在创建一个.NET2.0程序集,在其中加载一个SQLite数据库并从中检索一些二进制数据。特别是PDF文档。

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

    这是我的SQLiteCommand:

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

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

    我调用GetBlob(inti,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)
    ...
    

    2 回复  |  直到 8 年前
        1
  •  1
  •   sonicbhoc    8 年前

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

        2
  •  0
  •   Manjunath    7 年前

    虽然keyinfo可以工作,但由于executereader方法的内存消耗很大(相当于blob大小),它不能解决大型blob对象的增量blob I/O问题。避免巨大内存使用的一种方法是在单独的查询中获取行ID并重载sqliteblob。创建方法并直接传递rowid。因此,如果可以重载sqliteblob,这里基本上不需要keyinfo。创建方法。