2011-04-08 42 views
6

Estoy tratando de que Community.Csharp trabaje con Windows Phone, he intentado usar tanto la versión de http://wp7sqlite.codeplex.com/ y compilar el tronco principal con el indicador WINDOWS_PHONE, pero cuando ejecuto la aplicación en el teléfono me sale un error al intentar ejecutar cualquier consulta (pero no al abrir la base de datos, y sólo en las consultas): "no se puede abrir el archivo de base de datos"Windows Phone 7: SQLite

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

Curiosamente, sin embargo, estoy usando el siguiente para comprobar si hay la existencia de una tabla y sin excepciones se arrojan:

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

Tengo una aplicación de Windows que usa SQLite, así que si pudiera usar SQLite en lugar de Sterling DB u otra cosa, eso ahorraría una gran cantidad de tiempo. El problema que tengo actualmente es que una vez que abro la base de datos y la cierro, no puedo volver a abrirla.

+4

Con más de 100 preguntas que usted debe saber cómo dar formato a tus mensajes de ahora, ver http://stackoverflow.com/editing-help por más. – BoltClock

Respuesta

5

Estoy usando la misma biblioteca para la aplicación de nuestra empresa y, hasta donde yo sé, también documentada en http://wp7sqlite.codeplex.com (under Some Recommendations), si cierra la conexión tendrá que volver a crearla.

== == Comentarios adicionales

He rastreado por la causa del error, creó una solución y poner a prueba, en nuestra aplicación. En resumen, para portar la biblioteca Community.CSharpSqlite a WP7, el autor escribió un contenedor FileStream alrededor de WP7 IsolatedStorageFileStream. Cuando se abre una base de datos, la secuencia de archivos db se abre, lee y cierra CSharpSqlite. Pero un identificador de este flujo también se almacena en un diccionario que mapea la ruta del archivo a la transmisión. Cuando se abre una base de datos por segunda vez, se recupera el identificador de la secuencia, pero como está cerrado (supongo que aún no se ha verificado), la base de datos no se abre.

voy a tratar de conseguir mis cambios desplegados para el proyecto wp7sqlite.codeplex.com, pero mientras tanto, si usted tiene la source code realizar los siguientes cambios a Community.CsharpSqlite.FileStream

cambio de

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

a

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

Esta es la primera vez que estoy tratando de depurar y contribuir a un proyecto de código abierto. Cualquier comentario o pensamiento sobre estos cambios será muy apreciado.

Alasdair.

+0

Gracias, esto parece solucionar el problema. La fuente del proyecto parece muy similar a C en sus convenciones de nombres. – Echilon

+0

Buen trabajo; +1! Opcionalmente opto por la solución de @VanSiner y espero que su código se incluya pronto.:-) –

3

Hola, he encontrado el mismo problema ... Creo que tengo la solución para ello. Esto es lo que hice.

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

Realmente no necesito cambiar el dll.
Todavía no estoy seguro si esto causará errores más adelante, pero por ahora me funciona.
... Sólo soy un programador junior: D

+1

Parece que funciona (si solo tiene una conexión abierta a la vez, al menos). Si alguien más se percata de 'FileStream' que no tiene la propiedad' HandleTracker', eso se debe a que esto no es 'System.IO.FileStream', sino' Community.CsharpSqlite.FileStream'. –