首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >select查询返回截断/不正确的SQLite 'long‘整数--如何检索正确的值?(SQLite ODBC驱动程序,VBA/ADODB)

select查询返回截断/不正确的SQLite 'long‘整数--如何检索正确的值?(SQLite ODBC驱动程序,VBA/ADODB)
EN

Stack Overflow用户
提问于 2022-01-01 18:24:24
回答 1查看 261关注 0票数 4

在带有SQLite ODBC驱动程序的Excel中,我对单个表运行的简单SELECT查询不正确地检索“长”整数(10位或更多小数位)。如何才能正确检索这些值,而不需要截断或任何乱七八糟的情况?

(请注意:数据库结构/字段定义不能修改--数据库属于开源应用程序Anki,更改结构将破坏软件。)

我正在查询的特定表包含(至少)几个字段,这些字段可以包含较长的整数值(10位或更多小数位)。主键("id")包含Unix时间戳(datetime)值,以毫秒为单位,因此主键字段中的整数总是占小数点的13位。

以下是表的定义:

代码语言:javascript
运行
复制
CREATE TABLE "notes" (
    "id"    integer,
    "guid"  text NOT NULL,
    "mid"   integer NOT NULL,
    "mod"   integer NOT NULL,
    "usn"   integer NOT NULL,
    "tags"  text NOT NULL,
    "flds"  text NOT NULL,
    "sfld"  integer NOT NULL,
    "csum"  integer NOT NULL,
    "flags" integer NOT NULL,
    "data"  text NOT NULL,
    PRIMARY KEY("id")
);

我的一条记录在id字段中的值为1640497387755。如果我运行这个查询:

代码语言:javascript
运行
复制
SELECT id AS primarykey, flds FROM notes WHERE id = 1640497387755

结果包含primarykey字段(1记录ADO记录集)-not 1640497387755中的2147483647 .但是,记录集中的flds字段具有正确的(文本)数据。

通过使用一个单独的工具(用于SQLite的DB浏览器)浏览数据库,我已经验证了该字段包含正确/预期的Unix时间戳值。进一步注意,我能够使用WHERE子句根据数据库中的实际id字段值选择正确的记录,如上面的SELECT语句所示。

将字段转换为BigInt和BigInteger并没有影响结果--例如,我得到的结果完全相同:

代码语言:javascript
运行
复制
SELECT CAST(id as biginteger) AS primarykey, flds FROM notes

也没有为ADODB连接设置BigInt参数,如下面的代码所示(请参阅SQL驱动程序的文档,标题为“用于DSN的连接字符串参数”)。

下面是一个使用VBA代码的最小示例,演示了这个问题的所有令人沮丧的满足感:

代码语言:javascript
运行
复制
Sub ADOQueryAnki()
        
    Dim conn As Object, rst As Object
    Dim varRecords() As Variant
    Dim strDBasePath As String
    Dim strSQLSelect As String
    
    Set conn = CreateObject("ADODB.Connection")
    Set rst = CreateObject("ADODB.Recordset")
    
    strDBasePath = "I:\Anki\Test\collection.anki2;" 
    ' collection.anki2 is a standard SQLite database
    ' --though the filename has a non-standard extension
    strSQLSelect = "SELECT id as primarykey, flds FROM notes"
    
    ' OPEN CONNECTION
    conn.Open "DRIVER=SQLite3 ODBC Driver;Database=" & strDBasePath & ";BigInt = true"
    conn.CursorLocation = adUseClient
    
    rst.Open strSQLSelect, conn, adOpenDynamic, adLockOptimistic ' have tried multiple options
    
    Debug.Print rst!primarykey
    
End Sub

在我刚才所做的运行中,Debug.Print语句输出2147483647,其中数据库中相应字段的实际值为1324302169120。

注意,记录集中字段的ActualSizeDefinedSize属性都在VBA调试器中显示为"4“,意思是(我认为)4个字节,而SQLite使用8个字节将这些值存储在数据库中。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70550926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档