在带有SQLite ODBC驱动程序的Excel中,我对单个表运行的简单SELECT查询不正确地检索“长”整数(10位或更多小数位)。如何才能正确检索这些值,而不需要截断或任何乱七八糟的情况?
(请注意:数据库结构/字段定义不能修改--数据库属于开源应用程序Anki,更改结构将破坏软件。)
我正在查询的特定表包含(至少)几个字段,这些字段可以包含较长的整数值(10位或更多小数位)。主键("id")包含Unix时间戳(datetime)值,以毫秒为单位,因此主键字段中的整数总是占小数点的13位。
以下是表的定义:
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。如果我运行这个查询:
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并没有影响结果--例如,我得到的结果完全相同:
SELECT CAST(id as biginteger) AS primarykey, flds FROM notes也没有为ADODB连接设置BigInt参数,如下面的代码所示(请参阅SQL驱动程序的文档,标题为“用于DSN的连接字符串参数”)。
下面是一个使用VBA代码的最小示例,演示了这个问题的所有令人沮丧的满足感:
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。
注意,记录集中字段的ActualSize和DefinedSize属性都在VBA调试器中显示为"4“,意思是(我认为)4个字节,而SQLite使用8个字节将这些值存储在数据库中。

https://stackoverflow.com/questions/70550926
复制相似问题