所以,这就是我想做的:
我想将文件夹中的所有 xml 文件(比如说
C:\Bla\AllMyLittleXmlFiles
)导入到 DataSet 中,对其进行处理,然后从那里将其导出到 SQL Server。那可能吗?似乎数据集在每次成功读取文件后都会自行清理,只留下第一个文件的数据。
这是我的代码,包括一些不必要的东西:
StringBuilder fileNames = new StringBuilder();
ArrayList filePaths = new ArrayList();
FolderBrowserDialog folder = new FolderBrowserDialog();
folder.ShowDialog();
int pathLength = folder.SelectedPath.Length;
foreach (string file in Directory.EnumerateFiles(folder.SelectedPath))
{
string fielname = file.ToString().Substring(pathLength + 1);
string filepath = file.ToString();
fileNames.AppendLine(fielname);
filePaths.Add(filepath);
}
// textBox1.Text = filePaths[0].ToString();
DataSet aDS = new DataSet();
StringBuilder uh = new StringBuilder();
int filesImported = 0;
foreach (object ob in filePaths)
{
string test = ob.ToString();
uh.Append(test);
aDS.ReadXml(ob.ToString());
filesImported++;
}
int tablesimported = 0;
foreach (DataTable table in aDS.Tables)
{
dataGridView1.DataSource = table.DefaultView;
tablesimported++;
}
MessageBox.Show("Files Imported:" + filesImported.ToString() + " Tables Imported : " + tablesimported.ToString());
textBox1.Text = uh.ToString();
编辑 在尝试了一些答案后,我留下了这个:
int filesImported = 0;
foreach (object ob in filePaths)
{
dsCollection[filesImported].ReadXml(ob.ToString());
filesImported++;
}
int tablesImported = 0;
foreach (DataSet ds in dsCollection)
{
foreach (DataTable table in ds.Tables)
{
mainDS.Merge(table);
tablesImported++;
}
}
然后我调用 dsCollection 上的
Merge
方法。唯一的问题是 dscollection 中的数据集从未被实例化,所以......回到方块 2。
也许您可以创建主数据集,并在将 xml 读取到临时数据集后尝试合并这些数据集,如下所示:
mainDataSet.Merge(tempDataSet);
这将解决你的问题,尽管不确定它是否有效......
DataSet[] aDS = new DataSet[filePaths.Count];
StringBuilder uh = new StringBuilder();
int filesImported = 0;
foreach (object ob in filePaths)
{
string test = ob.ToString();
uh.Append(test);
//every xml file gets its own dataset
//so that new read operation will not clear data
aDS[filesImported].ReadXml(ob.ToString());
filesImported++;
}
int tablesimported = 0;
foreach (DataSet ds in aDS)
{
foreach (DataTable table in ds.Tables)
{
dataGridView1.DataSource = table.DefaultView;
tablesimported++;
}
}
试试这个:
foreach (object ob in filePaths)
{
string test = ob.ToString();
uh.Append(test);
DataSet tmpDS = new DataSet();
tmpDS.ReadXml(ob.ToString());
aDS.Merge(tmpDS);
filesImported++;
}
这将为每个文件留下一个数据集表,这似乎就是您正在寻找的内容。
编辑:[向 @Reniuz 表示歉意,他给你指出了完全相同的方向,但提前了 20 分钟!]
我的臃肿且低效的解决方案......我很失望。
感谢 Niko 和 Reniuz 为我指明了正确的方向。
private ArrayList GetFilePaths()
{
ArrayList filePaths = new ArrayList();
FolderBrowserDialog folder = new FolderBrowserDialog();
folder.ShowDialog();
foreach (string filePath in Directory.EnumerateFiles(folder.SelectedPath))
{
filePaths.Add(filePath.ToString());
}
return filePaths;
}
private void ImportXmls(ArrayList filePaths)
{
DataSet[] tempDSCollection = new DataSet[filePaths.Count];
int impFiles = 0;
foreach (object ob in filePaths)
{
DataSet impDS = new DataSet();
impDS.ReadXml(ob.ToString());
tempDSCollection[impFiles] = impDS;
impFiles++;
}
foreach (DataSet aDS in tempDSCollection)
{
foreach (DataTable table in aDS.Tables)
{
mainDS.Merge(table);
}
}
}
我会继续努力并更新,但现在必须这样做
将每个文件读入一个单独的数据集中,然后将它们全部添加到一个数据集中。
DataSet dsAll = new DataSet();
DataSet ds1 = new DataSet();
ds1.ReadXml("1.xml");
ds1.Tables[0].TableName = "1";
DataSet ds2 = new DataSet();
ds2.ReadXml("2.xml");
ds2.Tables[0].TableName = "2";
DataSet ds3 = new DataSet();
ds3.ReadXml("3.xml");
ds3.Tables[0].TableName = "3";
dsAll.Tables.Add(ds1.Tables[0].Copy());
dsAll.Tables.Add(ds2.Tables[0].Copy());
dsAll.Tables.Add(ds3.Tables[0].Copy());
试试这个:
DataSet ds = new Dataset();
for(int x=0;x<Filepath.Count;x++)
{
ds.ReadXml(Filepath[x].ToString());
}