Ralentissement des performances dans basées sur Access / Jet basé sur une base de données de programmes après la mise à niveau de Windows NT 4.0 vers Windows 2000 ou Windows XP

Symptômes

Une fois que vous mettez à niveau votre ordinateur Microsoft Windows NT 4.0 vers Microsoft Windows 2000 ou Microsoft Windows XP Professionnel, vous pouvez rencontrer des performances plus lentes dans Microsoft basées sur Access / Jet basé sur une base de données de programmes.

Cause

Ce problème peut se produire si une ou plusieurs des conditions suivantes sont remplies :
  • Vous travaillez avec une base de données de division, et le fichier de base de données back-end réside dans un dossier ayant un nom de plus de 8 caractères. Par exemple, le fichier de base de données back-end réside dans un dossier portant un nom semblable au suivant :
    BigFolderName
  • Vous travaillez avec une base de données de division, et le nom du fichier de base de données back-end est supérieur à 8 caractères, à l’exclusion de l’extension de nom de fichier .mdb de trois caractères. Par exemple, le fichier de base de données back-end a un nom qui est semblable à la suivante :
    BigDatabaseFileName.mdb
  • Vous travaillez avec une base de données qui n’est pas fractionné et le nom du fichier de base de données ne suit pas la convention de noms 8.3. Ou la base de données est stocké dans un dossier portant un nom long.
La conception de la mise en cache du service station de travail dans Windows 2000 et les versions ultérieures de Windows est différente de la structure de mise en cache du service station de travail dans les versions antérieures de Windows.

Dans Windows 2000 et les versions ultérieures de Windows, la conception de la mise en cache du service station de travail a été modifiée en faveur de l’intégrité des base de données dans un environnement multi-utilisateur. Cette modification de conception provoque un retard lorsque Jet effectue des appels API pour récupérer des informations sur le nom de dossier long ou sur le nom de fichier long.
Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :

889588 comment optimiser Office Access et Jet de base de données engine performance du réseau avec des clients basés sur Windows XP et Windows 2000

Résolution

Microsoft fournit des exemples de programmation à titre d'illustration uniquement, sans garantie expresse ou implicite. Ceci inclut, mais n'est pas limité à, les garanties implicites de qualité marchande ou d'adéquation à un usage particulier. Cet article suppose que vous êtes familiarisé avec le langage de programmation présenté et les outils utilisés pour créer et déboguer des procédures. Les ingénieurs du support technique Microsoft peuvent vous expliquer les fonctionnalités d'une procédure particulière, mais ils ne modifieront pas ces exemples pour fournir des fonctionnalités supplémentaires ou créer des procédures répondant à vos besoins spécifiques.

