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

現象

コンピュータを 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 - 最終更新日: 2008/11/11 - リビジョン: 1

フィードバック