Получить весь исходный код в файле MDB (msaccess), используя C # / VBScript - PullRequest
4 голосов
/ 16 сентября 2009

Я хотел бы получить весь исходный код из базы данных Access (формы, модули) без использования взаимодействия Office.

Мне понравилась функция AllCodeToDesktop() , найденная здесь . Однако это выполняется из файла mdb .

Что такое файл VBScript, который загружает файл mdb и запускает эту функцию на нем?

Ответы [ 4 ]

4 голосов
/ 16 сентября 2009

Если это для хранилища, вы можете посмотреть на Visual SourceSafe и получить надстройку Access VSS (ссылка для Access 2003, не пробовали другие версии) http://www.microsoft.com/downloads/details.aspx?familyid=2ea45ff4-a916-48c5-8f84-44b91fa774bc&displaylang=en

Я предполагаю, что надстройка Access предоставит интерфейс COM, который вы могли бы достаточно аккуратно извлечь из источника в свое приложение C #, если хотите пойти по этому пути. В любом случае, как отметил Роберт, Office все еще необходим.

4 голосов
/ 16 сентября 2009

Я хотел бы получить весь источник код из базы данных доступа (формы, модули) - без использования офиса interops

Требуется Microsoft Office. Вы также можете вставить свою функцию в MDB и запустить ее оттуда.

3 голосов
/ 16 сентября 2009

Чтобы сэкономить много времени, есть ли причина, по которой вы не используете встроенный документатор?

Tools-> analyze-> Архивариус

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

Я только упомянул это, чтобы сэкономить ваше время и усилия. Здесь нет необходимости писать код.

больше заметок: Я не думаю, что вы можете сделать это извне. Вы можете использовать ms-access как com-объект и использовать код для извлечения кода в виде текста, но вам нужен доступ, установленный на этом компьютере.

Существует два подхода, один из которых заключается в использовании команды saveastext. Это позволит экспортировать любую форму, отчет, код и т. Д. В виде текстового файла (это все, что используют надстройки исходного кода).

Второй подход - написание кода автоматизации. Вот код в нативном доступе (VBA), но вы также можете написать этот код на любом языке, который поддерживает com-объекты. Код будет выглядеть так:

  Dim db               As Database
  Dim Doc              As Document
  Dim mdl              As Module
  Dim lngCount         As Long
  Dim strForm          As String
  Dim strOneLine       As String
  Dim sPtr             As Integer

  Set db = CurrentDb()
  ' count module LOC

  For Each Doc In db.Containers("Modules").Documents
      DoCmd.OpenModule Doc.Name

      Set mdl = Modules(Doc.Name)

      lngCount = lngCount + mdl.CountOfLines
      For i = 1 To lngCount
         strOneLine = mdl.Lines(i, 1)
         Debug.Print strOneLine
      Next i

      Set mdl = Nothing
      DoCmd.Close acModule, Doc.Name

  Next Doc

Приведенный выше код можно легко модифицировать для поиска или экспорта текста. Я думаю, что использование saveastext - это меньше кода, но тогда вы получите определение форм и т. Д., И это, вероятно, не то, что вы хотите.

2 голосов
/ 17 сентября 2009

Я непритязательный программист Access и не могу сказать, что понимаю ваш вопрос.

Насколько я могу судить, чтобы получить то, что вы хотите, вам придется автоматизировать доступ через COM - другого пути нет. Процедуры для этого не зависят от версии и будут работать во всех версиях Access, по крайней мере, с 97, при условии, что версия Access, которую вы автоматизируете, совместима с просматриваемыми файлами (т. Е. A2000 будет быть неспособным исследовать ACCDB и может (или не может) давать ненадежные результаты для MDB A2002, A2003 и A2007).

Ключ использует Application.SaveAsText для сохранения всех объектов, несущих код. Это будет означать, что вы захотите пройтись по всем модулям, формам и отчетам, а те, у которых есть программные модули, выводятся с помощью SaveAsText. Для форм и отчетов вы можете проверить свойство HasModule (хотя это доступно только в режиме конструктора или представления формы, т. Е. Форма должна быть открыта), если вы хотите пропустить все объекты, в которых отсутствуют модули.

Если вам не нужна совместимость с A97, это намного проще. Вы можете использовать CurrentProject.AllForms, CurrentProject.AllReports и CurrentProject.AllModules. Если вы не заинтересованы в разграничении форм / отчетов с модулями кода и без них на этом этапе, вам не нужно открывать их, чтобы проверить свойство HasModule. Вместо этого вы можете просмотреть полученный экспортированный текстовый файл. Если модуля нет, тег CodeBehindForm будет отсутствовать в выходном файле.

Тем не менее, формы очень часто имеют модуль, но не имеют реального кода. Эти модули будут перечислены в выводе SaveAsText следующим образом:

  CodeBehindForm
  Attribute VB_GlobalNameSpace = False
  Attribute VB_Creatable = True
  Attribute VB_PredeclaredId = True
  Attribute VB_Exposed = False
  Option Compare Database
  Option Explicit

Option Explicit может присутствовать или отсутствовать, а база данных Option Compare технически не требуется, но 99% модулей, созданных в Access, будут иметь один или оба (только базы данных, созданные в Access 2000 с настройками по умолчанию, будут иметь Option Explicit ). Код начнется после 4 атрибутов. Если это просто два оператора OPTION, то за формой нет реального кода.

Вы должны иметь возможность выполнять COM-автоматизацию Access из vbScript на любом ПК с установленной версией Access, совместимой со всеми MDB / ACCDB, которые вы хотите исследовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...