【发布时间】:2012-12-27 04:39:34
【问题描述】:
我正在尝试使用 SQLite 为通常从服务器请求数据的 .NET 应用程序创建离线缓存。我已经让数据库和表定义部分工作正常,并且在大多数情况下加载数据也工作正常。我在我的测试表中缓存了大约 14,000 行,并且数据大部分是正确的。问题是我似乎无法让 System.Data.SQLite 包装器持久化包含 SQL 时间戳值的 byte[] 数据。
首先,我应该注意到我可以将时间戳编码为其他内容(例如字符串或数字数据),但如果可能的话,我更愿意使用本机 BLOB 功能。那么就从这里开始吧。
表格 DDL 现在看起来像这样:
CREATE TABLE Accounts
(
AccountID Int NOT NULL,
-- ...
Timestamp BLOB
)
但我应该注意,我也尝试了VARBINARY、VARBINARY(4000)、BINARY 和GENERAL 用于Timestamp 的列类型,结果没有差异。
在插入时,我生成了一个参数化的 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]。事实上,如果我将列类型更改为具有字符串关联性并给它一个DbType.String,那么该列将存储“System.Byte[]”。
该列具有空值这一事实是确定的,首先只需使用 SQLite 数据库浏览器打开数据库文件并查看,其次是因为使用 (SELECT MAX(Timestamp) FROM Accounts) 在第二个表中设置列会使该字段为空,根据文档,当且仅当每行的时间戳为空时才会发生。
那么我会错过什么?
** 编辑 **
请注意:这是SQLite,而不是 SQL CE。有些回答似乎混淆了两者。
【问题讨论】:
-
为什么要将@Timestamp 值存储为 Blob 为什么不将其存储为 TimeStamp 或 DateTime..?
-
什么是'1' in select 1 from Accounts in the query...我认为查询本身在逻辑上是错误的..!!
-
@DJKRAZE SQLite 数据类型见here。
Timestamp即使在 SQLCE 中也不起作用(它必须是binary(8),因为时间戳是服务器时间戳)。并且value是一个SQLTIMESTAMP/ROWVERSION,所以和DateTime数据无关。 -
@RahulRanjan 这只是一个虚拟值,可以替换为 * 或特定的字段名称。它与查询的正确性无关。
标签: c# sqlite system.data.sqlite