7

Sto distribuendo un'applicazione winform costruita con vs 2008 0n XP sp3.distribuzione di un'applicazione winform con sqlite incorporato

ho creato un database con schema vuoto che ho lasciato cadere nella cartella principale del progetto e nelle proprietà Ho scelto Build Action: risorse incorporate e Copy to Output directory: Copia sempre. Ora invece di avere connectiontring nella sezione connectionString di app.config, inserisco una voce in appSetting: key = "database"; value = "mydb.db; Versione = 3".

Quindi, per creare il mio connectionString ho usato:

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

Tutto funziona bene e ho confezionato l'applicazione con un project.Now configurazione Dopo aver installato l'applicazione del database non è stato trovato e mi è stato costretto a copiare il database per il Application Folder nel progetto di installazione affinché funzioni.

quello che ho pensato è che db dovrebbe essere nella dll dell'app a causa di copy always. Ma non riesco ad accedervi. Quindi cosa ho fatto di sbagliato?

sto sospettando avrei dovuto appena collegato al significato della radice db non si utilizza Application.StartupPath

ma io sono qui per chiedere le migliori pratiche causano quello che ho fatto sta lavorando, ma ancora alla ricerca come soluzione quindi per favore qualcuno può condividi la sua esperienza con me? grazie per la lettura

+0

Immagino che si tratti più di una domanda di "incorporamento di un file" che di una domanda SQLite. –

+1

sì, ma allora sqlite è uno dei database più incorporati, quindi la maggior parte di coloro che usano sqlite potrebbe sapere sull'inserimento di un database.correct? –

risposta

5

Embedded Resource significa che il database viene incorporato nella tua DLL. L'impostazione Copy to output directory non si applica in questo caso, utilizzato per Build Action: Content.

Con il database incorporato, è necessario annullarlo completamente al primo utilizzo. Per farlo, leggi dall'Assembly e salvalo in un file.

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