【发布时间】: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