2011-06-20 17 views
9

Estoy tratando de cargar una base de datos SQLite que se incorporará en mi ejecutable como recurso. Para aquellos que son curiosos, es porque uso una pequeña base de datos SQLite para almacenar datos de configuración, y me gustaría enviar la configuración predeterminada incrustada dentro del ejecutable (odio tener que cargar archivos junto con un programa).Cargando una base de datos SQLite de una secuencia de bytes en .NET

Esta sería simplemente la configuración predeterminada. Es decir, no necesito modificar esta configuración. Es estático y no se puede cambiar después de que se haya creado mi programa.

Estoy usando el contenedor System.Data.SQLite para SQLite.

que puede tener acceso a un flujo de bytes de esta manera:

using (var stream = 
      Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) { 
    // use of "stream" here. 
} 

Sin embargo, yo estoy en una pérdida en lo que respecta a la creación de un objeto SQLiteConnection de esta corriente.

La salida más fácil sería simplemente generar un nuevo archivo de configuración cada vez que se carga el programa, y ​​luego decirle a SQLite que lea de ese archivo. Probablemente esto funcionaría, pero me gustaría evitar esa técnica. Planeo reutilizar mi solución a este problema para incluir también soporte de internacionalización (donde cada idioma es una base de datos SQLite [comprimida] y el lenguaje predeterminado está incrustado en el ejecutable; el usuario podría agregar otros idiomas simplemente copiando otras bases de datos de idiomas al directorio de trabajo del programa).

No me preocupan los costos de memoria de mantener esta base de datos en la memoria. Será muy pequeño (probablemente menos de 50 KiB), por lo que no me molesta. Obviamente, si se tratara de una base de datos más grande, esto podría ser un problema.

Finalmente, soy consciente de que esto puede verse como una forma inadecuada de almacenar una configuración. Si bien estoy de acuerdo en que una solución basada en texto claro es adecuada para casos en los que el usuario ingresa todas sus configuraciones manualmente, esto se usaría principalmente para configuraciones que el usuario no define explícitamente. Por ejemplo, para almacenar las posiciones de varias ventanas de acoplamiento en una aplicación, o para almacenar datos sobre dónde se pueden encontrar los recursos internos.

Gracias por su ayuda.

+0

7 años después y se pregunta si alguna vez obtuvo una solución para esto que le permitió guardar un sql lite db en un binario de la memoria o cargarlo desde una secuencia? – lucuma

Respuesta

5

parece que esta funcionalidad no está inmplemented en un proveedor de System.Data.SQLite. Ni siquiera puede guardar la base de datos en memoria en un archivo (es decir, en formato binario), solo en forma de un volcado de SQL.

Una de las soluciones es almacenar código SQL para la creación de bases de datos en un recurso. A continuación, cree en la memoria db cada vez que se inicie la aplicación.

+0

Lo he considerado, y en este momento parece ser el único camino a seguir. De cualquier manera, no debería ser terriblemente grande: iba a tratar de comprimir el recurso de todos modos (ya que las bases de datos SQLite con mucho texto parecen comprimir muy bien). – Ethan

0

creo que desea utilizar esto para su cadena de conexión:

Data source=:memory: 

ve aquí, por ejemplo: Opening a SQLiteConnection on a binary stream instead of a file?

+3

Sí, y eso sería bueno si quisiera comenzar con una base de datos vacía. Pero en este caso, tengo un flujo binario existente que me gustaría leer como base de datos, en lugar de simplemente abrir uno nuevo. – Ethan

+0

@Ethan: No veo nada en el ejemplo que publiqué sobre esto como una base de datos vacía.Pero para ser sincero, nunca he usado SQLite antes y solo estaba tratando de ayudar, por lo que no sé de lo que estoy hablando :) – mellamokb

+0

Bueno, tal vez hay una manera de hacerlo, pero el problema con su ejemplo es que no hay ningún lugar para que pase la secuencia binaria. Si este fuera el código no administrado, podría hacer algo ridículo, como pasar manualmente la dirección/tamaño del flujo en la memoria, pero estoy bastante seguro de que no es posible en .NET. – Ethan

Cuestiones relacionadas