C# SQLite blob字段未接收参数值
我正在尝试使用SQLite为通常从服务器请求数据的.NET应用程序创建脱机缓存。我已经让数据库和表定义部分工作正常,并且在大多数情况下加载数据也工作正常。我在测试表中缓存了大约14000行,数据基本正确。问题是我似乎无法让System.Data.SQLite包装器持久化包含SQL时间戳值的字节[]数据 在做其他事情之前,我应该注意,我意识到我可以将时间戳编码为其他字符串或数字数据,但是如果可能的话,我更愿意使用本机BLOB功能。让我们从这里开始 表DDL如下所示:C# SQLite blob字段未接收参数值,c#,sqlite,system.data.sqlite,C#,Sqlite,System.data.sqlite,我正在尝试使用SQLite为通常从服务器请求数据的.NET应用程序创建脱机缓存。我已经让数据库和表定义部分工作正常,并且在大多数情况下加载数据也工作正常。我在测试表中缓存了大约14000行,数据基本正确。问题是我似乎无法让System.Data.SQLite包装器持久化包含SQL时间戳值的字节[]数据 在做其他事情之前,我应该注意,我意识到我可以将时间戳编码为其他字符串或数字数据,但是如果可能的话,我更愿意使用本机BLOB功能。让我们从这里开始 表DDL如下所示: CREATE TABLE Ac
CREATE TABLE Accounts
(
AccountID Int NOT NULL,
-- ...
Timestamp BLOB
)
然而,我应该注意到,我也尝试了VARBINARY、VARBINARY4000、BINARY和GENERAL作为Timestamp的列类型,结果没有任何差异
在插入时,我生成了一个参数化SQL命令,看起来像这样,为了清晰起见,删除了很多字段:
INSERT INTO Accounts (AccountID, Timestamp)
SELECT @AccountID, @Timestamp
WHERE NOT EXISTS (SELECT 1 FROM Accounts WHERE AccountID = @AccountID)
参数@Timestamp被赋予一个二进制的DbType,并且具有适当的大小,插入行中的所有其他数据看起来都很好。但由于某些原因,时间戳保留为空。为什么会这样
该值是一个具有预期内容的字节[8]。事实上,如果我将列类型更改为具有字符串关联并为其指定DbType.string,则该列将存储System.Byte[]
该列具有空值这一事实是肯定的,首先是通过使用SQLite数据库浏览器打开数据库文件并查看,其次是因为在第二个表中使用SELECT MAXTimestamp FROM Accounts设置列会使字段为空,根据文档,当且仅当每行的时间戳为空时才会发生这种情况
那么我会错过什么呢
**编辑**
请注意:这不是SQL CE。有些反应似乎混淆了两者。嗯,这真的很奇怪。当我意识到SQLite数据库浏览器在欺骗我时,我有了一个突破——它在0x0处截断二进制数据,这是我所有时间戳值的第一个字节,并将这些字段报告为空。我在尝试插入随机字节数据而不是时间戳后发现了这一点,当时我在GUI中看到了数据。很明显,它将数据视为以null结尾的字符串,起初我不知道它有那么幼稚 现在,我一直在使用SQLite数据库浏览器作为代理来调试问题,当我试图读取时间戳值时,出现了DBNulls。但是,当我回去查看是否仍然从System.Data.SQLite包装器中获取DBNull时,我发现当仅使用原始时间戳数据运行时,代码不再生成DBNull。在某种程度上,代码已经开始工作了——我只是没有注意到,因为我愚蠢地依赖GUI来显示数据 奇怪的是,我试图回溯我的步骤,撤销我所做的事情,试图找出具体是什么解决了这个问题。但是现在我无法重现最初的错误,虽然它一开始是绝对一致的,但事实是我无法绕过它,这促使我首先使用GUI!但是我还没有将每个损坏的版本都检查到源代码管理中,所以现在我真的不知道问题出在哪里
无论如何,这个故事至少有一个寓意,那就是,如果你不确定GUI的功能,就不要相信它。很难说我已经有了工作代码多久了,只是不知道它。为什么要将@Timestamp值存储为Blob?为什么不将其存储为Timestamp或DateTime?查询中从帐户中选择1中的“1”是什么?我认为查询本身在逻辑上是错误的@有关SQLite数据类型,请参阅DJKRAZE。时间戳即使在SQLCE中也不起作用,它需要是二进制8,因为时间戳是服务器时间戳。该值是SQL时间戳/ROWVERSION,因此它与日期时间数据无关。@Rahullanjan这只是一个伪值,可以用*或特定字段名替换。这与查询的正确性无关。