Извлечение исходного кода из БД MS Access - PullRequest
3 голосов
/ 13 октября 2008

У меня есть Access DB, из которой я хотел бы извлечь исходный код, чтобы я мог поместить его в систему управления исходным кодом.

Я пытался извлечь данные с помощью Primary Interop Assemblies (PIA), но у меня возникают проблемы, так как он не собирает все модули и формы.

В коде содержится 140 форм и модулей (не спрашивайте, это унаследованная система, которую я унаследовал), но код PIA выбирает только 91 из них.

Вот код, который я использую.

using System;
using Microsoft.Office.Interop.Access;

namespace GetAccesSourceFiles
{
    class Program
    {
        static void Main(string[] args)
        {
            ApplicationClass appClass = new ApplicationClass();
            try
            {
                appClass.OpenCurrentDatabase("C:\\svn\\projects\\db.mdb",false,"");

                Console.WriteLine(appClass.Version);
                Console.WriteLine(appClass.Modules.Count.ToString());
                Console.WriteLine(appClass.Modules.Parent.ToString());

                int NumOfLines = 0;
                for (int i = 0; i < appClass.Modules.Count; i++)
                {
                    Console.WriteLine(appClass.Modules[i].Name + " : " + appClass.Modules[i].CountOfLines);
                    NumOfLines += appClass.Modules[i].CountOfLines;
                }

                Console.WriteLine("Number of Lines : " + NumOfLines);
                Console.ReadKey();
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message + "\r\n" +ex.StackTrace);
            }
            finally
            {
                appClass.CloseCurrentDatabase();
                appClass.Quit(AcQuitOption.acQuitSaveNone);
            }

        }
    }
}

Любые предложения о том, что этот код может отсутствовать? или на продукт / инструмент, который сделает это для меня?

Edit: Я должен также упомянуть, что для этого необходимо записать сценарий на диск, интеграция с VSS невозможна, поскольку нашей исходной системой является SVN. Спасибо.

Ответы [ 4 ]

1 голос
/ 22 декабря 2008

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

Вы можете написать процедуру, которая сохранит все объекты, не относящиеся к данным, в вашем MDB (или ADP) Access в виде текста, поместит его в модуль и просто сохранит этот модуль в версии разработки вашей БД Access. Затем вы можете запустить подпрограмму и проверить дамп-код в VSS.

Вероятно, он не такой элегантный, как метод Visual SourceSafe, описанный Митчем Уитом, но это зависит от того, что вы хотите сделать с исходным кодом. Я склонен зависеть от нескольких версий MDB и использовать этот метод для сравнения исходного кода между ними, используя инструменты сравнения, такие как WinMerge. Это хорошо для переноса функциональности между ветками разработки.

Это также хорошо для размещения всех ссылок на поля или элементы управления, где бы они ни находились. Просмотр объектов Access в виде текстовых определений упрощает поиск этих ссылок.

1 голос
/ 13 октября 2008

Это может помочь:

    Sub AllCodeToDesktop()
       'The reference for the FileSystemObject Object is Windows Script Host Object Model
       'but it not necessary to add the reference for this procedure.

       Dim fs As Object
       Dim f As Object
       Dim strMod As String
       Dim mdl As Object
       Dim i As Integer

       Set fs = CreateObject("Scripting.FileSystemObject")

       'Set up the file.
       Set f = fs.CreateTextFile(SpFolder("Desktop") & "\" _
         & Replace(CurrentProject.Name, ".", "") & ".txt")

       'For each component in the project ...
       For Each mdl In VBE.ActiveVBProject.VBComponents
           'using the count of lines ...
           i = VBE.ActiveVBProject.VBComponents(mdl.Name).CodeModule.CountOfLines
           'put the code in a string ...
           If VBE.ActiveVBProject.VBComponents(mdl.Name).codemodule.CountOfLines > 0 Then
              strMod = VBE.ActiveVBProject.VBComponents(mdl.Name).codemodule.Lines(1, i)
           End If
           'and then write it to a file, first marking the start with
           'some equal signs and the component name.
           f.writeline String(15, "=") & vbCrLf & mdl.Name _
               & vbCrLf & String(15, "=") & vbCrLf & strMod
       Next

       'Close eveything
       f.Close
       Set fs = Nothing
   End Sub

   Function SpFolder(SpName As String)
   'Special folders
       SpFolder = CreateObject("WScript.Shell").SpecialFolders(SpName)
   End Function  

От: http://wiki.lessthandot.com/index.php/Code_and_Code_Windows

1 голос
/ 13 октября 2008

Есть лучший способ. Вы можете использовать Visual Sourcesafe (и, возможно, другие SCC) для контроля кода и объектов на месте: см. Эту статью MSDN

0 голосов
/ 03 ноября 2008

Вы также можете взглянуть на его вопросы и ответы:

Работа с несколькими программистами в MS Access

...