我有一个包含大量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 ['。
的包围无效
答案 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
更像是我们想要的东西。