Si vous travaillez avec une base de données séparée, vous pouvez résoudre ce problème par la réédition de liens les tables Jet existantes. Pour ce faire, créez le code pour envoyer une représentation sous forme courte du nom de dossier long à l’API Windows. Cette résolution requiert votre base de données back-end d’avoir un nom de fichier qui suit la convention de noms 8.3. Pour créer ce code, procédez comme suit dans la base de données frontale :
  1. Définissez une référence à Microsoft ADO Ext 2.5 (ou une version ultérieure de ADO).
  2. Ajoutez le code suivant à un module.
    Declare Function GetShortPathName Lib "kernel32" _            Alias "GetShortPathNameA" (ByVal lpszLongPath As String, _
    ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long

    Function RefreshLinks()
    On Error GoTo ErrorHandler

    'Define the ADOX Catalog object.
    Dim objCat As New ADOX.Catalog
    'Define the ADOX Table object.
    Dim objTbl As ADOX.Table

    'Database name of the linked table.
    Dim strFilename As String
    'Path and database name of the linked table.
    Dim strFullName As String

    Dim blnIsMapi As Boolean
    Dim blnIsImex As Boolean
    Dim blnIsTemp As Boolean
    Dim blnLongFileName As Boolean
    Dim blnFailedLink As Boolean
    Const srtImex = "IMEX"
    Const strMapi = "MAPILEVEL="

    'Open the catalog.
    objCat.ActiveConnection = CurrentProject.Connection

    'Loop through the table collection and update the linked tables.
    For Each objTbl In objCat.Tables
    'Verify that the table is a linked table.
    If objTbl.Type = "LINK" = True Then
    blnIsTemp = objTbl.Properties("Temporary Table") Or Left(objTbl.Name, 1) = "~"
    blnIsImex = (InStr(1, objTbl.Properties("Jet OLEDB:Link Provider String"), srtImex, vbTextCompare) > 0)
    blnIsMapi = (InStr(1, objTbl.Properties("Jet OLEDB:Link Provider String"), strMapi, vbTextCompare) > 0)

    If Not blnIsTemp And Not blnIsImex And Not blnIsMapi Then
    'Verify that the table is a Jet table.
    strFullName = objTbl.Properties("Jet OLEDB:Link Datasource")
    strFilename = Mid(strFullName, InStrRev(strFullName, "\", _
    Len(strFullName)) + 1, Len(strFullName))
    'Determine whether the database exists.
    If DoesFileExist(strFullName) = True Then
    objTbl.Properties("Jet OLEDB:Link Datasource") = GetShortName(strFullName)
    'Update the link by using the short path name.
    Else
    MsgBox "Cannot update: '" & objTbl.Name & "'" & String(2, vbCrLf) & "File not found: " & vbCrLf & strFullName
    blnFailedLink = True
    End If
    If InStr(strFilename, ".") > 9 Then blnLongFileName = True
    End If
    End If
    Next

    If blnFailedLink = False Then
    If blnLongFileName = True Then
    MsgBox "The table links were successfully updated, but the name of the backend database file does not follow 8.3" & _
    vbCrLf & "Please rename the file, relink the tables, and then run the procedure again.", vbExclamation
    Else
    MsgBox "The links were successfully updated!!! ", vbInformation
    End If
    Else
    MsgBox "The links were not successfully updated." & vbCrLf & "Please verify you table links.", vbExclamation
    End If

    ExitHandler:
    Exit Function

    ErrorHandler:
    MsgBox Err.Description & " " & Err.Number
    Resume ExitHandler

    End Function
    Function GetShortName(ByVal sLongFileName As String) As String
    Dim lRetVal As Long, sShortPathName As String, iLen As Integer
    'Set up a buffer area for the API function call return.
    sShortPathName = Space(255)
    iLen = Len(sShortPathName)

    'Call the function.
    lRetVal = GetShortPathName(sLongFileName, sShortPathName, iLen)
    'Remove unwanted characters.
    GetShortName = Left(sShortPathName, lRetVal)
    End Function

    Function DoesFileExist(strFileSpec As String) As Boolean
    'Return True if the file that is specified in the
    'strFilespec argument exists.
    'Return False if strFileSpec is not a valid
    'file or if strFileSpec is a directory.
    Const INVALID_ARGUMENT As Long = 53
    On Error GoTo DoesfileExist_Err
    If (GetAttr(strFileSpec) And vbDirectory) <> vbDirectory Then
    DoesFileExist = CBool(Len(Dir(strFileSpec)) > 0)
    Else
    DoesFileExist = False
    End If
    DoesfileExist_End:
    Exit Function
    DoesfileExist_Err:
    DoesFileExist = False
    Resume DoesfileExist_End
    End Function

  3. Exécutez la fonction RefreshLinks . Pour ce faire, procédez comme suit :
    1. Dans Visual Basic Editor, cliquez sur Fenêtre exécution dans le menu affichage .
    2. Dans la fenêtre exécution, tapez RefreshLinks. Ensuite, appuyez sur ENTRÉE.
La fonction RefreshLinks une boucle via ces tables dans une base de données Jet et vérifie si le lien est valide. Si le lien est valide, ce code utilise la fonction API Windows GetShortPathName pour créer un nom court qui suit la convention de noms 8.3.
Pour plus d’informations, cliquez sur le numéro ci-dessous pour afficher l’article correspondant dans la Base de connaissances Microsoft :

142982 Windows génère des noms de fichiers 8.3 à partir des noms de fichiers longs

Ce code met ensuite à jour le lien à l’aide d’un chemin d’accès qui inclut le nom court de nouveau. Si le lien pointe vers un fichier de base de données back-end qui ne respecte pas la convention de noms 8.3, ce code génère un message pour suggérer que vous renommez le fichier de base de données back-end.

État

Microsoft a confirmé l'existence de ce problème dans les produits Microsoft répertoriés dans la section « S'applique à ».

Remarque Si vous utilisez Windows XP, vous pouvez améliorer les performances en appliquant le Service Pack 2 (SP2) Microsoft Windows XP.

Plus d'informations

Pour plus d’informations, cliquez sur les numéros ci-dessous pour afficher les articles correspondants dans la Base de connaissances Microsoft :

209862 comment relier les tables de back-end avec le contrôle de boîte de dialogue commune dans Access 2000

175512 comment obtenir un nom de fichier court à partir d’un nom de fichier long

Propriétés

ID d'article : 891176 - Dernière mise à jour : 27 janv. 2017 - Révision : 1

Commentaires