7

Estoy implementando una aplicación winform creada con vs 2008 0n XP sp3.implementando la aplicación winform con sqlite incrustado

he creado una base de datos con esquema de vacío, que me cayó en la carpeta raíz del proyecto y en las propiedades de Elegí Build Action: recursos incrustados y Copy to Output directory: Copiar siempre. Ahora, en lugar de tener connectionstring en la sección app.config connectionString, puse una entrada en appSetting: key = "database"; value = "mydb.db; Version = 3".

Así que para crear mi connectionString i utilizado:

SQLiteConnection con = new SQLiteConnection("Data Source=" + Path.Combine(Application.StartupPath, ConfigurationManager.AppSettings["database"])); 

Todo funciona bien y me empaqueta la aplicación con un project.Now configuración después de instalar la aplicación de la base de datos no se pudo encontrar y me vi obligado a copiar la base de datos al Application Folder en el proyecto de instalación para que funcione.

lo que pensé es que se supone que db está en la aplicación dll debido a copy always .pero no puedo acceder a él. Entonces, ¿qué hice exactamente mal?

estoy sospechando que debería haber acaba de conectarse al significado de la raíz no db usando Application.StartupPath

pero estoy aquí pidiendo las mejores prácticas causan lo que hice está trabajando, pero aún mirando como solución así que por favor puede alguien comparte su experiencia conmigo? gracias por leer

+0

Supongo que esto es más una pregunta de "incrustación de un archivo" que una pregunta de SQLite. –

+1

sí, sí. Pero entonces sqlite es una de las bases de datos más integradas, por lo que la mayoría de los usuarios de sqlite podrían saber si se debe incrustar una base de datos.correcta? –

Respuesta

5

Embedded Resource significa que la base de datos se incrusta en su dll. La configuración Copy to output directory no se aplica en este caso, que se usa para Build Action: Content.

Con la base de datos incrustada, básicamente tiene que descomprimirla en el primer uso. Para hacerlo, léalo del ensamblaje y guárdelo en un archivo.

class EmbeddedResourceTest 
{ 
    public static void Test() 
    { 
     string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Test.db"); 

     using(var resourceStream = typeof(EmbeddedResourceTest).Assembly.GetManifestResourceStream("Test.db")) 
     { 
      using(var fileStream = File.OpenWrite(path)) 
      { 
       CopyStream(resourceStream, fileStream); 
      } 
     } 

     // now access database using 'path' 
    } 

    public static void CopyStream(Stream inputStream, Stream outputStream) 
    { 
     CopyStream(inputStream, outputStream, 4096); 
    } 

    public static void CopyStream(Stream inputStream, Stream outputStream, int bufferLength) 
    { 
     var buffer = new byte[bufferLength]; 
     int bytesRead; 
     while ((bytesRead = inputStream.Read(buffer, 0, bufferLength)) > 0) 
     { 
      outputStream.Write(buffer, 0, bytesRead); 
     } 
    } 
} 
Cuestiones relacionadas