2010-11-05 25 views
8

Tengo una aplicación de formato C# que accede a los datos de una base de datos de MS Access. Esto significa que mis aplicaciones requieren al menos 2 archivos, el archivo .exe y el archivo .accdb. ¿Es posible incluir la base de datos en el archivo .exe, por lo que mi solución consiste en un solo archivo (de la misma manera que incluiría una imagen en los recursos del proyecto)? Si es posible, ¿hay alguna razón importante por la que no se debe hacer y cómo accedería a los datos del código? El proyecto es solo uno pequeño para uso personal, por lo que si el rendimiento se alcanza, no importa demasiado.Incrustar base de datos de MS Access en la aplicación C# WinForm

gracias de antemano

+0

Supongo que quiere decir que quiere un único archivo de instalación de EXE, en lugar de que su aplicación final sea un único EXE dentro del cual está integrado el MDB. Esto último es demasiado absurdo para ser contemplado, y es completamente imposible en cualquier caso (probablemente con cualquier motor de base de datos). –

Respuesta

2

No, no se debe hacer. ¿Cómo enviarías a alguien y actualizarías al archivo .exe sin que ellos pierdan sus datos? Mantenlo separado.

Debe tener una forma de administrar cómo se instalan sus aplicaciones y la ubicación del archivo en su (s) cadena (s) de conexión. Puede haber una subcarpeta \ Data en la carpeta de la aplicación con los archivos .accdb en ella.

+0

gracias por una respuesta tan rápida. Aunque estoy de acuerdo con todo lo que ha dicho, esta aplicación solo la usaré yo. Acepto que no se debe hacer, solo me pregunto si es posible –

+0

No podría hacerse, porque Jet/ACE tiene que actualizar el archivo, por lo que no puede incrustarlo en el EXE. La sugerencia es absurda. –

-2

El acceso requiere poder leer y escribir en el archivo. El sistema operativo bloqueará el exe cuando se ejecute para que no se pueda cambiar mientras está en uso. Esto a su vez hará que no funcione, sin mencionar que Access simple no podría leer el exe, ya que está esperando un formato de archivo diferente.

1

Probablemente no pueda lograr lo que quiere con una base de datos de acceso como recurso incrustado, pero efectivamente obtiene el mismo resultado envolviendo todos sus archivos en otra aplicación ejecutable.

Cuando ejecuta la aplicación contenedora, extrae la aplicación "principal" C#, el archivo de base de datos y una aplicación de actualización (más sobre esto a continuación) en la carpeta de archivos temporales y ejecuta la aplicación principal.

Cuando la aplicación principal está cerrada, ejecuta la aplicación de actualización, pasando las rutas al archivo de base de datos y la aplicación contenedora original. La aplicación de actualización actualiza el archivo de la aplicación contenedora con el archivo de base de datos modificado. Finalmente, elimina la aplicación principal de la base de datos y el archivo de base de datos de la carpeta temporal. Desafortunadamente, la aplicación de actualización no puede eliminarse a sí misma, pero puede solucionarlo agregando un comando a la sección de ejecución del registro para eliminar la aplicación de actualización en el próximo reinicio.


En lugar de encontrar la manera de extraer e insertar recursos incrustados, teniendo en cuenta la aplicación como un envoltorio, ejecutable comprimido de extracción automática (como un comprimido de extracción o archivo rar). Aquí hay un codeproject article que describe cómo convertir una aplicación .Net en un exe comprimido y autoextraíble.

3

Es puede hacerse. Simplemente agréguelo a su proyecto ya que agregaría cualquier otro archivo (haga clic con el botón derecho en Proyecto -> Agregar -> Elemento existente), luego cancele todos los cuadros de diálogo que le ofrecen para manejarlo, luego haga clic con el botón secundario en su base de datos desde su proyecto explorer, vaya a propiedades y seleccione Build Action: Embedded Resource.

A continuación, utilice el método siguiente para volcar su base de datos en un archivo temporal, que puede crear llamando al 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); 
    } 
} 

(Tenga en cuenta que MyEmbeddedDatabase sería el nombre de base de datos integrada). Luego use su nombre de archivo temporal en su cadena de conexión. Asegúrese de eliminar su archivo temporal una vez que haya terminado. Además, como dijo otro, no podrá modificar ni guardar ningún dato.

+0

esto no asnwer la q – nawfal

+0

@nawfal ¿Por qué no? ¿No muestra cómo insertar una base de datos en un proyecto como si insertara una imagen? – Juan

+0

cuál es el punto de simplemente incrustar una base de datos como recurso y volcarla si el usuario no puede editarla y guardarla, en la pregunta anterior. El objetivo de una base de datos es guardar datos. Me refiero a que su respuesta solo la responde en parte, pero sin uso ya que solo puede volcar, no modificar – nawfal

Cuestiones relacionadas