2010-11-05 12 views
8

J'ai une application winform C# qui accède aux données d'une base de données MS Access. Cela signifie que mes applications requièrent au moins 2 fichiers, le fichier .exe et le fichier .accdb. Est-il possible d'inclure la base de données dans le fichier .exe, donc ma solution consiste en un seul fichier (de la même manière que vous incluez une image dans les ressources du projet)? Si c'est possible, sont-ils des raisons majeures pour lesquelles cela ne devrait pas être fait et comment auriez-vous accès aux données du code? Le projet est un petit peu pour un usage personnel, donc si la performance est atteinte, cela n'a pas trop d'importance.Intégrer la base de données MS Access dans l'application C# WinForm

merci d'avance

+0

Je suppose que vous voulez dire que vous voulez un seul fichier d'installation EXE, par opposition à votre application finale étant un seul EXE dans lequel la MDB est intégrée. Ce dernier est trop absurde pour être envisagé, et est complètement impossible dans tous les cas (probablement avec n'importe quel moteur de base de données). –

Répondre

2

Non, cela ne devrait pas être fait. Comment voulez-vous envoyer quelqu'un et mettre à jour le fichier .exe sans qu'ils perdent leurs données? Gardez-le séparé.

Vous devez disposer d'un moyen de gérer la façon dont vos applications sont installées et l'emplacement du fichier dans vos chaînes de connexion. Il pourrait y avoir un sous-dossier \ Data dans votre dossier d'application avec le (s) fichier (s) .accdb dedans.

+0

merci pour cette réponse rapide. Bien que je sois d'accord avec tout ce que vous avez dit, cette application ne sera utilisée que par moi. J'accepte qu'il ne devrait pas être fait, je me demande simplement si c'est possible –

+0

Il ne pourrait pas être fait, parce que Jet/ACE doit mettre à jour le dossier, ainsi vous ne pouvez pas l'incorporer dans le EXE lui-même. La suggestion est absurde. –

-2

L'accès nécessite de pouvoir lire et écrire dans le fichier. Le système d'exploitation verrouille l'exe lorsqu'il est exécuté de sorte qu'il ne peut pas être modifié en cours d'utilisation. Ceci le fera ne pas fonctionner, sans mentionner qu'Access simple ne pourrait pas lire l'exe puisqu'il s'attend à un format de fichier différent.

1

Vous ne pouvez probablement pas obtenir ce que vous voulez avec une base de données d'accès en tant que ressource intégrée, mais vous obtiendrez le même résultat en enveloppant tous vos fichiers dans une autre application exécutable. Lorsque vous exécutez l'application wrapper, elle extrait l'application C# "principale", le fichier de base de données et une application de mise à jour (plus de détails ci-dessous) dans le dossier des fichiers temporaires et exécute l'application principale. Lorsque l'application principale est fermée, elle exécute l'application de mise à jour, transmettant les chemins d'accès au fichier de base de données et à l'application d'encapsuleur d'origine. L'application de mise à jour met à jour le fichier d'application wrapper avec le fichier de base de données modifié. Il supprime ensuite l'application principale de base de données et le fichier de base de données du dossier temporaire. Malheureusement, l'application de mise à jour ne peut pas se supprimer elle-même, mais vous pouvez contourner ce problème en ajoutant une commande à la section runonce du registre pour supprimer l'application de mise à jour au prochain redémarrage.


Au lieu de déterminer comment extraire et insérer des ressources incorporées, envisager d'avoir l'application d'emballage comme un comprimé, exécutable auto-extractible (comme un zip auto-extractible ou fichier rar). Voici un codeproject article qui décrit comment transformer une application .Net en un exe compressé et auto-extractible.

3

Il peut être fait. Ajoutez-le simplement à votre projet en ajoutant tout autre fichier (clic droit sur projet -> Ajouter -> élément existant), puis annulez toutes les boîtes de dialogue qui vous apparaîtront pour le gérer, puis faites un clic droit sur votre base de données depuis votre projet explorateur, accédez aux propriétés et sélectionnez Build Action: Embedded Resource.

Ensuite, utilisez la méthode ci-dessous pour vider votre base de données dans un fichier temporaire que vous pouvez créer en appelant Path.GetTempFileName.

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

(Notez que MyEmbeddedDatabase serait le nom de votre base de données intégrée). Ensuite, utilisez votre nom de fichier temporaire dans votre chaîne de connexion. Assurez-vous de supprimer votre fichier temporaire lorsque vous avez terminé. En outre, comme d'autres l'ont dit, vous ne serez pas en mesure de modifier et d'enregistrer des données.

+0

cela ne renferme pas le q – nawfal

+0

@nawfal Pourquoi pas? Ne montre-t-il pas comment intégrer une base de données dans un projet comme si vous incorporiez une image? – Juan

+0

quel est le point dans la simple incorporation d'une base de données comme la ressource et le dumping si l'utilisateur ne peut pas modifier et enregistrer, dans la question ci-dessus. Le but d'une base de données est de sauvegarder des données. Je veux dire que votre réponse ne répond qu'en partie, mais sans utilité puisque vous ne pouvez que vider, ne pas modifier – nawfal

Questions connexes