1

我将 VS 2010 与 C# 一起用于 Windows 窗体应用程序。

我需要将 Excel 工作表中的数据加载到 DataSet 上。我使用 DataSet 设计器创建了 DataSet,并手动添加了表和列(FirstTable, Column1, Column2)。由于我经常访问这些列,因此使用类型化数据集而不是使用非类型化数据集的代码会更简洁。

当我使用 OleDBDataAdapter 并使用 Fill on 填充 DataTable 时FirstTable,它​​是空的,Column1并且Column2有两个额外的列来自 Excel 工作表(ExcelCol1, ExcelCol2)。因此,除非我给了相同的 excel 列名称FirstTable(而不是Column1如果Column2我称之为ExcelCol1and ExcelCol2),它不会填充我通过设计器创建的 DataColumns。

有没有办法告诉 DataSet 忽略来自 Excel 的列,只填充已经定义的 DataColumns?

如果这是不可能的,我可以通过 DataConnection 以某种方式连接 Excel 工作表来创建 DataTables 的布局吗?我唯一不确定的是excel文件是用户定义的,所以用户浏览到excel文件来填充数据集。但是所有这些 excel 文件的列总是相同的。因此,我想使用 Typed DataSet 预设布局。

4

1 回答 1

1

好的,我想我想出了如何做到这一点。我不确定这是否是最干净的方法,因为我仍然必须手动对其进行编码以分配列名,即没有简单的方法可以忽略 Excel 列名,但至少我能够使用类型化的数据集.

此链接描述了表和列映射,基本上当您想使用自己的列名而不是 Excel 中的列名时。

我想指出一些事情,所以我给出了以下代码。

假设我通过名为MyDataSet.xsd. 它有一个名为FirstTableColumn1和的表Column2。然后以下代码可用于表映射

MyDataSet myDS = new MyDataset();
//Some query commands using OleDB to get data from Excel
OleDbDataAdapter myAdapter = new OleDbDataAdapter(<OleDbCommand>);
DataTableMapping tableMap = myAdapter.TableMappings.Add("Table", myDS.FirstTable.TableName);
tableMap.ColumnMappings.Add("ExcelCol1", myDS.FirstTable.Column1.ColumnName);
tableMap.ColumnMappings.Add("ExcelCol2", myDS.FirstTable.Column2.ColumnName);
myAdapter.Fill(myDS);
  1. 我意识到,当您从 Excel 文件中读取数据时,然后在 DataTableMapping 语句中,源名称始终"Table"是即使我的工作表名称/表格名称在 Excel 文件中不同。
  2. 要利用类型化数据集,您可以myDS.FirstTable.TableName对列名称使用类似和相同的命令,而不是,

    DataTableMapping tableMap = myAdapter.TableMappings.Add("Table", "FirstTable");

因此,如果您更改 DataSet 中的表或列名称,您可以使用 VS 的重构实用程序。

我希望这有帮助。如果有更清洁的解决方案,我将不胜感激,但现在这解决了我的问题。

于 2011-07-11T13:40:58.873 回答