2013-08-05 29 views
3

我正在研究從web服務獲取一些數據的應用程序。該程序是用Xamarin Studio用C#編寫的。在Xamarin.Android中執行很多SQlite查詢失敗

該應用程序有一個存儲在文件中的本地SQLite數據庫。我創建了一個單獨的數據庫類來簡化數據庫的內部工作(例如打開和關閉連接等)。這裏有一個相關的這一類的片段:

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反= conn.BeginTransaction();」在doQuery方法內部。

我認爲這是關係到不處置的對象的東西,但因爲我使用的()爲連接和命令,我不明白爲什麼...

我希望有人能幫幫我!

DebboR

回答

3

我解決了我的問題!在擴展應用程序的後臺類中,我永久保持我的連接打開。現在,當插入一堆元素時,我不會收到任何錯誤。

我希望這對其他人也有好處,因爲我找不到任何有類似問題的人。

DebboR

+0

謝謝@DebboR!我到處搜索,你是對的,如果我保持我的連接打開,我不會得到這個惱人的錯誤:) – wind39

0

想,如果你試圖關閉明確地定義每次打開它進行連接。但只要沒有併發問題,使用鎖使用單例模式會更好。我對Xamarin很新,但可能沒有連接緩存。