adodb.recordset 仅从 sqlite3 数据库中检索部分 blob 数据
Posted
技术标签:
【中文标题】adodb.recordset 仅从 sqlite3 数据库中检索部分 blob 数据【英文标题】:adodb.recordset retrieves only partial blob data from sqlite3 database 【发布时间】:2021-10-08 07:36:36 【问题描述】:我正在尝试使用 Excel 中的 vba 检索存储在 sqlite3 数据库中的一些二进制数据。它运行平稳,只是只检索了部分 blob 数据。 Blob 的长度为 11204 字节。返回的记录集字段的大小是正确的。但是,只有前 255 个字节包含有效值,后面是一堆 0。更奇怪的是,在浩瀚的 0 的海洋中到处都有一些有效字节。 查询成功后,我使用了三种不同的方式来检索数据:getrows()、rst.Fields().Value 和 adoStream.Read(),都得到了相同的结果。
Set conn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
conn.Open "DRIVER=SQLite3 ODBC Driver;Database=" & fileName & ";"
query = "SELECT * FROM " & dataTable & ";"
rst.Open query, conn, 1, 1
data = rst.getrows()
Set adoStream = CreateObject("ADODB.Stream")
adoStream.Type = 1 'adTypeBinary
adoStream.Open
With rst
.MoveLast
.MoveFirst
For i = 1 To .RecordCount
data = rst.fields(dataField).value
rst.Save adoStream, 0
data = adoStream.Read(adoStream.Size)
next i
end With
我尝试了一些不同的数据库,但都是一样的。 谁能告诉我这里发生了什么? 谢谢。
【问题讨论】:
看起来您正在将整个记录集持久化到流中?您只是想要 blob 字段内容吗? 也许可以试试adoStream.Write rst.fields(dataField).value
恐怕这里的问题与流无关。在 getrows() 没有所有有效数据之后,我使用流作为检索 blob 的替代方法。 rst.Fields().Value 首先表现不正常 - 它具有正确的大小 (11204),但不是所有数据。 @Tim Williams我只想获取blob字段内容(表中的所有字段都是blob)。尝试了你的建议,但它没有解决问题。谢谢。
【参考方案1】:
对于二进制数据,.AppendChunk and .GetChunk methods 最合适。像这样的:
If rs.fields(dataField).ActualSize > 0 Then
vntResult = rs.fields(dataField).GetChunk(rs.fields(dataField).ActualSize)
End If
【讨论】:
使用 GetChunk 时出现错误:VBA 错误-'运行时错误 3219-在此上下文中不允许操作'。我想知道它是否与 field.DefinedSize=255 有关。 @HelO'Ween 这很不幸。似乎是a limitation of SQLite/SQLite's ODBC driver。发布我的答案时,我没有意识到这一点。对于那个很抱歉。过去,Olaf Schmidt 有一个名为 dhRichClient3 的惊人项目,其中包括一个 SQlite 包装器。但它已经消失了。 Archive.org has a snapshot of it,如果你想看看。以上是关于adodb.recordset 仅从 sqlite3 数据库中检索部分 blob 数据的主要内容,如果未能解决你的问题,请参考以下文章
由于空格,ADODB.Recordset 到 SQL Server 查询失败
无法将“ADODB.Recordset”类型的对象转换为“MSDATASRC.DataSource”类型
如何从此 ADODB.Recordset 中获取插入 ID?