Aclaración sobre la acción de compilación

Tengo un proyecto que usa un archivo Access DB para tablas de referencia. Esto es para ser usado en el trabajo, pero lo estoy desarrollando en casa. Hasta ahora, simplemente ejecuté el depurador en VS2010, luego copié los archivos de clase relevantes, exe, etc. de la carpeta / bin a una unidad flash, y funcionó bien. Pero con la base de datos agregada, de repente falla al iniciarse.

Sé que el problema es la ubicación del archivo DB. Originalmente, la acción de compilación de la base de datos se enviaba a Contenido. Lo cambié a Recurso incrustado, lo que, según tengo entendido, significa que ahora formará parte del archivo exe.

¿Estoy en lo correcto en esto? Si no, ¿qué opción debo seleccionar para que la base de datos se convierta en una parte compilada del exe o en una de las otras dll?

preguntado el 22 de mayo de 12 a las 07:05

1 Respuestas

Si el archivo db está incrustado, no puede acceder a él para agregar/eliminar filas, etc. ¿Por qué cambió la acción de compilación a Recurso incrustado? Será mejor ponerlo como Contenido, por lo que la base de datos es un archivo separado del exe (pero aún en el mismo directorio), y luego crear la ruta al archivo de la base de datos (es decir, usar Application.StartupPath).

De todos modos, si desea configurarlo como Embebido, deberá extraer la base de datos en tiempo de ejecución y almacenarla en algún lugar antes de usarla.

Aquí hay un método que puede extraer un archivo de los recursos incrustados (por supuesto, deberá cambiar el nombre del archivo o pasarlo como argumento):

private void ExtractFromAssembly()
{
    string strPath = Application.LocalUserAppDataPath + "\\MyFile.db";
    if (File.Exists(strPath)) return; // already exist, don't overwrite
    Assembly assembly = Assembly.GetExecutingAssembly();
    //In the next line you should provide NameSpace.FileName.Extension that you have embedded
    var input = assembly.GetManifestResourceStream("MyFile.db");
    var output = File.Open(strPath, FileMode.CreateNew);
    CopyStream(input, output);
    input.Dispose();
    output.Dispose();
    System.Diagnostics.Process.Start(strPath);
}

private void CopyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[32768];
    while (true)
    {
        int read = input.Read(buffer, 0, buffer.Length);
        if (read <= 0)
            return;
        output.Write(buffer, 0, read);
    }
}

El archivo se copiará en la ruta de la aplicación local, en el directorio del usuario. Se hará la primera vez que se inicie la aplicación, porque de lo contrario, el archivo db se sobrescribirá cada vez que se inicie la aplicación (se sobrescribirá con el paquete clean db en el exe)

contestado el 22 de mayo de 12 a las 07:05

Para aclarar, no necesito acceder a la base de datos para agregar o eliminar filas, es puramente una base de datos de referencia. Almacena códigos postales, códigos de área y sus ubicaciones correspondientes. Entonces, dado este aspecto, ¿Se convierte Embedded Resource en una opción buena o adecuada? - kevin m

Si contiene datos, supongo que necesita usar estos datos. Entonces necesitas acceder a la base de datos. Y para acceder a él, debe extraerlo de Embedded Resource y guardarlo como un archivo separado. - fabulosa

Muy bien, gracias por la aclaración. Acabo de descubrir que el problema real era que OleDB no está registrado en la máquina: kevin m

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.