【问题标题】:SQLite-net throwing exception on second call to ExecuteNonQuerySQLite-net 在第二次调用 ExecuteNonQuery 时抛出异常
【发布时间】:2013-06-22 09:44:00
【问题描述】:

我正在使用 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...")在所有这些调用之前它会失败。如果是插入查询,我会收到CannotOpen 错误,如果是选择查询,我会收到Row 错误。

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

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

【问题讨论】:

  • 我对你的问题进行了格式化,这样更容易消化......
  • @rene 谢谢。我意识到我在一个地方问得太多了:)
  • 如果您提供重现错误的代码示例可能会有所帮助。
  • @chuex 添加了示例代码。
  • @canpoyrazoğlu - 在上面的代码示例之前,您是否对连接对象做任何事情?我可以假设以上是您使用连接创建的第一个命令吗?

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 尝试关闭并重新创建查询之间的连接,不幸的是没有任何改变。
    • 然后创建一个具有相同连接对象的新命令对象并尝​​试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 2010-12-22
    • 2014-02-06
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多