2008-10-13 10 views
3

J'ai une base de données Access dont j'aimerais extraire le code source afin de pouvoir la placer dans le contrôle Source.Extraction de code source à partir d'une base de données MS Access

J'ai essayé d'extraire les données à l'aide des assemblys PIA (Primary Interop Assemblies), mais je rencontre des problèmes car il ne récupère pas tous les modules et formulaires.

Il y a 140 formulaires et modules dans le code (ne demandez pas, c'est un système hérité dont j'ai hérité) mais le code PIA n'en prend que 91.

Voici le code que j'utilise.

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); 
      } 

     } 
    } 
} 

Des suggestions sur ce que ce code pourrait manquer? ou sur un produit/outil là-bas qui va le faire pour moi?

Modifier: Je devrais également mentionner que cela doit script sur le disque, l'intégration avec VSS n'est pas une option car notre système source est SVN. Merci.

+1

Voir aussi http://stackoverflow.com/questions/247292/working-with-multiple-programmers-on-ms-access – Yarik

Répondre

1

Il existe un meilleur moyen. Vous pouvez utiliser Sourcesafe visuel (et éventuellement d'autres CEC) au code de contrôle de version et les objets en place: voir cette MSDN article

+0

Bonjour Mitch, Désolé, j'aurais dû le mentionner. Notre contrôle de source est SVN en interne, j'ai regardé l'outil VSS, mais il doit vraiment être scriptable dans un dossier afin que je puisse le commettre sur SVN. Merci pour la réponse :-) – evilhomer

+0

En dernier recours, pourriez-vous mettre tout votre développement Access dans VSS? –

+0

L'avez-vous vu?: Http://svn.haxx.se/users/archive-2005-05/1325.shtml –

1

Cela peut aider:

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 

De: http://wiki.lessthandot.com/index.php/Code_and_Code_Windows

+0

Si vous exécutez ceci dans Access, il me semble qu'il serait beaucoup plus sensé de parcourir les collections Forms, Reports et Modules et d'utiliser Application.SaveAsText pour écrire le code (et les définitions de formulaire complet, en fait) sur le système de fichiers. Cela éliminerait le besoin de l'OFS. –

+0

Il peut être pratique d'écrire tout le code dans un fichier sans avoir à parcourir chaque collection. Le texte résultant peut être utilisé pour comparer le code de deux bases de données/frontaux éventuellement identiques. – Fionnuala

1

Vous pourriez nous e le non documenté Application.SaveAsText et Application.LoadFromText fonctions. SaveAsText fonctionne sur les modules, les formulaires et les rapports; et lorsque vous enregistrez un formulaire ou un état sous forme de texte, son code de module apparaît en bas du fichier texte résultant.

Vous pouvez écrire une routine qui enregistrerait tous les objets non-données dans votre MDB Access (ou ADP) sous forme de texte, le placer dans un module et conserver ce module dans une version de développement de votre DB Access. Ensuite, vous pouvez exécuter la routine et vérifier le code sous-jacent dans VSS.

Ce n'est probablement pas aussi élégant que la méthode Visual SourceSafe décrite par Mitch Wheat, mais cela dépend de ce que vous voulez faire avec le code source. J'ai tendance à accrocher sur plusieurs versions de MDB, et utiliser cette méthode pour comparer le code source entre eux en utilisant des outils de diff tels que WinMerge. C'est bon pour la fonctionnalité de portage entre les branches du développement.

Il est également utile pour localiser toutes les références aux champs ou contrôles, où qu'ils se trouvent. Visualiser les objets Access en tant que définitions textuelles rend la recherche de ces références simple.