2011-04-08 22 views
6

मैं समुदाय प्राप्त करने की कोशिश कर रहा हूं। क्रिसप विंडोज फोन के साथ काम कर रहा है, मैंने http://wp7sqlite.codeplex.com/ से दोनों संस्करणों का उपयोग करने और 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 का उपयोग करता है, इसलिए यदि मैं स्क्लिंग डीबी या कुछ और के विपरीत SQLite का उपयोग कर सकता हूं, तो यह बड़ी मात्रा में बचाएगा। वर्तमान में समस्या यह है कि एक बार जब मैं डेटाबेस खोलता हूं और इसे बंद करता हूं, तो मैं इसे फिर से खोल नहीं सकता।

+4

100 से अधिक प्रश्नों के साथ आपको पता होना चाहिए कि अब तक अपनी पोस्ट कैसे प्रारूपित करें, http://stackoverflow.com/editing-help और देखें। – BoltClock

उत्तर

5

मैं अपनी कंपनी के आवेदन के लिए एक ही लाइब्रेरी का उपयोग कर रहा हूं और जहां तक ​​मुझे पता है, http://wp7sqlite.codeplex.com (under Some Recommendations) पर भी दस्तावेज किया गया है, यदि आप कनेक्शन बंद करते हैं तो आपको इसे फिर से बनाना होगा।

== अतिरिक्त टिप्पणियाँ ==

मैं त्रुटि के कारण नीचे ट्रैक करने के बाद, एक फिक्स बनाया है और हमारे आवेदन में यह परीक्षण कर रहा हूँ। संक्षेप में, समुदाय को बंद करने के लिए .CSharpSqlite लाइब्रेरी को WP7 पर, लेखक ने WP7 IsolatedStorageFileStream के आस-पास एक फ़ाइलस्ट्रीम रैपर लिखा था। जब एक डीबी खोला जाता है, तो डीबी फाइल स्ट्रीम खोला जाता है और CSharpSqlite द्वारा पढ़ और बंद किया जाता है। लेकिन स्ट्रीम के लिए फ़ाइल पथ मैपिंग एक शब्दकोश में इस स्ट्रीम के लिए एक हैंडल भी संग्रहीत किया जाता है। जब दूसरी बार एक डीबी खोला जाता है, तो स्ट्रीम को हैंडल पुनर्प्राप्त किया जाता है लेकिन चूंकि यह बंद हो जाता है (मुझे लगता है कि, अभी तक सत्यापित नहीं हुआ है) डीबी खोलने में विफल रहता है।

मैं अगर तुम source code Community.CsharpSqlite.FileStream में निम्न परिवर्तन है मेरे परिवर्तन wp7sqlite.codeplex.com परियोजना के लिए तैनात किया पाने के लिए प्रयास करेगा, लेकिन इस बीच में

परिवर्तन

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

धन्यवाद, यह समस्या को ठीक करने लगता है। प्रोजेक्ट का स्रोत इसके नामकरण सम्मेलनों में बहुत सी लगता है। – Echilon

+0

ग्रेट जॉब; +1! मैं प्रारंभ में @ VanSiner के समाधान का चयन कर रहा हूं और आशा करता हूं कि आपका कोड जल्द ही शामिल हो जाएगा।:-) –

3

हाय मुझे एक ही समस्या का सामना करना पड़ा है ... मुझे लगता है कि मुझे इसके लिए ठीक मिला है। यह वही है जो मैंने किया है।

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

मुझे वास्तव में डीएलएल को बदलने की आवश्यकता नहीं है।
मुझे अभी तक यकीन नहीं है कि यह बाद में त्रुटियों का कारण बन जाएगा, लेकिन अभी यह मेरे लिए काम करता है।
... मैं केवल एक जूनियर प्रोग्रामर हूं: डी

+1

काम करने लगता है (यदि आपके पास केवल एक समय में एक कनेक्शन खुला है, कम से कम)। अगर किसी और को 'फाइलस्ट्रीम' द्वारा 'हैंडलट्रैकर' संपत्ति नहीं है, तो ऐसा इसलिए है क्योंकि यह 'System.IO.FileStream' नहीं है, बल्कि' Community.CsharpSqlite.FileStream' है। –

संबंधित मुद्दे