2011-04-08 249 views
6

我試圖讓Community.Csharp與Windows Phone一起工作,我試過使用http://wp7sqlite.codeplex.com/這兩個版本並編譯WINDOWS_PHONE標誌的主幹,但是當我在手機,我在嘗試時執行任何疑問錯誤(但不打開數據庫時,只查詢):「無法打開數據庫文件」Windows Phone 7:SQLite

_conn = new SqliteConnection("Version=3,uri=file:recipes.sqlite"); 
_conn.Open(); 
cmd.CommandText = "SELECT * FROM recipes"; 
SqliteDataReader reader = cmd.ExecuteReader(); 

但有趣的是,我使用下面的檢查表中是否存在並且不存在例外情況:

cmd.CommandText = "SELECT * FROM sqlite_master WHERE name='" + tableName + "'"; 
SqliteDataReader rdr = cmd.ExecuteReader(); 
exists = rdr.Read(); 
rdr.Close(); 

我有一個使用SQLite的Windows應用程序,所以如果我可以使用SQLite而不是Sterling DB或其他東西,那將節省大量時間。我目前遇到的問題是,一旦我打開數據庫並關閉它,我無法重新打開它。

+4

由現在超過100個問題,你應該知道如何格式化您的文章,看到http://stackoverflow.com/editing-help更多。 – BoltClock 2011-04-08 11:55:13

回答

5

我爲我們公司的應用程序使用了相同的庫,據我所知,也記錄在http://wp7sqlite.codeplex.com (under Some Recommendations),如果關閉連接,則需要重新創建它。

==其他評論==

我就找到了錯誤的原因,造就了修復和我在我們的應用程序測試它。簡而言之,爲了將Community.CSharpSqlite庫移植到WP7,作者圍繞WP7 IsolatedStorageFileStream編寫了一個FileStream封裝器。打開數據庫時,數據庫文件流將被打開並讀取並由CSharpSqlite關閉。但是,此流的句柄也存儲在將文件路徑映射到流的字典中。當數據庫第二次打開時,該流的句柄被檢索,但是由於它被關閉(我假設,尚未驗證)數據庫無法打開。

我將嘗試獲得部署到wp7sqlite.codeplex.com項目我的變化,但在此期間,如果你有source code進行以下修改Community.CsharpSqlite.FileStream

變化從

public FileStream(string path, FileMode mode, FileAccess access, FileShare share, int unused) 
    { 
     IsolatedStorageFileStream handler = null; 
     if (FileStream.HandleTracker.TryGetValue(path, out handler)) 
     { 
      _internal = handler; 
     } 
     else 
     { 
      if (mode == FileMode.Create || mode == FileMode.CreateNew) 
      { 
       _internal = IsolatedStorageIO.Default.CreateFile(path); 
      } 
      else 
      { 
       _internal = IsolatedStorageIO.Default.OpenFile(path, FileMode.OpenOrCreate); 
      } 
      FileStream.HandleTracker.Add(path, _internal); 
     } 
    } 

public FileStream(string path, FileMode mode, FileAccess access, FileShare share, int unused) 
    { 
     IsolatedStorageFileStream handler = null; 
     if(FileStream.HandleTracker.TryGetValue(path, out handler)) 
     { 
      _internal = handler; 
      if(!_internal.CanRead) 
      { 
       FileStream.HandleTracker.Remove(path); 
       CreateOpenNewFile(path, mode); 
      } 
     } else { 
      CreateOpenNewFile(path, mode); 
     } 
    } 

    private void CreateOpenNewFile(string path, FileMode mode) 
    { 
     if(mode == FileMode.Create || mode == FileMode.CreateNew) 
     { 
      _internal = IsolatedStorageIO.Default.CreateFile(path); 
     } else { 
      try { 
       _internal = IsolatedStorageIO.Default.OpenFile(path, FileMode.OpenOrCreate); 
      } catch(Exception ex) { 
       var v = ex; 
      } 
     } 
     FileStream.HandleTracker.Add(path, _internal); 
    } 

這是我第一次嘗試調試和貢獻一個開源項目。任何意見或對這些變化的想法將不勝感激。

阿拉斯代爾。

+0

謝謝,這似乎解決了這個問題。該項目的源代碼在命名約定中看起來非常類似C。 – Echilon 2011-04-09 06:33:13

+0

偉大的工作; +1!我初步選擇了@ VanSiner的解決方案,並希望儘快將您的代碼納入其中。:-) – 2011-09-12 16:17:38

3

嗨,我遇到了同樣的問題......我想我得到了它的修復。 這就是我所做的。

public void CloseDB() 
    { 
    Connection.Close();    //Connection is a property(of type SqliteConnection) of my object 
    FileStream.HandleTracker.Clear(); //This here is the fix 
    } 

我真的不需要改變dll。
我還不確定這會在以後導致錯誤,但現在它適用於我。
......我只是一個初級程序員:d

+1

似乎工作(如果您一次只打開一個連接,至少)。如果有其他人被'FileStream'難住了'HandleTracker'屬性,那是因爲這不是'System.IO.FileStream',而是'Community.CsharpSqlite.FileStream'。 – 2011-09-12 16:16:41