2009-02-27 10 views
7

私のアプリケーションは、VB.NETのスキャンMS Accessデータベースに組み込まれています。参照をプログラムによって追加/削除する方法は?

アクセスアプリケーションがエンドユーザーに配布されると、異なるバージョンのCOMコンポーネントが存在することがあります。異なるバージョンのために壊れた参照を解決するために参照をプログラムで追加/削除することは可能ですか?

私はコードまたはリンクを参考にしてください。ここで

答えて

9

は、いくつかのサンプルコードです:

リファレンス

Sub DeleteRef(RefName) 
    Dim ref As Reference 

     'You need a reference to remove ' 
     Set ref = References(RefName) 
     References.Remove ref 

    End Sub 


You can use the references collection to find if a reference exists. 

リファレンス

が存在するファイル削除

から
Sub AddWS() 
    'Create a reference to Windows Script Host, ' 
    'where you will find FileSystemObject ' 
    'Reference name: "IWshRuntimeLibrary" ' 
    'Reference Name in references list: "Windows Script Host Object Model" ' 
    ReferenceFromFile "C:\WINDOWS\System32\wshom.ocx" 
    End Sub 

    Function ReferenceFromFile(strFileName As String) As Boolean 
    Dim ref As Reference 

     On Error GoTo Error_ReferenceFromFile 
     References.AddFromFile (strFileName) 
     ReferenceFromFile = True 

    Exit_ReferenceFromFile: 
     Exit Function 

    Error_ReferenceFromFile: 
     ReferenceFromFile = False 
     Resume Exit_ReferenceFromFile 
    End Function 

を参照を作成します

Function RefExists(RefName) Dim ref As Object RefExists = False For Each ref In References If ref.Name = RefName Then RefExists = True End If Next End Function 

http://wiki.lessthandot.com/index.php/Add,_Remove,_Check_References

あなたはまた、http://www.mvps.org/access/modules/mdl0022.htm

+1

このロジックを実装する際にエラーが発生します。次のようにしてください: "オブジェクトリファレンスがオブジェクトのインスタンスに設定されていません" ありがとうございました... – Suman

+0

このエラーはどのラインで発生していますか? – Fionnuala

+0

"Dim ref As References"で上記のエラーが発生し、次のようなエラーが発生しました。 Dim ref as new参照エラーが "CLSIDのコンポーネントのCOMクラスファクトリを取得しています{EB106214-9C89-11CF-A2B3-00A0C90542FF }次のエラーのため失敗しました:80040154" – Suman

3

を読むために望むことができる最善の解決策は、内部アクセスコンポーネントへのアクセスMDB内の参照を制限することです。これは、Accessリファレンス、VBAリファレンス、およびDAOリファレンスになります。他の外部の図書館はすべて、レイトバインディングで使用する必要があります。あなたは、これに代えて、例えば、ファイルシステムオブジェクトを使用している場合(Windowsスクリプトホストオブジェクトモデルを参照して):

Dim objFSO As New FileSystemObject 

    If objFSO.FolderExists("\\d9m09521\WB\") Then 
    ... 
    End If 

あなたは、参照を削除しますし、これに変換します

Dim objFSO As Object 

    Set objFSO = CreateObject("Scripting.FileSystemObject") 
    If objFSO.FolderExists("\\d9m09521\WB\") Then 
    ... 
    End If 

FSOを使用するたびにFSOを初期化する際のパフォーマンスが懸念される場合は、FSOへの参照をキャッシュすることができます。私は通常、このようなオブジェクトを返すために、関数内静的変数を使用します。

Public Function FSO() As Object 
    Static objFSO As Object 

    If objFSO Is Nothing Then 
    Set objFSO = CreateObject("Scripting.FileSystemObject") 
    End If 
    FSO = objFSO 
End Function 

さて、あなたはあなたが何かをしたい、その場合には、ファンシー取得し、また、オブジェクトのインスタンスを取り壊すことができるようにしたいかもしれませんこのように:いずれにしても

Public Function FSO(Optional bolCloseObject As Boolean = False) As Object 
    Static objFSO As Object 

    If bolCloseObject Then 
    Set objFSO = Nothing 
    Exit Function 
    End If 
    If objFSO Is Nothing Then 
    Set objFSO = CreateObject("Scripting.FileSystemObject") 
    End If 
    FSO = objFSO 
End Function 

、全体のポイントは、遅延バインディングが実行時に外部のライブラリの場所を解決することであり、従って、外部のライブラリがインストールされていないか、正しく登録されていない場合を除いて、中断されません。レイトバインディングでは、これらの条件の両方をトラップできますが、初期のバインディングでは、Accessアプリケーション全体が壊れます。

関連する問題