菜鸟教程小白 发表于 2022-12-13 17:03:23

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


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

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

<pre><code>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) in /Developer/MonoTouch/Source/mono/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLite3.cs:136   
at Mono.Data.Sqlite.SqliteConnection.Open () in /Developer/MonoTouch/Source/mono/mcs/class/Mono.Data.Sqlite/Mono.Data.Sqlite_2.0/SQLiteConnection.cs:888
</code></pre>

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

<pre><code>var mySqlConn = new SqliteConnection(GlobalVars.connectionString);
mySqlConn.Open();
SqliteCommand mySqlCommand = new SqliteCommand(SQL, mySqlConn);
mySqlCommand.ExecuteNonQuery();
mySqlConn.Close();
mySqlCommand.Dispose();
mySqlConn.Dispose();
</code></pre>

<p>我猜我没有正确关闭连接。任何帮助将不胜感激。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我很确定你猜对了。但是很难猜出哪里出了问题(例如,您的 <code>connectionString</code> 中定义的内容将影响 Sqlite 的初始化方式和工作方式)。</p>

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

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

<p>这将确保 <em>自动</em> finally 子句将处理您创建的实例。</p>

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

<p>重用可以帮助您提高应用性能,但也不能真正解决您的问题(但它可能会隐藏它)。所以我建议你先调试一下:</p>

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

<p>您还可以在 dispose 代码上设置断点以确保它被执行(并且不返回错误)。连接创建和处置的数量应该匹配。如果没有,则使用<strong>调用堆栈</strong>查看谁在打开而不关闭。</p></p>
                                   
                                                <p style="font-size: 20px;">关于c# - MonoTouch 和 SQLite - 以前成功连接后无法打开数据库,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/12883507/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/12883507/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: c# - MonoTouch 和 SQLite - 以前成功连接后无法打开数据库