2009-02-27 20 views
7

Mi aplicación está construida para escanear la base de datos de MS Access en VB.NET.Cómo agregar/quitar la referencia mediante programación?

Cuando la aplicación de Access se distribuye a los usuarios finales, pueden tener diferentes versiones de componentes COM. ¿Es posible agregar/eliminar referencias mediante programación para resolver referencias rotas debido a las diferentes versiones?

Por favor, compártelo código o enlace de referencia.

Respuesta

9

Aquí hay un código de ejemplo:

Crear desde archivo de referencia

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 

eliminar la referencia

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. 

Referencia existe

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 

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

También es posible que desee leerhttp://www.mvps.org/access/modules/mdl0022.htm

+1

Recibo un error al implementar esta lógica. como follwos: "Referencia de objeto no establecida en una instancia de un objeto" Por favor sugiera cómo hacerlo ..... Gracias ... – Suman

+0

¿Qué línea está dando este error? – Fionnuala

+0

En "Dim ref As References" obteniendo el error anterior y en el segundo tipo de declaración, es decir, Dim ref como nuevo Error de referencias "Recuperando la fábrica de la clase COM para el componente con CLSID {EB106214-9C89-11CF-A2B3-00A0C90542FF } Falló debido al siguiente error: 80040154." – Suman

3

La mejor solución es limitar las referencias en su MDB acceso a los componentes internos de acceso. Esta sería la referencia de acceso, la referencia VBA y la referencia DAO. Todas las demás bibliotecas externas deben usarse a través del enlace tardío. Si está utilizando el objeto de sistema de archivos, por ejemplo, en lugar de esto (con una referencia al modelo de objetos de Windows Script Host):

Dim objFSO As New FileSystemObject 

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

que eliminaría la referencia y convertirlo a esto:

Dim objFSO As Object 

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

Si le preocupa el impacto en el rendimiento de inicializar el FSO cada vez que lo usa, puede guardar una referencia en caché. Yo suelo usar una variable estática dentro de una función para devolver un objeto como éste:

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 

Ahora, es posible que desee obtener de fantasía y también ser capaz de derribar la instancia de objeto, en cuyo caso se haría algo de esta manera:

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 

En cualquier caso, el objetivo es que el enlace en tiempo resuelve la ubicación de las bibliotecas fuera en tiempo de ejecución y por lo tanto no se rompa, excepto si fuera la biblioteca no está instalado o no está correctamente registrado. Con la vinculación tardía, puede atrapar ambas condiciones, pero con la vinculación anticipada, toda la aplicación de Access simplemente se rompe.

Cuestiones relacionadas