Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQLite blob字段未接收参数值_C#_Sqlite_System.data.sqlite - Fatal编程技术网

C# SQLite blob字段未接收参数值

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

我正在尝试使用SQLite为通常从服务器请求数据的.NET应用程序创建脱机缓存。我已经让数据库和表定义部分工作正常,并且在大多数情况下加载数据也工作正常。我在测试表中缓存了大约14000行,数据基本正确。问题是我似乎无法让System.Data.SQLite包装器持久化包含SQL时间戳值的字节[]数据

在做其他事情之前,我应该注意,我意识到我可以将时间戳编码为其他字符串或数字数据,但是如果可能的话,我更愿意使用本机BLOB功能。让我们从这里开始

表DDL如下所示:

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这只是一个伪值,可以用*或特定字段名替换。这与查询的正确性无关。