循环遍历目录中的CSV文件并将其插入Access

时间:2016-08-10 17:09:10

标签: c# csv ms-access directory

我有一个包含大量CSV文件的目录。我想循环遍历目录,并根据文件名将每个文件插入到特定的表中。

我能够成功遍历文件,但是我在将数据插入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();
}

这是我收到的错误:

  

名称'System.String ['。

的包围无效

1 个答案:

答案 0 :(得分:1)

故障排除101:当"出现问题"时,请解决问题以找出原因。

在这种情况下,错误

  

无效的名称包围' 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

因此我们可以看到字符串连接对ToString方法调用的结果执行隐式GetFiles,返回"System.String[]"。也就是说,GetFiles返回字符串数组,隐式ToString向我们显示 的结果,而不是包含< / em>的

这样就解释了错误:额外的方括号让OleDb提供商感到不安。

然而,解决方案是仅使用Name循环为我们提供的FileInfo对象的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

更像是我们想要的东西。