現在オフラインです。再接続するためにインターネットの接続を待っています

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

Office 2003 のサポートは終了しました

マイクロソフトでは、2014 年 4 月 8 日に Office 2003 のサポートを終了しました。この変更は、ソフトウェアの更新プログラムおよびセキュリティ オプションに影響しています。 この変更の意味および保護された状態を維持する方法について説明します。

現象
コンピュータを 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 LongFunction 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 IfExitHandler:     Exit FunctionErrorHandler:    MsgBox Err.Description & " " & Err.Number    Resume ExitHandler    End FunctionFunction 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 FunctionFunction 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 IfDoesfileExist_End:    Exit FunctionDoesfileExist_Err:    DoesFileExist = False    Resume DoesfileExist_EndEnd 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] 長い名前から短い名前を取得する方法
ACC2007 Acc2002 Acc2003 Microsoft Access XP Jet NT4 NT4.0 Win2000 WinXP
プロパティ

文書番号:891176 - 最終更新日: 12/01/2007 02:10:18 - リビジョン: 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

  • kbfilesystems kbenv kbtshoot kbhowto kbinfo KB891176
フィードバック