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