Windows NT 4.0 から Windows 2000 または Windows XP にアップグレードすると、Access ベースまたは Jet データベース ベースのプログラムのパフォーマンスが低下する

文書翻訳 文書翻訳
文書番号: 891176 - 対象製品
すべて展開する | すべて折りたたむ

現象

コンピュータを Microsoft Windows NT 4.0 から Microsoft Windows 2000 または Microsoft Windows XP Professional にアップグレードすると、Microsoft Access ベースまたは Jet データベース ベースのプログラムでパフォーマンスが低下することがあります。

原因

この問題は、以下のいずれかまたは複数の状況に該当する場合に発生することがあります。
  • 分割されたデータベースで作業していて、8 文字を超える名前が付けられたフォルダにバックエンド データベース ファイルが格納されています。たとえば、バックエンド データベース ファイルが、次のような名前のフォルダに格納されています。
    BigFolderName
  • 分割されたデータベースで作業していて、バックエンド データベース ファイルの名前が、3 文字のファイル名拡張子 .mdb を除いても 8 文字を超えています。たとえば、バックエンド データベース ファイルに次のような名前が付けられています。
    BigDatabaseFileName.mdb
  • 分割されていないデータベースで作業していて、データベース ファイルの名前が 8.3 名前付け規則に準拠していません。または、長い名前が付けられたフォルダにデータベースが格納されています。
Windows 2000 およびそれ以降のバージョンの Windows のワークステーション サービスのキャッシュ設計は、それ以前のバージョンの Windows のワークステーション サービスのキャッシュ設計と異なっています。

Windows 2000 およびそれ以降のバージョンの Windows では、マルチユーザー環境におけるデータベースの整合性を優先するようにワークステーション サービスのキャッシュ設計が変更されています。この設計変更により、長いフォルダ名または長いファイル名の情報を取得するために Jet が実行する API 呼び出しで遅延が発生します。 関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
889588 [HOWTO] Windows 2000 ベースまたは Windows XP ベースのクライアントで Office Access および Jet データベース エンジンのネットワーク パフォーマンスを最適化する方法

解決方法

マイクロソフトは、この情報をプログラミング言語の使用方法の一例として提供するだけであり、市場性および特定目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。この資料は、例示されているプログラミング言語やプロシージャの作成およびデバッグに使用するツールについて理解されているユーザーを対象としています。Microsoft Support 担当者は、特定のプロシージャの機能についての問い合わせにはお答えできますが、ユーザー固有の目的に合わせた機能の追加、プロシージャの作成などの内容変更は行っておりません。

分割されたデータベースで作業している場合は、既存の Jet テーブルのリンクを設定し直すことにより、この問題を解決できます。これを行うには、長いフォルダ名の代わりに短い名前を Windows API に送信するコードを作成します。この解決方法では、バックエンド データベースの名前が 8.3 名前付け規則に準拠している必要があります。このコードを作成するには、フロントエンド データベースで次の手順を実行します。
  1. 参照設定を Microsoft ADO Ext 2.5 (または、それ以降のバージョンの ADO) に設定します。
  2. 新しい標準モジュールを挿入して、次のコードを追加します。
    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. RefreshLinks 関数を実行します。これを行うには、次の手順を実行します。
    1. Visual Basic Editor で、[表示] メニューの [イミディエイト ウィンドウ] をクリックします。
    2. イミディエイト ウィンドウで、RefreshLinks と入力し、Enter キーを押します。
RefreshLinks 関数では、データベース内にあるリンクされている Jet テーブルすべてについて、リンクが有効かどうかを検査します。リンクが有効な場合、このコードでは Windows API 関数 GetShortPathName を使用して、8.3 名前付け規則に準拠する短い名前を作成します。 関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
142982 Windows で長いファイル名から 8.3 ファイル名が生成される方法
このコードでは次に、新しい短い名前を含むパスを使用してリンクを更新します。リンク先が 8.3 名前付け規則に準拠していないバックエンド データベース ファイルである場合、このコードでは、バックエンド データベース ファイルの名前を変更するように提案するメッセージを生成します。

状況

マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。

: Windows XP を使用している場合は、Microsoft Windows XP Service Pack 2 (SP2) を適用することにより、パフォーマンスが向上することがあります。

詳細

関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
209862 [HOWTO] Access 2000 で共通ダイアログ コントロールを使用してバックエンド テーブルのリンクを設定し直す方法
175512 [HOWTO] 長い名前から短い名前を取得する方法

プロパティ

文書番号: 891176 - 最終更新日: 2007年12月1日 - リビジョン: 4.2
この資料は以下の製品について記述したものです。
  • Microsoft Office Access 2007
  • Microsoft Office Access 2003
  • Microsoft Access 2002 Standard Edition
  • Microsoft Access 2000 Standard Edition
  • Microsoft Access 97 Standard Edition?を以下の環境でお使いの場合
    • Microsoft Windows 2000 Professional
    • Microsoft Windows XP Professional x64 Edition
    • Microsoft Windows XP Professional
    • Microsoft Windows XP Tablet PC Edition
キーワード:?
kbfilesystems kbenv kbtshoot kbhowto kbinfo KB891176
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com