2011-04-08 31 views
6

Windows Phone ile birlikte çalışan Community.Csharp'ı çalıştırmaya çalışıyorum, hem http://wp7sqlite.codeplex.com/ numaralı sürümü kullanarak hem de WINDOWS_PHONE bayrağıyla ana gövdeyi derlemeyi denedim, ancak uygulamayı telefon herhangi sorguları yürütmeye çalışırken bir hata alıyorum (ancak veritabanı açma değilken, sadece sorgularında): "açılamadı veritabanı dosyası" olsa İlginçtirWindows Phone 7: SQLite

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

, ben kontrol etmek için aşağıdaki kullanıyorum bir tablonun varlığı ve istisnalar hariç tutulmaktadır:

SQLite kullanan bir Windows uygulamasına sahibim, bu yüzden SQLite'yi Sterling DB'ye veya başka bir şeye karşı kullanabilseydim, bu çok büyük miktarda zaman tasarrufu sağlardı. Şu an sahip olduğum problem, veritabanını açıp kapattığımda tekrar açamıyorum.

+4

, daha http://stackoverflow.com/editing-help bkz:
... Ben sadece genç bir programcı değilim. – BoltClock

cevap

5

Şirketimizin başvurusu için aynı kütüphaneyi kullanıyorum ve bildiğim kadarıyla, http://wp7sqlite.codeplex.com (under Some Recommendations) da belgelendi, eğer bağlantıyı kapatırsanız tekrar yeniden oluşturmanız gerekir. Ben Hatanın nedenini izini ettik

== EK AÇIKLAMALAR ==, bir düzeltme oluşturulan ve bizim uygulamasında test ediyorum. Kısaca, Community.CSharpSqlite kitaplığını WP7'ye bağlamak için, yazar WP7 IsolatedStorageFileStream öğesinin etrafında bir FileStream sarmalayıcı yazdı. Bir db açıldığında, db dosya akışı açılır ve CSharpSqlite tarafından okunup kapatılır. Ancak, bu akışa yönelik bir tutamaç, dosya akışına eşlenen bir sözlükte de saklanır. Bir db ikinci kez açıldığında, akımın tanıtıcısı alınır, ancak kapatıldığından (varsayımıyorum, henüz doğrulanmadı) db açılmaz.

Eğer source code Community.CsharpSqlite.FileStream aşağıdaki değişiklikleri yapın isem değişiklikler wp7sqlite.codeplex.com projeye konuşlandırılmış alma girişiminde, ama bu arada edecek

değişiklik

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); 
     } 
    } 
dan

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); 
    } 

Bu ben hata ayıklama girişiminde ve bir açık kaynak projesine katkıda ediyorum ilk defa. Bu değişiklikler hakkında herhangi bir yorum veya düşünce büyük takdir edilecektir.

Alasdair.

+0

Teşekkürler, bu sorunu düzeltmek için görünüyor. Projenin kaynağı, adlandırma kurallarında çok C gibi görünüyor. – Echilon

+0

Harika iş; 1! Öncelikle, VanSiner'ın çözümünü tercih ediyorum ve kodunuzun yakında eklenmesini umuyordum.:-) –

3

Merhaba Ben de aynı sorunla karşılaştım ... Bunun için düzeltmeyi aldım. Yaptığım şey bu.

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

Gerçekten dll'yi değiştirmem gerekmiyor.
Bunun daha sonra hatalara neden olup olmayacağından henüz emin değilim, ama şimdilik benim için çalışıyor. D artık size Mesajları biçimlendirmek bilmeli 100'den fazla sorularla

+1

Çalışıyor görünüyor (sadece bir seferde tek bir bağlantınız varsa, en azından). Birisi 'HandleTracker' özelliği olmayan FileStream' tarafından güdüleniyorsa, bunun nedeni System.IO.FileStream' değil, 'Community.CsharpSqlite.FileStream'. –