gpt4 book ai didi

c# - MonoTouch 和 SQLite - 之前成功连接后无法打开数据库

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:13:20 26 4
gpt4 key购买 nike

我在从 MonoTouch 的 SQLite 数据库中读取数据时遇到困难。

前几个屏幕我可以毫无困难地阅读和书写,然后突然间我无法与错误建立任何进一步的联系:

Mono.Data.Sqlite.SqliteException: Unable to open the database file   
at Mono.Data.Sqlite.SQLite3.Open (System.String strFilename, SQLiteOpenFlagsEnum flags, Int32 maxPoolSize, Boolean usePool) [0x0007e] in /Developer/MonoTouch/Source/mono/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLite3.cs:136
at Mono.Data.Sqlite.SqliteConnection.Open () [0x002aa] in /Developer/MonoTouch/Source/mono/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLiteConnection.cs:888

我确保每次使用时都处理并关闭每个连接,但我仍然遇到这个问题。例如:

var mySqlConn = new SqliteConnection(GlobalVars.connectionString);
mySqlConn.Open();
SqliteCommand mySqlCommand = new SqliteCommand(SQL, mySqlConn);
mySqlCommand.ExecuteNonQuery();
mySqlConn.Close();
mySqlCommand.Dispose();
mySqlConn.Dispose();

我猜我没有正确关闭连接。任何帮助将不胜感激。

最佳答案

我很确定你猜对了。然而,很难猜测出了什么问题(例如,connectionString 中定义的内容将影响 Sqlite 的初始化方式和工作方式)。

从您的示例来看,您似乎正确地处理了 SqliteConnection,但事情仍然可能出错。例如。如果某些代码抛出异常(并且您在某个地方捕获了它们),则可能永远不会调用 Dispose 调用。这样做会更安全:

using (var mySqlConn = new SqliteConnection(GlobalVars.connectionString) {
mySqlConn.Open();
using (SqliteCommand mySqlCommand = new SqliteCommand(SQL, mySqlConn)) {
mySqlCommand.ExecuteNonQuery();
// work with the data
}
mySqlConn.Close();
}

这将确保 自动 finally 子句将处理您创建的实例。

您可能还想考虑重用您的(第一个)连接实例,例如打开它一次并在您的应用程序中的任何地方重新使用它。 OTOH 在这种情况下你需要注意线程(默认情况下,你可以更改它,每个连接只能在创建它的线程上安全使用)。

重复使用可以提高您的应用性能,但它也不能真正解决您的问题(但它可能会隐藏它)。所以我建议你先尝试调试:

使用 MonoDevelop,您可以在 /Developer/MonoTouch/Source/mono/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLite3.cs< 的第 136 行设置断点 文件(包含在您的 MonoTouch 安装中)以查看实际的 n 错误代码(在它被转换为字符串之前)。

您还可以在处理代码上设置断点以确保它得到执行(并且不返回错误)。连接创建和处理的数量应该匹配。如果没有,则使用调用堆栈 查看谁在打开但未关闭。

关于c# - MonoTouch 和 SQLite - 之前成功连接后无法打开数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12883507/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com