- 題名: CSVファイルを相対パスでOLEDB接続し、DataTableに格納する際のエラー
- 日時: 2007/06/16 0:56:57
- ID: 19853
- この記事の返信元:
- (なし)
- この記事への返信:
- [19855] Re[1]: CSVファイルを相対パスでOLEDB接続し、DataTableに格納する際のエラー2007/06/16 11:08:47
- ツリーを表示
■No19855に返信(すももさんの記事) ちゃんとデバッグしてることが分かるし、好感が持てるんだけど、 説明されている内容が良く分かりませんでした。 [相対パスとは] http://e-words.jp/w/E79BB8E5AFBEE38391E382B9.html どこにも出てきてない気がします。。。 提示されたコードは全て絶対パスで指定してますよね? エラーが起こるとされているサンプルコードのパスですが。。。 DOBONさんのTipsと同じパスが代入されているだけですし。。。 どこに対象のファイルが存在しているのかが、ちょっと。。。 結論としては実行ファイル(EXE)の起動場所にファイルがないと 読み込めないと?。。。そんなことないと思いますが。。。うーん。
■No19902に返信(すももさんの記事)
> Dim csvAllFileName As String = Me.lblImpName.Text を
> Dim csvAllFileName As String = "C:\test.csv"
> にしてみたところ、正常に実行されました。
不思議な現象ですね。Me.lblImpName.Text に問題があるとしか思えない。
ラベルってことは手入力では無いんですか?どこからどのようにして
取得していますか?末尾に NullChar とかゴミが付いてる可能性は?
あと、エラーメッセージは何が?
ちなみに、他のPCにインストールする状況になった場合、
> 任意に取得したファイルを Application.StartupPathフォルダへコピーし
では問題になることがあります。一般的にアプリケーションのインストール先
は、C:\Program Files の下になりますが、ここは管理者権限がないと書込み
できません。
一時ファイルが必要な場合は、ユーザごとの ApplicationData フォルダを使う
場合が多いかな?
[特殊ディレクトリのパスを取得する]
http://dobon.net/vb/dotnet/file/getfolderpath.html
…だから StartupPath でないと実行できないのは一般的にはマズいです。
> 変数には "C:\" "test.csv" とそれぞれ固定値と同じものが
> 代入されていました。
ほんとにぃ〜?ww
とりあえず、単純に比較してみてください。
[VB.NET2003]
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim csvDir_Default As String = "C:\"
Dim csvFileName_Default As String = "test.csv"
Dim csvAllFileName As String = Me.lblImpName.Text
Dim csvDir As String = System.IO.Path.GetDirectoryName(csvAllFileName)
Dim csvFileName As String = System.IO.Path.GetFileName(csvAllFileName)
csvDir = "c:\ " 'test コメントアウトしてね。
csvFileName = "test.csv" 'test コメントアウトしてね。
Call StringCheck(csvDir, csvDir_Default)
Call StringCheck(csvFileName, csvFileName_Default)
End Sub
Private Sub StringCheck(ByVal StrA As String, ByVal StrB As String)
If StrA.CompareTo(StrB) <> 0 Then
Debug.WriteLine("違うよ?")
With StrA
For i As Integer = 0 To .Length - 1
If StrB.Length - 1 < i Then
Debug.WriteLine("余った。[" & .Substring(i) & "]")
Exit Sub
End If
If .Substring(i, 1).CompareTo(StrB.Substring(i, 1)) <> 0 Then
Debug.WriteLine("--- [" & .Substring(i, 1) & "]≠[" & StrB.Substring(i, 1) & "]")
End If
Next
End With
Else
Debug.WriteLine("同じです。[" & StrA & "]")
End If
End Sub
分類:[.NET]
【解決したい問題】
はじめまして。
CSVファイル(ヘッダーなし)をDataGridのデータソースに設定したいと思い、
GooGleで検索した所、こちらのサイトを拝見しました。
http://dobon.net/vb/dotnet/file/readcsvfile.html
ご提示いただいているコードをそのまま使用させて頂いた時には
思い通りにDataGirdへ表示することができたのですが、
フォルダとファイルの名前をダイアログで取得したもの(相対パス)
を変数に代入し、実行したところ、da.Fill(dt) でエラーになって
しまいました。
---「エラー内容」---------------------------------
'System.Data.OleDb.OleDbException' のハンドルされて
いない例外が system.data.dll で発生しました。
--------------------------------------------------
---「参考サイトを※印のように修正しました」-------
'[VB.NET]
Dim csvAllFileName As String = Me.lblImpName.Text '※
'↑"C:\test.csv" が入っています
'CSVファイルのあるフォルダ
'Dim csvDir As String = "C:\"
Dim csvDir = System.IO.Path.GetDirectoryName(csvAllFileName) '※
'↑"C:\"が入っていました
'CSVファイルの名前
'Dim csvFileName As String = "test.csv"
Dim csvFileName As String = System.IO.Path.GetFileName(csvAllFileName) '※
'↑"test.csv"が入っていました
'接続文字列
Dim conString As String = _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
+ csvDir + ";Extended Properties=""text;HDR=No;FMT=Delimited"""
Dim con As New System.Data.OleDb.OleDbConnection(conString)
Dim commText As String = "SELECT * FROM [" + csvFileName + "]"
Dim da As New System.Data.OleDb.OleDbDataAdapter(commText, con)
'DataTableに格納する
Dim dt As New DataTable
da.Fill(dt) '←ここでエラーになります
Me.dgrTest.DataSource = dt '※
--------------------------------------------------------
---「エラーを中断させた時の変数の中身」-----------------
csvAllFileName → "C:\test.csv"
csvDir → "C:\"
csvFileName → "test.csv"
conString → "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=
C:\;Extended Properties="text;HDR=No;FMT=Delimited"
commText → "SELECT * FROM [test.csv]"
--------------------------------------------------------
以上です。
ご提示頂いているものをそのまま使用させて頂くと正しく表示できるのに、
相対パスにするとエラーになってしまい、原因がわからず困っています。
どうぞ、よろしくお願いします。