Типизированные наборы данных C #: OleDBDataAdapter использует имена столбцов из типизированного набора данных, а не ExcelSheet

Я использую VS 2010 с C # для приложения Windows Form.

Мне нужно загрузить данные из таблицы Excel в DataSet. Я создал DataSet с помощью конструктора DataSet и вручную добавил таблицы и столбцы (FirstTable, Column1, Column2). Поскольку я часто обращаюсь к столбцам, код будет намного чище, если будет иметь типизированный набор данных вместо нетипизированного.

Когда я использовал OleDBDataAdapter и заполнил DataTable с помощью Fill на FirstTable, Column1 и Column2 были пустыми, и было два дополнительных столбца, которые были из листа Excel (ExcelCol1, ExcelCol2). Поэтому, если я не дал те же имена столбцов Excel для FirstTable (вместо Column1 и Column2, если бы я назвал его ExcelCol1 и ExcelCol2), он не будет заполнять столбцы данных, которые я создал с помощью дизайнера.

Есть ли способ указать DataSet игнорировать столбцы, поступающие из Excel, и просто заполнить уже определенные DataColumns?

ЕСЛИ это невозможно, могу ли я каким-то образом подключить лист Excel через DataConnection для создания макета таблиц данных? Единственное, в чем я не уверен, это то, что файл excel определяется пользователем, поэтому пользователь переходит к файлу excel для заполнения DataSets. НО столбцы для всех этих файлов Excel всегда будут одинаковыми. Следовательно, я хочу предварительно настроить макет с помощью типизированного набора данных.


person nbz    schedule 08.07.2011    source источник


Ответы (1)


Хорошо, думаю, я понял, как это сделать. Я не уверен, что это самый чистый способ сделать это, поскольку мне все еще приходится вручную кодировать его, чтобы назначать имена столбцов, т.е. нет простого способа игнорировать имена столбцов Excel, но, по крайней мере, я могу использовать типизированные наборы данных .

Эта ссылка описывает сопоставления таблиц и столбцов, которые в основном используются, когда вы хотите используйте собственные имена столбцов вместо имен из Excel.

Я хотел бы указать на несколько вещей, поэтому я привел следующий код.

Предположим, я создал DataSet с помощью конструктора DataSet под названием MyDataSet.xsd. В нем есть таблица с именем 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);
  1. Я понял, что когда вы читаете данные из файла Excel, то в операторе DataTableMapping имя источника всегда "Table", даже если мое имя листа / имя таблицы отличается в файле Excel.
  2. Чтобы воспользоваться преимуществами типизированного набора данных, вы можете использовать такие команды, как myDS.FirstTable.TableName и то же самое для имен столбцов вместо,

    DataTableMapping tableMap = myAdapter.TableMappings.Add («Таблица», «Первая таблица»);

Поэтому, если вы измените имена таблиц или столбцов в DataSet, вы можете использовать утилиты рефакторинга VS.

Надеюсь, это поможет. Если есть более чистое решение, я был бы признателен за любую помощь, но пока это устранило мою проблему.

person nbz    schedule 11.07.2011