2009-04-26 7 views
9

Attualmente sto lavorando ad alcuni lavori di valutazione per un progetto che sto pianificando.Come posso incorporare un database SQLite in una DLL .NET e quindi utilizzarlo da C#?

Recentemente ho esaminato le soluzioni per un meccanismo di archiviazione dei dati per la mia applicazione e mentre cercavo mi sono imbattuto in SQLite. Attualmente utilizzo SQLite con il wrapper System.Data.SQLite.

Mi piace molto il modo in cui funziona, ma ho un problema che non è stato possibile correggere e non ho trovato alcun aiuto riguardo il mio problema su Internet.

Desidero che il mio database SQLite sia incorporato in una delle mie DLL di applicazioni (ad esempio Title.Storage.dll) da utilizzare all'interno di questa DLL. È possibile?

Come posso accedere al database, quindi?

Sarebbe bello se potessi usare qualcosa come:

SQLiteConnection con = new SQLiteConnection(); 
con.ConnectionString="DataSource=Title.Storage.storage.db3"; 
con.Open(); 

Grazie in anticipo e cordiali saluti,

3Fox

+3

Questo non può assolutamente essere possibile. Come scriveresti nel database? Dovresti aprire l'assemblea per scrivere. Non rispondere perché non posso fornire dettagli tecnici. – Will

+1

Anche se fosse possibile, immagino che invierebbe alcune suite di sicurezza impazzite: grandi e costanti modifiche a un file di codice. – dommer

+2

Se si disponesse di una piccola quantità di dati * di sola lettura * che si desiderava interrogare, questo probabilmente funzionerebbe correttamente - leggere la risorsa in un database in memoria e interrogarla. – Shog9

risposta

14

Un'assemblea non è per l'archiviazione dei file, è per il codice Conservazione. Mentre è possibile memorizzare i file in un assembly, sono di sola lettura.

+0

Le risorse sono sicuramente di sola lettura dal codice. – Will

+5

Che dire di un database di sola lettura? –

1

È possibile farlo semplicemente incorporando file come una risorsa, ma è necessario estrarre il DB da DLL, dopo di che si può prendere questo file e hot-backup in db memoria SQLite e cancellare file (o semplicemente apri quel file). Se hai bisogno di dettagli - lascia un commento.

+0

Si prega di fornire i dettagli. Sto cercando una soluzione simile. Voglio spedire il db utilizzato per l'esecuzione di test. Voglio esplorare entrambe le opzioni hotbackup e semplicemente aprire il file –

0

Se si utilizza NTFS, è possibile utilizzare un flusso di dati alternativo. Sul mio progetto nascondiamo il database SQLite all'interno di un altro file usando un flusso alternativo chiamato: DB.

+0

cosa succede se copio il file su una partizione FAT32 e ritorno? – Lucas

+0

Perderai stream alternativo dopo aver copiato il file nella partizione FAT. – mateusza

-2

SQLite è pacchettizzato e distribuito come un singolo file C con pochi (3 penso) file di intestazione. Ciò significa che è possibile compilare l'intero programma di linea 50000 con un comando di compilazione e ottenere un file .o. Da lì, puoi collegarlo alla DLL dell'applicazione con gli altri file che colleghi in quella DLL.

Dopo aver creato sqlite3.o nella DLL dell'applicazione, i simboli nell'API di SQLite diventano disponibili per i programmi nello stesso modo in cui le altre DLL C/C++ diventano disponibili per i programmi C#/VB.

Controlla www.sqlite.org/amalgamation.html per maggiori informazioni.

+2

Non era assolutamente quello che stavo cercando di ottenere. Ho voluto incorporare il file del database in una DLL e non la DLL che mi consente di accedervi. – chrischu

0

Non penso che memorizzare dati in DLL sia una buona idea, ma c'è un modo sporco per farlo.

di caricare dati da DLL:

  1. Usa System.Reflection.Assembly per caricare una stringa da un file DLL. (La stringa è dump di DB)
  2. Creare un DB SQLite vuoto nella memoria.
  3. Utilizzare la stringa caricata come query su DB per ripristinarne il contenuto.

Ora è possibile effettuare qualsiasi richiesta in memoria.

Per salvare i dati di DLL:

  1. Dump contenuto DB in una stringa.
  2. Creare un file temporaneo contenente SQL-dump avvolto nel codice C#.
  3. Compilalo usando "csc" (o "gmcs" in Mono).

È stupido, ma dovrebbe funzionare. Spero che non codificherete mai in questo modo.

2

Questo non è possibile in quanto tale. Quello che potresti fare è incorporare il db nel tuo progetto dll e scaricarlo in una determinata posizione del file system (può essere AppData?) E leggere e scrivere da lì. Avere db sit direttamente all'interno dell'eseguibile (o dll) potrebbe non essere una buona idea, nel senso che alleggerisce la dimensione dell'applicazione oltre che tecnicamente non fattibile.

Avere un singolo file eseguibile da distribuire è una questione di gusti che mi piace. Nel tuo caso, ma i problemi sono più. Non si tratta solo di incorporare il file db da solo, per quanto riguarda le DLL associate ad esso? I passaggi sono 2:

1) Aggiungere le DLL necessarie (System.Data.SQLite) associati con il vostro db al progetto come Embedded Resource(non necessariamente un) e lasciare che il sistema di risolvere automaticamente i conflitti di assemblaggio?. Catch it here come farlo.

2) Ora, o aggiungere il file db al Resources del progetto (ed estrarla)

static void DumpDatabase() 
{ 
    var dbFullPath = Utility.GetDbFullPath(); //your path 
    if (File.Exists(dbFullPath)) 
     return; //whatever your logic is 

    File.WriteAllBytes(dbFullPath, Properties.Resources.myDb); 
} 

o ancora meglio Non incorporare il db in quanto tale, nel progetto, ma scrivere la logica di crea un database nella tua applicazione. Cosa succede se domani hai bisogno di cambiare la versione di SQLite, diciamo da 3 a 4? Con il primo approccio è necessario creare un database per te stesso e reincorporarlo nel progetto. Ma se stai scrivendo la logica per creare il db nella tua applicazione, aggiornare la versione di SQLite è solo questione di cambiare la DLL di ADO.NET (il codice rimane lo stesso). Può essere in questo modo:

static void DumpDatabase() 
{ 
    var dbFullPath = Utility.GetDbFullPath(); 
    if (File.Exists(dbFullPath)) 
     return; //whatever your logic is 

    CreateDb(dbFullPath); 
} 

static void Create(string dbFullPath) 
{ 
    SQLiteConnection.CreateFile(dbFullPath); 

    string query = @" 

    CREATE TABLE [haha] (.............) 
    CREATE TABLE .............."; 

    Execute(query); 
} 

E nella stringa di connessione aggiungere FailIfMissing=False;