2010-11-05 3 views
8

Ich habe eine C# Winform-Anwendung, die auf Daten aus einer MS Access-Datenbank zugreifen. Das bedeutet, dass meine Anwendungen mindestens zwei Dateien benötigen, die .exe-Datei und die .accdb-Datei. Ist es möglich, die Datenbank in die EXE-Datei aufzunehmen, sodass meine Lösung aus einer einzigen Datei besteht (genauso wie Sie ein Bild in die Projektressourcen aufnehmen würden)? Wenn es möglich ist, sind das wichtige Gründe, warum es nicht gemacht werden sollte und wie würden Sie auf die Daten aus dem Code zugreifen? Das Projekt ist nur ein kleines für den persönlichen Gebrauch, und wenn die Leistung erreicht wird, spielt das keine große Rolle.MS Access-Datenbank in C# WinForm App einbetten

danke im voraus

+0

Ich nehme an, Sie meinen, Sie wollen eine einzige EXE-Setup-Datei, im Gegensatz zu Ihrer letzten App, die eine einzige EXE ist, in der die MDB eingebettet ist. Letzteres ist zu absurd, um in Betracht gezogen zu werden, und ist in jedem Fall völlig unmöglich (wahrscheinlich mit irgendeiner Datenbankmaschine überhaupt). –

Antwort

2

Nein sollte es nicht getan werden. Wie würden Sie jemanden senden und auf die EXE-Datei aktualisieren, ohne dass diese ihre Daten verlieren? Halte es getrennt.

Sie müssen eine Möglichkeit haben, zu verwalten, wie Ihre Anwendungen installiert werden, und den Speicherort in Ihren Verbindungszeichenfolgen. Es könnte einen \ Data-Unterordner in Ihrem App-Ordner geben, in dem sich die .accdb-Datei (en) befinden.

+0

danke für solch eine schnelle Antwort. Während ich mit allem einverstanden bin, was Sie gesagt haben, wird diese Anwendung immer nur von mir verwendet werden. Ich akzeptiere, dass es nicht getan werden sollte, ich frage mich nur, ob es möglich ist –

+0

Es könnte unmöglich getan werden, weil Jet/ACE die Datei aktualisieren muss, so dass Sie es nicht in der EXE selbst einbetten können. Der Vorschlag ist absurd. –

-2

Zugriff muss in der Lage sein, in die Datei zu lesen und zu schreiben. Das Betriebssystem wird die ausführbare Datei beim Ausführen sperren, so dass sie während der Verwendung nicht geändert werden kann. Dies wird dazu führen, dass es nicht funktioniert, nicht zu erwähnen, dass Access einfach nicht in der Lage, die exe zu lesen, da es ein anderes Dateiformat erwartet.

1

Sie können wahrscheinlich nicht erreichen, was Sie wollen mit einer Access-Datenbank als eingebettete Ressource, aber Sie erhalten effektiv das gleiche Ergebnis, indem Sie alle Ihre Dateien in eine andere ausführbare App einpacken.

Wenn Sie die Wrapper-Anwendung ausführen, extrahiert sie die C# -App, die Datenbankdatei und eine Updater-App (mehr dazu unten) zum temporären Dateiordner und führt die Hauptanwendung aus.

Wenn die Haupt-App geschlossen ist, wird die Updater-App ausgeführt, wobei die Pfade zur Datenbankdatei und der ursprünglichen Wrapper-Anwendung übergeben werden. Die Updater-App aktualisiert die Wrapper-Anwendungsdatei mit der geänderten Datenbankdatei. Es löscht schließlich die Datenbank-Hauptanwendung und die Datenbankdatei aus dem Temp-Ordner. Leider kann sich die Updater-App nicht selbst löschen, aber Sie können dies umgehen, indem Sie dem Abschnitt runonce der Registrierung einen Befehl hinzufügen, um die Updater-App beim nächsten Neustart zu löschen.


Statt aus herauszufinden, wie zu extrahieren und eingebettete Ressourcen einsetzen, sollten Sie als komprimierte, selbstextrahier die Wrapper-Anwendung, die (wie eine selbstextrahierende ZIP oder RAR-Datei). Hier finden Sie eine codeproject article, die beschreibt, wie Sie eine .Net-Anwendung in eine komprimierte, selbst extrahierende Exe umwandeln.

3

Es kann getan werden. Fügen Sie es einfach zu Ihrem Projekt hinzu, als würden Sie eine andere Datei hinzufügen (Rechtsklick-Projekt -> Hinzufügen -> Vorhandenes Element), dann alle Dialoge abbrechen, die Ihnen die Bearbeitung ermöglichen, dann klicken Sie mit der rechten Maustaste auf Ihre Datenbank aus Ihrem Projekt Explorer, gehen Sie zu den Eigenschaften und wählen Sie Build Action: Embedded Resource.

Verwenden Sie dann die folgende Methode, um Ihre Datenbank in eine temporäre Datei zu entladen, die Sie erstellen können, indem Sie Path.GetTempFileName aufrufen.

internal void CreateBlankDatabase(string destFile) 
{ 
    using (Stream source = new MemoryStream(Properties.Resources.MyEmbeddedDatabase)) 
    using (Stream target = File.Open(destFile, FileMode.Truncate)) 
    { 
     source.CopyTo(target); 
    } 
} 

(Beachten Sie, dass MyEmbeddedDatabase Ihr eingebetteter Datenbank-Name sein würde). Verwenden Sie dann Ihren temporären Dateinamen in Ihrer Verbindungszeichenfolge. Stellen Sie sicher, dass Sie Ihre temporäre Datei löschen, nachdem Sie fertig sind. Wie bereits erwähnt, können Sie keine Daten ändern und speichern.

+0

dies nicht asnwer die q – nawfal

+0

@ nawfal Warum nicht? Zeigt es nicht, wie man eine Datenbank in ein Projekt einbindet, als würde man ein Bild einbetten? – Juan

+0

Was ist der Sinn darin, einfach eine Datenbank wie eine Ressource einzubetten und sie zu verwerfen, wenn der Benutzer sie nicht bearbeiten und speichern kann, in der obigen Frage. Der gesamte Zweck einer Datenbank besteht darin, Daten zu speichern. Ich meine, deine Antwort antwortet nur teilweise, aber ohne Nutzen, da du nur dumpst, nicht modifizieren kannst. – nawfal