Типизированные наборы данных C #: OleDBDataAdapter использует имена столбцов из типизированного набора данных, а не ExcelSheet - PullRequest
1 голос
/ 09 июля 2011

Я использую 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), он не заполнил бы столбцы DataColumns, созданные мной через конструктор.

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

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

1 Ответ

1 голос
/ 11 июля 2011

Хорошо, думаю, я понял, как это сделать. Я не уверен, что это самый чистый способ сделать это, поскольку мне все еще приходится вручную кодировать его, чтобы назначать имена столбцов, т.е. нет простого способа игнорировать имена столбцов 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 ("Table", "FirstTable");

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

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

...