第二次调用ExecuteNonQuery时SQLite-net抛出异常

时间:2013-06-22 09:44:01

标签: c# windows-runtime system.data.sqlite executenonquery sqlite-net

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

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

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

我只是尝试用ExecuteNonQuery做一个select语句(只是为了查看它是否有效),我仍然得到一个异常,这次将“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

UPDATE 2 :如果我调用ExecuteToDictionary而不是ExecuteNonQuery,它可以正常工作。

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

为什么我在第二次调用ExecuteNonQuery时遇到异常?

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

2 个答案:

答案 0 :(得分:3)

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

如果将来有任何类似的问题,请首先检查SQLite数据库是否在WinRT应用程序的存储目录中。

答案 1 :(得分:0)

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