C#Typed DataSets:OleDBDataAdapter使用Typed DataSet中的列名而不使用ExcelSheet
我正在使用VS 2010与C#的Windows窗体应用程序。
我需要将我的数据从Excel工作表加载到DataSet。 我使用DataSetdevise器创build了DataSet,并手动添加了表和列(FirstTable, Column1, Column2)
。 由于我访问的列很多,代码会更清晰,有一个types的数据集,而不是使用无types的数据集。
当我使用OleDBDataAdapter并使用填充FirstTable填充DataTable时, Column1
和Column2
是空的,并且还有两个来自Excel工作表(ExcelCol1, ExcelCol2)
附加列。 所以,除非我给了FirstTable
(而不是Column1
和Column2
如果我把它称为ExcelCol1
和ExcelCol2
)相同的Excel列名称,它不会填充通过devise器创build的DataColumns。
有什么办法告诉DataSet忽略来自Excel的列,只填充已定义的DataColumns?
如果这是不可能的,我可以以某种方式通过DataConnection连接Excel工作表来创buildDataTables的布局? 我不知道的唯一的事情是,Excel文件是用户定义的,所以用户浏览到Excel文件来填充数据集。 但所有这些Excel文件的列将始终是相同的。 因此我想使用Typed DataSet预设布局。
好吧,我想我想出了如何做到这一点。 我不确定这是否是最干净的方法,因为我仍然需要手工编写代码来分配列名称,即没有简单的方法来忽略Excel列名,但至less我可以使用types化的数据集。
这个链接描述了表格和列的映射,基本上当你想使用自己的列名而不是从Excel的列名。
我想指出一些事情,所以我给了下面的代码。
我们假设我已经通过名为MyDataSet.xsd
的DataSetdevise器创build了一个DataSet 。 它有一个名为FirstTable
的表,列Column1
和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);
- 我意识到,当你从Excel文件读取数据时,在DataTableMapping语句中,即使我的sheetname / tablename在Excel文件上不同,源名称始终为
"Table"
。 -
要利用Typed Dataset,可以使用像
myDS.FirstTable.TableName
这样的命令,而对列名称使用相同的命令,DataTableMapping tableMap = myAdapter.TableMappings.Add(“Table”,“FirstTable”);
所以如果你改变DataSet中的表或列名,你可以使用VS的重构工具。
我希望这有帮助。 如果有一个更清洁的解决scheme,我将不胜感激任何帮助,但现在这解决了我的问题。