【问题标题】:SQLite blob field doesn't receive parameter valueSQLite blob 字段不接收参数值
【发布时间】: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
)

但我应该注意,我也尝试了VARBINARYVARBINARY(4000)BINARYGENERAL 用于Timestamp 的列类型,结果没有差异。

在插入时,我生成了一个参数化的 SQL 命令,如下所示(为清楚起见,删除了很多字段):

INSERT INTO Accounts (AccountID, Timestamp)
SELECT @AccountID, @Timestamp
WHERE NOT EXISTS (SELECT 1 FROM Accounts WHERE AccountID = @AccountID)

参数@Timestamp 被赋予DbTypeBinary 并具有适当的大小,插入行中的所有其他数据看起来都很好。但由于某种原因,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 数据类型见hereTimestamp 即使在 SQLCE 中也不起作用(它必须是 binary(8),因为时间戳是服务器时间戳)。并且value是一个SQLTIMESTAMP/ROWVERSION,所以和DateTime数据无关。
  • @RahulRanjan 这只是一个虚拟值,可以替换为 * 或特定的字段名称。它与查询的正确性无关。

标签: c# sqlite system.data.sqlite


【解决方案1】:

嗯,这真的很奇怪。当我意识到 SQLite 数据库浏览器对我撒谎时,我有了一个突破——它在 0x0 处截断二进制数据,这是我所有时间戳值的第一个字节,并将这些字段报告为空。我在尝试插入随机字节数据而不是时间戳后发现了这一点,此时我看到数据在 GUI 中通过。显然它将数据视为以空字符结尾的字符串,我一开始并不知道它是如此幼稚。

现在,我一直在使用 SQLite 数据库浏览器作为代理来调试问题(当我尝试读取时间戳值时出现了 DBNulls)。但是当我回去查看是否仍然从 System.Data.SQLite 包装器中获取 DBNull 时,我发现当仅使用原始时间戳数据运行代码时,不再生成 DBNull。在某个时候,代码开始工作了——我只是没有注意到,因为我愚蠢地依赖 GUI 向我显示数据。

奇怪的是,我尝试追溯我的步骤,撤消我为找出解决问题的具体原因所做的事情。但是现在我无法重现最初的错误,尽管一开始它是绝对一致的(我无法绕过它的事实促使我首先使用 GUI)!但是我没有将每个损坏的版本都检查到源代码管理中,所以在这一点上我真的不知道问题是什么。

无论如何,这个故事至少有一个寓意,那就是,如果您不确定 GUI 的功能,请不要相信它。很难说我已经有了工作代码多久了,只是不知道而已。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 2021-02-03
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 2012-07-18
    • 2012-08-15
    相关资源
    最近更新 更多