Pregunta

Tengo una aplicación de escritorio Windows que está instalada en entornos de oficina pequeños.

La aplicación usa un .MDB archivo de base de datos como su base de datos que se almacena en una unidad de red.

Archivos de configuración especifican la ruta del .MDB Archivo en el servidor usando una unidad de letra: por ejemplo. f:\data\db.mdb

La aplicación debe acceder a este archivo de base de datos cuando se inicia. ¿Cómo puedo asegurar que la unidad de red esté conectada y accesible cuando se inicia la aplicación?

A veces, Windows no vuelve a conectar las unidades de red y la única forma de conectarlas es hacer doble clic en ellos en mi computadora, incluso cuando "reconectarse en el inicio de sesión" se marca al asignar la unidad.

¿Sería una solución usar \\machine_name\share en lugar de conducir letras?

¿Fue útil?

Solución

Usted preguntó: "¿Sería una solución usar Machine_Name Share en lugar de letras de unidad?"

Creo que sí, podría ser. Una ruta UNC evita 2 problemas:

  1. Compartir no conectado a una carta de unidad
  2. Share está conectado, pero se asigna a una carta de unidad diferente de lo que espera

Lo desconocido es si algo en su aplicación hace una ruta UNC para el MDB, ya sea una complicación o un factor decisivo.

Otros consejos

Debe usar rutas UNC, porque no todos tendrán su transmisión mapeado a la misma carta.

Determinar la ruta UNC

Primero, determinaría la ruta UNC de su archivo tal como existe en su computadora local en F:\data\db.mdb Uso de una de las técnicas que se encuentran aquí:

Básicamente, observa la forma en que Windows Explorer enumera la unidad mapeada de red, luego usa esto para deducir la ruta UNC.

Verifique la disponibilidad con WMI

Suponiendo que la unidad se asigne realmente en cada computadora local que planea usar la aplicación, use el Win32_MappedLogicalDisk Clase Para determinar la disponibilidad de la unidad de red asignada.

Tengo algún código de muestra aquí que se puede adaptar para determinar si hay una unidad de red determinada disponible (desplácese hacia abajo hasta el Información de conducción mapeada sección). Compruebas .ProviderName Para que coincida con la ruta UNC, para que sepa cuál es la unidad correcta, luego verifique el valor de .Availability Para determinar si se puede acceder a la unidad de red asignada.

Definitivamente debe abandonar las posibilidades de mapeo de la unidad de red:

  • El uso de esta técnica lo obliga a manipular 'físicamente' cada computadora usando su DB, donde debe asignar una letra a la unidad de red.
  • Cada usuario de la computadora puede cambiarlo fácilmente
  • Cualquier desconexión de la red podría obligar al usuario a volver a conectarse "manualmente" a la unidad de disco

Aunque está en un dominio, no le aconsejaría que use un nombre, ya que las computadoras, por múltiples razones, no siempre lo encuentran 'fácilmente' en la red, especialmente cuando su IP se cambia regularmente.

Definitivamente debe encontrar una manera de asignar una IP fija a su disco: es la solución más estable y permanente en la que se le puede pensar. Pídale a su administrador de dominio que lo organice.

Probar la presencia de su disco de red se puede hacer muy fácilmente. Hay múltiples soluciones, que incluyen intentar abrir directamente el archivo MDB. También puede probar la existencia del archivo (a través del objeto del archivo, creo) o incluso usar cualquier programa externo o API de Windows que pueda iniciar desde su código. Por favor, Google 'VB Test IP' o algo similar para encontrar una solución a su conveniencia.

Editar: Windows tiene incluso una propuesta para simular un ping con algún código VB. Revisalo aquí

Edit2: Encontré en una de mis aplicaciones este código VBA, que permite verificar rápido si existe un archivo (y puede acceder) en algún lugar de su red. Básicamente estaba configurado para probar si hay una nueva versión de la interfaz de usuario disponible.

Function fileIsAvailable(x_nom As Variant) As Boolean

On Error GoTo ERREUR
Application.Screen.MousePointer = 11

Dim fso as object
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FileExists(x_nom) Then
    fileIsAvailable = False
Else
    fileIsAvailable = True
End If
Set fso = Nothing

Application.Screen.MousePointer = 0
On Error GoTo 0
Exit Function

ERREUR:
Application.Screen.MousePointer = 0
debug.print Err.Number, Err.description
End Function 

Puede llamar fácilmente a esta función suministrando el nombre de red de su archivo, como:

if fileIsAvailable("\\192.168.1.110\myFileName.mdb") then ...

No dejó en claro en qué se escribió su aplicación, sin embargo, antes de intentar conectarse a la base de datos por primera vez, presumiblemente en una pantalla de salpicaduras o algo de esa naturaleza, verifique que ex: data db.mdb existe.

Asegúrese de que este script se ejecute justo antes de que se inicie la aplicación:

net use f: \\machine_name\share /user:[username] [password] /persistent:yes

¡Esto asignará la unidad de compartir en la carta que especificó!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top