我正在使用SQLite-net访问WinRT应用程序中的SQLite数据库文件。我没有任何问题使用ExecuteQuery从数据库中读取(我实际上使用https://github.com/praeclarum/sqlite-net/issues/82中的修改版本,因为我不使用表映射并希望将结果作为字典在下面调用ExecuteDeferredQuery)。第二次调用ExecuteNonQuery时发生SQLite-net抛出异常
当我尝试使用ExecuteNonQuery
将记录插入到我的数据库中时,出现异常并显示消息“CannotOpen”。
好吧,只要上面几行,我就可以从数据库中读取成功。我仔细检查了sqlite数据库文件的文件权限,并将计算机上的所有人都完全控制到该文件以避免任何文件权限问题,但结果相同,仍然是“CannotOpen”。我试图用ExecuteNonQuery做一个select语句(只是为了看看它是否工作),我仍然得到一个异常,这次我说“Row”作为异常消息。
我试图执行我的插入与的executeQuery来看看会发生什么,不会抛出异常,似乎一切都OK,但没有行被插入到我的数据库。
那么,作为的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
错误,如果它是一个选择查询,我得到一个错误。
为什么第二次调用ExecuteNonQuery时会出现异常?
为什么我在用ExecuteNonQuery尝试SELECT时收到不同的错误消息“Row”?最后,为什么这些例外对用户不友好?
我对您的问题进行了格式化,因此更容易理解... – rene
@rene谢谢。我意识到我已经在一个地方问了一些问题:) –
如果您提供了一个可以重现错误的代码示例,可能会有所帮助。 –