3

Web サービスからデータを取得するアプリに取り組んでいます。このプログラムは、Xamarin Studio を使用して C# で記述されています。

アプリには、ファイルに格納されたローカル SQLite データベースがあります。データベースの内部動作 (接続の開閉など) を簡素化するために、別の Database クラスを作成しました。このクラスの関連するスニペットは次のとおりです。

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() を使用しているため、理由がわかりません...

誰かが私を助けてくれることを願っています!

デボー

4

2 に答える 2

3

問題を解決しました!アプリケーションを拡張するバックグラウンド クラスでは、接続を永続的に開いたままにします。一連の要素を挿入するときにエラーが発生しなくなりました。

同様の問題を抱えている人を見つけることができなかったので、これが他の人にも役立つことを願っています。

デボー

于 2013-08-06T08:28:57.780 に答える