2

我正在使用 SQLite-net 访问 WinRT 应用程序中的 SQLite 数据库文件。我使用 ExecuteQuery 从数据库读取没有任何问题(我实际上使用了https://github.com/praeclarum/sqlite-net/issues/82的修改版本,因为我不使用表映射并且想要结果作为在下面调用 ExecuteDeferredQuery 的字典)。

当我尝试使用 将记录插入我的数据库ExecuteNonQuery时,我收到一条异常消息“CannotOpen”。

嗯,只要上面几行,我就可以成功地从数据库中读取了。我仔细检查了sqlite数据库文件的文件权限,并让计算机上的每个人都可以完全控制该文件以避免任何文件权限问题,但结果是一样的,仍然得到“CannotOpen”。

我只是试图用 ExecuteNonQuery 做一个选择语句(只是为了看看它是否有效),我仍然得到一个异常,这次说“Row”作为异常消息。
我试图用 ExecuteQuery 执行我的插入,看看会发生什么,没有抛出异常,一切似乎都很好,但没有行插入到我的数据库中。

好吧,这可能是可以解释的,因为 ExecuteQuery 是为查询而不是插入而设计的,但是 ExecuteNonQuery 抛出异常的原因可能是什么?

这是我的代码(出于隐私考虑,删除了带有通用名称和参数的实际表名和参数):

SQLiteCommand cmd = conn.CreateCommand("insert into mytable(myfields...) values (?,?,?,?,?,?,?)", my parameters...);
cmd.ExecuteNonQuery(); //throws SQLiteException

但是,此代码不会引发异常:

SQLiteCommand cmd = conn.CreateCommand("select * from mytable where some condition...", some parameters...);
var result = cmd.ExecuteToDictionary(); //renamed ExecuteQuery method from https://github.com/praeclarum/sqlite-net/issues/82

更新:我进一步将问题归结为更简单(和奇怪)的问题。此代码是连接初始化后对 SQLite 框架的第一次调用。这段代码在执行时会在第四行引发异常:

 SQLiteCommand cmd = conn.CreateCommand("select * from mytable");
 cmd.ExecuteNonQuery();
 cmd = conn.CreateCommand("select * from mytable"); //yes, the same simple query as above
 cmd.ExecuteNonQuery();//getting error

更新 2:如果我调用 ExecuteToDictionary 而不是 ExecuteNonQuery,它可以工作。

更新 3 :如果我在所有这些调用之前尝试直接查询(来自conn对象,例如conn.Execute("query...")) ,它会失败。如果是插入查询,我会得到错误,如果是选择查询,我会得到一个CannotOpenRow错误。

为什么我在第二次调用 ExecuteNonQuery 时出现异常?

当我尝试使用 ExecuteNonQuery 进行 SELECT 时,为什么会收到不同的错误消息“Row”?最后,为什么这些异常对用户如此不友好?

4

2 回答 2

3

找到了答案。SQLite 文件位于没有写访问权限的目录中(文件 DID 具有文件属性中的所有访问权限,但我认为这是 WinRT 安全模型问题,因为该文件位于 WinRT 存储文件夹的沙箱之外。我可以阅读文件,但不写入。感谢 SQLite-net非常有用的异常消息,例如“Row”和“CannotOpen”,没有提供有关问题的任何真实细节,我花了几天时间才意识到这是一个文件访问问题,而不是SQLite 配置/查询问题。

如果以后有人遇到类似的问题,首先检查SQLite数据库是否在WinRT应用的存储目录中。

于 2013-06-25T06:07:59.520 回答
0

在执行任何其他操作之前尝试关闭和打开连接对象

于 2013-06-23T08:43:24.697 回答