Тип 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 без просмотра внутренних коллекций строк и столбцов. Для вызова метода нужно просто указать соответствующую таблицу.
static void Main(string[] args) {
…
// Печать DataTable с помощью 'объекта чтения таблиц' .
PrintTable(carsInventoryDS.Tables["Inventory"]);
}
Сохранение DataSet (и DataTable) в формате XML
В завершение рассмотрения текущего примера напомним, что как DataSet, так и DataTable предлагают поддержку методов WriteXml и ReadXml. Метод WriteXml позволяет сохранить содержимое объекта в локальном файле (или вообще в любом типе System.IO.Stream) в виде XML-документа. Метод ReadXml позволяет прочитать информацию о состоянии DataSet (или DataTable) из имеющегося XML-документа. Кроме того, как DataSet, так и DataTable поддерживают WriteXmlSchema и ReadXmlSchema для сохранения и загрузки файлов
static void Main(string [] args) {
…
// Сохранение DataSet в виде XML.
carsInventoryDS.WriteXml("carsDataSet.xml");
carsInventoryDS.WriteXmlSchema("carsDataSet.xsd");
// Очистка DataSet и вывод содержимого (должно быть пустым).
carsInventoryDS.Сlear;
PrintDataSet(carsInventoryDS);
// Загрузка и печать DataSet.
carsInventoryDS.ReadXml("carsDataSet.xml");
PrintDataSet(carsInventoryDS);
}
Если открыть сохраненный файл carsDataSet.xml, вы увидите, что в нем представлены все столбцы таблицы, закодированные в виде XML-элементов.
‹?xml version="1.0" standalone="yes"?›
‹Car_x0020_Inventory›
‹Inventory›
‹CarID›0‹/CarID›
‹Make›BMW‹/Make›
‹Color›черный‹/Color
‹PetName›Hamlet‹/PetName›
‹/Inventory›
‹Inventory›
‹CarID›1‹/CarID›
‹Make›Saab‹/Make›
‹Color›красный‹/Color›
‹PetName›Sea Brеeze‹/PеtName›
‹/Inventory›
‹/Car_x0020_Inventory›
Наконец, напомним, что тип DataColumn поддерживает свойство ColumnMapping, которое можно использовать для управления представлением столбца в XML-формате. Значением, устанавливаемым для этого свойства по умолчанию, является MappingType.Element. Однако можно потребовать, чтобы столбец CarID представлялся XML-атрибутом, как это сделано ниже в обновленной версии объекта carIDColumn для DataColumn.
Static void Main(string[] args) {
…
DataColumn carIDColumn = new DataColumn("CarID", typeof(int));
…
carIDColumn.ColumnMapping = MappingType.Attribute;
}
Тогда вы обнаружите следующий XML-код.
‹?xml version="1.0" standalone="yes"?›