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)ファイル接続時の注意
・長いパス名から短いパス名を取得する