2010-11-05 2 views
8

У меня есть приложение winform C#, которое обращается к данным из базы данных MS Access. Это означает, что для моих приложений требуется как минимум 2 файла, файл .exe и файл .accdb. Можно ли включить базу данных в файл .exe, поэтому мое решение состоит из одного файла (так же, как вы бы включили изображение в ресурсы проекта)? Если это возможно, являются ли они основными причинами, почему это не должно быть сделано, и как вы будете получать доступ к данным из кода? Проект является лишь небольшим для личного использования, поэтому, если производительность поражена, это не имеет большого значения.Вставить MS Access Database в C# WinForm app

заблаговременно

+0

Предполагается, что вы хотите, чтобы один файл установки EXE, в отличие от вашего последнего приложения, был единственным EXE, внутри которого встроен MDB. Последнее слишком абсурдно, чтобы его можно было рассматривать, и в любом случае совершенно невозможно (возможно, с любым движком базы данных вообще). –

ответ

2

Нет, это не должно быть сделано. Как вы отправите кого-то и обновите файл .exe, не потеряв их данные? Держите его отдельно.

У вас должен быть способ управлять установкой приложений и расположением файлов в строке (-ях) подключения. В папке приложения может быть папка \ Data в файле .accdb.

+0

спасибо за такой быстрый ответ. в то время как я согласен со всем, что вы сказали, это приложение будет использоваться только мной. Я согласен, что это не должно быть сделано, мне просто интересно, возможно ли это –

+0

Это невозможно сделать, потому что Jet/ACE должен обновить файл, поэтому вы не можете вставлять его в сам EXE. Предложение абсурдно. –

-2

Для доступа к нужном необходимо иметь возможность чтения и записи в файл. ОС будет блокировать exe, когда он будет запущен, чтобы он не мог быть изменен во время использования. Это приведет к тому, что он не будет работать, не говоря уже о том, что Access simple не сможет прочитать exe, поскольку он ожидает другого формата файла.

1

Возможно, вы не можете достичь того, чего хотите, используя базу данных доступа в качестве встроенного ресурса, но вы получите тот же результат, упакованный всеми вашими файлами в другое исполняемое приложение.

При запуске приложения-оболочки оно извлекает «основное» приложение C#, файл базы данных и приложение для обновления (подробнее об этом ниже) в папку временных файлов и запускает основное приложение.

Когда основное приложение закрыто, оно запускает приложение обновления, передавая пути к файлу базы данных и оригинальному приложению-оболочкой. Приложение updater обновляет файл приложения-оболочки с измененным файлом базы данных. Затем он окончательно удаляет основное приложение базы данных и файл базы данных из папки temp. К сожалению, приложение updater не может удалить себя, но вы можете обойти это, добавив команду в раздел runonce реестра, чтобы удалить приложение для обновления при следующей перезагрузке.


Вместо того, чтобы выяснить, как извлечь и вставить внедренные ресурсы, рассмотреть возможность применения обертки в виде сжатым, самораспаковывающийся исполняемого файла (например, самораспаковывающийся Zip или RAR-файл). Вот codeproject article, в котором описывается, как превратить приложение .Net в сжатый, самораспаковывающийся exe.

3

Это может. Просто добавьте его в свой проект, так как вы добавите любой другой файл (щелкните правой кнопкой мыши проект -> Добавить -> Существующий элемент), затем отмените все всплывающие окна, предлагающие вам обработать его, затем щелкните правой кнопкой мыши вашу базу данных из вашего проекта исследователь, перейдите к свойствам и выберите Build Action: Embedded Resource.

Затем используйте приведенный ниже метод, чтобы выгрузить базу данных во временный файл, который вы можете создать, позвонив по номеру 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); 
    } 
} 

(Обратите внимание, что MyEmbeddedDatabase будет вашим именем встроенной базы данных). Затем используйте свое временное имя файла в строке подключения. Убедитесь, что вы удалили свой временный файл после завершения. Кроме того, как было сказано, вы не сможете изменять и сохранять какие-либо данные.

+0

это doesnt asnwer q – nawfal

+0

@nawfal Почему бы и нет? Разве это не показывает, как встраивать базу данных в проект, как вы бы вставлять изображение? – Juan

+0

. В чем смысл простого встраивания базы данных, такой как ресурс, и сброса ее, если пользователь не может редактировать и сохранять его в вышеуказанном вопросе. Вся цель базы данных заключается в сохранении данных. Я имею в виду, что ваш ответ только частично отвечает на него, но бесполезен, поскольку вы можете просто сбрасывать, а не изменять – nawfal

Смежные вопросы