我正在使用 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”?最后,为什么这些异常对用户如此不友好?