[VB.Net] OleDBでdbfファイルを開くときの注意事項

VB.Netにて、dbfファイルを開くのにちょっと嵌ったので覚え書きを残しておく。

接続文字列は、データベース名のところにDBFファイルの入っているパス(ディレクトリ名)を入れて、最後に「Extended Properties=dBase IV;」をつければOKです。また、テーブル名はDBFファイル名(拡張子抜き)を指定してあげればOKというのが一般的な解説です。

 Dim sDB = "DBFファイルの入っているディレクトリ"
 Dim sTable = "DBFファイル名(拡張子抜き)"
 sCon = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
   "Data Source=" & sDB & ";" & _
    "Extended Properties=dBase IV;"
 Dim sSQL As String = "select * from [" & sTable & "];"

ところが、ファイル名が8.3形式でない場合だとエラーが出てしまいます。パスを8.3形式(ショートファイル名)にしてあげる必要があるようです。
私はこんな感じでこの問題をクリアしました。

    <System.Runtime.InteropServices.DllImport("kernel32.dll", _
        CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
    Private Shared Function GetShortPathName( _
        <System.Runtime.InteropServices.MarshalAs( _
            System.Runtime.InteropServices.UnmanagedType.LPTStr)> _
            ByVal lpszLongPath As String, _
        <System.Runtime.InteropServices.MarshalAs( _
            System.Runtime.InteropServices.UnmanagedType.LPTStr)> _
            ByVal lpszShortPath As System.Text.StringBuilder, _
        ByVal cchBuffer As Integer) As Integer
    End Function
    Public Shared Function GetShortPath(ByVal path As String) As String
        Dim sb As New System.Text.StringBuilder(1023)
        Dim ret As Integer = GetShortPathName(path, sb, sb.Capacity)
        If ret = 0 Then
            Return ""
            'Throw New Exception("短いファイル名の取得に失敗しました。")
        End If
        Return sb.ToString()
    End Function

    Private Function openDBF(ByVal sFile As String) As Integer
        If File.Exists(sFile) = False Then Return -1
        Dim sCon As String
        Dim sDB As String = GetShortPath(Path.GetDirectoryName(sFile))
        Dim sTable As String = GetShortPath(sFile)
        Dim s() As String
        Dim con As OleDbConnection
        Dim ad As OleDbDataAdapter
        Dim ds As DataSet

        'ショートファイルネーム取得
        s = Split(sTable, "\")
        sTable = s(s.Length - 1)


        Dim sSQL As String = "select * from [" & sTable & "];"

        Try
            sCon = _ 
            "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
            "Data Source=" & sDB & ";Extended Properties=dBase IV;"
            con = New OleDbConnection(sCon)
            con.Open()
            ad = New OleDbDataAdapter(sSQL, con)
            ds = New DataSet
            ad.Fill(ds)
            dgv.DataSource = ds.Tables(0)
            Return (0)
        Catch ex As Exception
            MsgBox(ex.Message)
            Return (-1)
        End Try
    End Function

<参考>
【VBA】Jet OLE DB プロバイダでのdBase(*.dbf)ファイル接続時の注意
長いパス名から短いパス名を取得する