2009-09-16 25 views
3

我想獲得從Access數據庫(表單模塊)所有的源代碼,而不使用Office互操作性展示。獲取使用C#中的mdb文件的所有源代碼(MSACCESS)/ VBScript中

我喜歡AllCodeToDesktop()功能found here。但是,它從mdb文件中運行。

將VBScript文件是什麼加載的mdb文件,並運行在它上面的功能?

+2

我只是沒有得到這個'沒有使用Office'的限制。我從你的問題中瞭解到,你希望有人爲你寫代碼,因爲你不想使用辦公室互聯網?我想這不是一個問題,但你必須付出代價! – 2009-09-16 09:45:59

回答

3

爲了節省很多時間,是否有任何理由不使用內置的記錄儀?

工具 - > 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代碼不是那麼簡單,但是你得到了表單定義等等,而這可能不是你想要的。

+0

感謝Albert,這很酷。我想通過外部進行,直接轉到文本文件 – Fidel 2009-09-17 00:42:26

+1

我在上面添加了一些代碼+註釋。您可以導出文本,但如果外部執行此操作,您仍然必須將訪問權限用作com對象。 – 2009-09-18 05:46:40

4

我想獲得從訪問數據庫中的所有源代碼 (形式, 模塊) - 不使用的辦公 互操作性展示

的Microsoft Office是必需的。你也可以將你的函數粘貼到MDB中並從那裏運行它。

+0

安裝interop的問題是,您必須爲具有office 2003和interop 2007 for office 2007的用戶安裝interops 2003.這就是爲什麼我仍然更傾向於使用COM方法,因爲它無關緊要已安裝。 我也不想將函數粘貼到mdb中,因爲我正在編寫的程序僅用於連接並提取它所需的內容(無需任何用戶交互) – Fidel 2009-09-17 00:51:01

+0

Access 2007與2003 MDB兼容。 – 2009-09-17 02:03:16

+0

A2007還兼容A2002和A2000 MDB - 它們都是A2007的原生文件格式。 – 2009-09-17 04:16:24

4

如果它是一個倉庫,你可能想看看在Visual SourceSafe和獲得訪問VSS插件(鏈接指向Access 2003中,還沒有嘗試過其他版本)http://www.microsoft.com/downloads/details.aspx?familyid=2ea45ff4-a916-48c5-8f84-44b91fa774bc&displaylang=en

我猜測,訪問插件將公開一個COM接口,如果你想要走這條路線,你可以合理地將源代碼合理地抽取到你的C#應用​​程序中。無論如何,正如羅伯特所說,辦公室仍然是必需的。

+4

我會提醒你的是,VSS是一個非常吸引人的控制系統,但是Subversion更好。如果你能夠使用這個插件直接提取源代碼,我會非常感興趣,但是讓我知道,這將會很酷。 – 2009-09-16 04:24:17

+0

謝謝戴爾,是的,我們使用svn,但它不是那樣的。是否有任何插件被用來轉儲代碼的例子? – Fidel 2009-09-17 00:47:58

2

我是一個低級的程序員,不能說我明白你的問題。

到目前爲止,我所知道的,得到你想要的東西,你將不得不通過自動化COM接口 - 有沒有其他辦法。執行此操作的例程是版本無關的,並且只要您自動執行的Access版本與您正在檢查的文件(例如,正在運行的文件)向前兼容,就可以在至少97版本的所有Access版本中運行。,A2000將無法檢查ACCDB,並可能(或可能不會)給出A2002,A2003和A2007 MDB的不可靠結果)。

關鍵是使用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 

的顯式的選項可能或不可能存在,而選項比較數據庫在技術上不是必需的,但在Access中創建模塊的99%,將有一個或兩者(只有在Access 2000中使用默認設置創建的數據庫將缺少Option Explicit)。代碼將在4個屬性之後開始。如果它只是兩個OPTION語句,那麼表單背後就沒有真正的代碼。

您應該可以在任何安裝了Access版本的PC上,通過vbScript進行COM自動化訪問,該版本與您要檢查的所有MDB/ACCDB正向兼容。

相關問題