我正在尝试使用 SQLite 为通常从服务器请求数据的 .NET 应用程序创建离线缓存。我已经让数据库和表定义部分工作正常,并且在大多数情况下加载数据也工作正常。我在我的测试表中缓存了大约 14,000 行,并且数据大多是正确的。问题是我似乎无法让System.Data.SQLite
包装器保留byte[]
包含 SQL 时间戳值的数据。
首先,我应该注意我意识到我可以将时间戳编码为其他内容(例如字符串或数字数据),但如果可能的话,我更愿意使用本机 BLOB 功能。所以让我们从那里开始。
表 DDL 现在看起来像这样:
CREATE TABLE Accounts
(
AccountID Int NOT NULL,
-- ...
Timestamp BLOB
)
但是我应该注意,我也尝试过VARBINARY
, VARBINARY(4000)
,BINARY
和GENERAL
forTimestamp
的列类型,结果没有区别。
在插入时,我生成了一个参数化的 SQL 命令,如下所示(为清楚起见,删除了许多字段):
INSERT INTO Accounts (AccountID, Timestamp)
SELECT @AccountID, @Timestamp
WHERE NOT EXISTS (SELECT 1 FROM Accounts WHERE AccountID = @AccountID)
该参数@Timestamp
被赋予一个DbType
并Binary
具有适当的大小,并且插入行中的所有其他数据看起来都很好。但由于某种原因,Timestamp
保留为空。为什么会这样?
该值可验证为byte[8]
具有预期内容的 a。实际上,如果我将列类型更改为具有字符串关联性并给它一个DbType.String
,则该列将存储“System.Byte []”。
该列具有空值的事实是肯定的,首先只需使用 SQLite 数据库浏览器打开数据库文件并查看,其次是因为使用 a 在第二个表中设置列(SELECT MAX(Timestamp) FROM Accounts)
会使字段为空,根据文档发生当且仅当每一行的时间戳为空。
那么我可能会错过什么?
** 编辑 **
请注意:这是SQLite,而不是 SQL CE。有些回应似乎混淆了两者。