Читать «ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание» онлайн - страница 589

Эндрю Троелсен

В нашем примере мы установим свойство PrimaryKey типа DataTable равным объекту carIDColumn типа DataColumn.

static void Main(string[] args) {

 …

 // Установка первичного ключа для таблицы.

 inventoryTable.PrimaryKey = new DataColumn[] { inventoryTable.Columns[0] };

}

На этом создание примера для DataTable завершается. Заключительным шагом будет вставка DataTable в DataSet-объект carsInventoryDS. Затем объект DataSet нужно оформлять вспомогательному методу PrintDataSet() (который ещё предстоит написать).

static void Main(string[] args) {

 …

 // Наконец, добавление таблицы в DataSet.

 carsInventoryDS.Tables.Add(inventoryTable);

 // Теперь вывод данных DataSet.

 PrintDataSet(carsInventoryDS);

}

Метод PrintDataSet() просто выполняет цикл по всем DataTable из DataSet. печатая имена столбцов и значения строк с помощью индексатора типа.

static void PrintDataSet(DataSet ds) {

 Console.WriteLine("Таблицы в DataSet '{0}'.\n", ds.DataSetName);

 foreach (DataTable dt in ds.Tables) {

  Console.WriteLine("Таблица {0}.\n", dt.TableName);

  // Вывод имен столбцов.

  for (int curCol = 0; curCol ‹ dt.Coumns.Count; curCol++) {

   Console.Write(dt.Columns[curCol].ColumnName.Trim() + ''\t");

  }

  Console.WriteLine("\n--------------------------------");

  // Вывод DataTable.

  for (int curRow = 0; curRow ‹ dt.Rows.Count; curRow++) {

   for (int curCol = 0; curCol ‹ dt.Columns.Count; curCol++) {

    Console.Write(dt.Rows[curRow][curCol.ToString() + "\t");

   }

   Console.WriteLine();

  }

 }

}

Вывод программы показан на рис. 22.12.

Рис. 22.12. Содержимое объекта DataSet примера

Работа с DataTableReader в .NET 2.0

Тип DataTable предлагает еще целый ряд методов, кроме тех, что уже были нами рассмотрены. Подобно DataSet, тип DataTable поддерживает, например, методы AcceptChanges(), GetChanges(), Сору() и ReadXml()/WriteXml(). В .NET 2.0 тип DataTable поддерживают также метод CreateDataReader(). Этот метод позволяет получить данные DataTable, используя схему, соответствующую схеме навигации объекта чтения данных (только вперед и только для чтения). Для примера создайте новую вспомогательную функцию PrintTable(), реализованную следующим образом.

private static void PrintTable(DataTable dt) {

 Console.WriteLine("\n***** Строки в DataTable *****");

 // Получение нового для .NET 2.0 типа DataTableReader.

 DataTableReader dtReader = dt.CreateDataReader();

 // DataTableReader работает подобно DataReader.

 while (dtReader.Read()) {

  for (int i = 0; i ‹ dtReader.FleldCount; i++) {

   Console.Write("{0} = {1} ", dtReader.GetName(i), dtReader.GetValue(i).ToString().Trim());

  }

  Console.WriteLine();

 }

 dtReader.Close();

}

Обратите внимание на то, что DataTableReader работает аналогично объекту чтения данных поставщика данных. Использование DataTableReader может оказаться идеальным вариантом, когда нужно быстро прочитать данные DataTable без просмотра внутренних коллекций строк и столбцов. Для вызова метода нужно просто указать соответствующую таблицу.