【问题标题】:Performing a lot of SQlite queries in Xamarin.Android fails在 Xamarin.Android 中执行大量 SQlite 查询失败
【发布时间】:2013-08-05 10:39:17
【问题描述】:

我正在开发一个从网络服务获取一些数据的应用程序。该程序是用 Xamarin Studio 用 C# 编写的。

该应用有一个存储在文件中的本地 SQLite 数据库。我创建了一个单独的 Database 类来简化数据库的内部工作(例如打开和关闭连接等)。这是该类的相关sn-p:

public static SqliteConnection connect(){
            string documentPath = System.Environment.GetFolderPath (System.Environment.SpecialFolder.Personal);
            try {
                return new SqliteConnection (string.Format ("Data Source={0};Version=3;", documentPath + "Database.db"));
            } catch {
                Console.WriteLine ("New DB created!");
                SqliteConnection.CreateFile (documentPath + "Database.db");
                return new SqliteConnection (string.Format ("Data Source={0};Version=3;", documentPath + "Database.db"));
            }
        }

public static void doQuery(string query){
            //Console.WriteLine ("Performing no-return query: " + query);
            using(var conn = connect()){
                conn.Open ();
                using(var cmd = conn.CreateCommand ()){
                    var trans = conn.BeginTransaction ();
                    cmd.CommandText = query;
                    cmd.CommandType = CommandType.Text;
                    cmd.Transaction = trans;
                    cmd.ExecuteNonQuery ();
                    trans.Commit ();
                }
            }
        }

public static DataTable getQueryResult(string query){
    //Console.WriteLine ("Performing return query: " + query);
    using (var conn = connect()) {
        conn.Open ();
        using (var cmd = conn.CreateCommand ()) {
            cmd.CommandText = query;
            cmd.CommandType = CommandType.Text;
            SqliteDataReader rdr = cmd.ExecuteReader ();
            DataTable dt = new DataTable ();
            dt.Load (rdr);
            return dt;
        }
    }
   }

大约执行后。 1900 次查询,我收到此错误:

[mono] Unhandled Exception:
[mono] Mono.Data.Sqlite.SqliteException: Unable to open the database file
[mono] unable to open database file
[mono]   at Mono.Data.Sqlite.SQLite3.Reset (Mono.Data.Sqlite.SqliteStatement stmt) [0x00000] in <filename unknown>:0 
[mono]   at Mono.Data.Sqlite.SQLite3.Step (Mono.Data.Sqlite.SqliteStatement stmt) [0x00000] in <filename unknown>:0 
[mono]   at Mono.Data.Sqlite.SqliteDataReader.NextResult () [0x00000] in <filename unknown>:0 
[mono]   at Mono.Data.Sqlite.SqliteDataReader..ctor (Mono.Data.Sqlite.SqliteCommand cmd, CommandBehavior behave) [0x00000] in <filename unknown>:0 
[mono]   at (wrapper remoting-invoke-with-check) Mono.Data.Sqlite.SqliteDataReader:.ctor (Mono.Data.Sqlite.SqliteCommand,System.Data.CommandBehavior)
[mono]   at Mono.Data.Sqlite.SqliteCommand.ExecuteReader (CommandBehavior behavior) [0x00000] in <filename unknown>:0 
[mono]   at Mono.Data.Sqlite.SqliteCommand.ExecuteNonQuery () [0x00000] in <filename unknown>:0 
[mono]   at Mono.Data.Sqlite.SqliteTransaction..ctor (Mono.Data.Sqlite.SqliteConnection connection, Boolean deferred

这个错误是在“var trans = conn.BeginTransaction();”处抛出的doQuery 方法中的一行。

我认为这与不处理对象有关,但由于我使用 using() 进行连接和命令,所以我不明白为什么......

希望有人能帮帮我!

DebboR

【问题讨论】:

    标签: c# android database sqlite xamarin


    【解决方案1】:

    我解决了我的问题!在扩展应用程序的后台类中,我永久保持连接打开。现在插入一堆元素时我没有收到任何错误。

    我希望这对其他人也有用,因为我找不到有类似问题的人。

    DebboR

    【讨论】:

    • 谢谢你,@DebboR!我到处搜索,你是对的,如果我保持连接打开,我不会收到这个烦人的错误 :)
    【解决方案2】:

    想知道您是否尝试在每次打开连接时显式关闭它。但是,只要不存在并发问题,使用锁的单例模式会更好。我对 Xamarin 很陌生,但可能没有连接缓存。

    【讨论】:

      猜你喜欢
      • 2021-09-23
      • 2012-10-21
      • 2023-03-18
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多