C# SQLite net在第二次调用ExecuteOnQuery时引发异常

C# SQLite net在第二次调用ExecuteOnQuery时引发异常,c#,windows-runtime,system.data.sqlite,executenonquery,sqlite-net,C#,Windows Runtime,System.data.sqlite,Executenonquery,Sqlite Net,我正在使用SQLite net访问WinRT应用程序中的SQLite数据库文件。我使用ExecuteQuery从数据库读取数据没有任何问题(我实际上使用的是中的修改版本,因为我不使用表映射,并且希望结果作为字典,在下面调用ExecuteFerredQuery) 当我尝试使用ExecuteNonQuery将记录插入数据库时,我收到一个异常消息“CannotOpen” 好的,就在上面几行,我可以成功地从数据库中读取数据。我仔细检查了sqlite数据库文件的文件权限,并让计算机上的每个人都完全控制该文

我正在使用SQLite net访问WinRT应用程序中的SQLite数据库文件。我使用ExecuteQuery从数据库读取数据没有任何问题(我实际上使用的是中的修改版本,因为我不使用表映射,并且希望结果作为字典,在下面调用ExecuteFerredQuery)

当我尝试使用
ExecuteNonQuery
将记录插入数据库时,我收到一个异常消息“CannotOpen”

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

我刚刚尝试使用ExecuteOnQuery执行select语句(只是为了看看它是否有效),但仍然得到一个异常,这次将“行”作为异常消息。
我试图用ExecuteQuery执行我的insert以查看发生了什么,没有引发异常,一切似乎都正常,但没有将任何行插入到我的数据库中

这可能是可以解释的,因为ExecuteQuery是为查询而设计的,而不是为插入而设计的,但是ExecuteOnQuery抛出异常的原因是什么

这是我的代码(删除了实际的表名和参数,并使用了通用的表名和参数以保护隐私):

但是,此代码不会引发异常:

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而不是ExecuteOnQuery,它会工作

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

为什么第二次调用ExecuteOnQuery时会出现异常?


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

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

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


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

我对您的问题进行了格式化,以便更容易理解…@rene谢谢。我意识到我在一个地方问得太多了:)如果您提供一个复制错误的代码示例,可能会有所帮助.@chuex添加了示例代码。@canpoyrazoğlu-在上面的代码示例之前,您是否对连接对象做了任何操作?我是否可以假设上面是您使用连接创建的第一个命令?尝试关闭并重新创建查询之间的连接,但遗憾的是没有任何更改。然后创建一个新的命令对象w使用相同的连接对象,然后重试
 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