2016-08-10 58 views
1

我有一個包含大量CSV文件的目錄。我想遍歷目錄並根據文件名將每個文件插入到特定的表中。循環訪問目錄中的CSV文件並將它們插入到Access中

我能夠成功地遍歷文件,但我在將數據插入Access數據庫時遇到了一些問題。我相信我非常接近。對於任何反饋,我們都表示感謝。

這是我的代碼:

string folderPath = Path.Combine(Path.GetTempPath(), "Reports"); 
string folderPath2 = Path.GetTempPath() + @"\Reports\"; 
var dir = new DirectoryInfo(folderPath); 

foreach (var fileInfo in dir.EnumerateFiles("crashes_*.csv")) 
{ 
    OleDbCommand cmdBulk = new OleDbCommand(@"INSERT INTO tbl_crashes " + 
        @"SELECT * FROM [Text;FMT=Delimited;HDR=Yes;ACCDB=Yes;Database=" + folderPath2 + "].[" + Directory.GetFiles(folderPath2, "crash*.csv") + "]", MyConn); 

    MyConn.Open(); 
    cmdBulk.ExecuteNonQuery(); 
    MyConn.Close(); 
} 

這是我收到的錯誤:

Invalid bracketing of name 'System.String['.

+0

您的'foreach'循環看起來像迭代了EnumerateFiles'返回的一堆文件,但是在循環內部實際上並沒有使用'fileInfo'變量,而是調用'Directory.GetFiles',它看起來像它會返回另一個*列表*的文件(或者可能再次列出相同的列表)。 –

+0

@GordThompson如何使用fileInfo變量對每個文件執行操作? – YoungStamos

+1

這件作品看起來很奇怪... 您試圖將一個數組添加到字符串中......這看起來不正確... ']。[「+ Directory.GetFiles(folderPath2,」crash *。 csv「)+」]「' – pmeyer

回答

1

故障排除101:當「出了差錯」,打破了問題倒事業隔離。

在這種情況下,錯誤

Invalid bracketing of name 'System.String['.

是一個非常強大的暗示,有什麼不對的,我們一起粘在CommandText字符串,那麼讓我們來看看字符串本身的相關位。

string folderpath2 = @"C:\__tmp\"; 
string str = "stuff [" + folderpath2 + "].[" + Directory.GetFiles(folderpath2, "zzzTest*.csv") + "] more_stuff"; 
Console.WriteLine(str); 

產生

stuff [C:\__tmp\].[System.String[]] more_stuff 

,所以我們可以看到,字符串連接不上GetFiles方法調用的結果隱式ToString,返回"System.String[]"。也就是,GetFiles返回一串字符串和隱ToString告訴我們什麼結果,而不是它包含

所以這就解釋了錯誤:額外的方括號使OleDb提供商不滿。

的解決方案,但是,是隻使用FileInfo對象的Name的特性,即foreach迴路提供給我們

string folderpath2 = @"C:\__tmp\"; 
var di = new DirectoryInfo(folderpath2); 
foreach (FileInfo fi in di.EnumerateFiles("zzzTest*.csv")) 
{ 
    string str = "stuff [" + folderpath2 + "].[" + fi.Name + "] more_stuff"; 
    Console.WriteLine(str); 
} 

生產

stuff [C:\__tmp\].[zzzTest1.csv] more_stuff 
stuff [C:\__tmp\].[zzzTest2.csv] more_stuff 

這更像是我們所希望的。

相關問題