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() для сохранения и загрузки файлов * .xsd. Чтобы это проверить, добавьте в метод Main() следующий набор операторов.
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"?›
‹Car_x0020_Inventory›
‹Inventory CarID="0"›
‹Make›BMW‹/Make›
‹Color›черный‹/Color›
‹PetName›Hamlet‹/PetName›
‹/Inventory›
‹Inventory CarID="1"›
‹Make›Saab‹/Make›
‹Color›красный‹/Color›
‹PetName›Sea Breeze‹/PetName›
‹/Inventory›
‹/Car_x0020_Inventory›
Исходный код.Проект SimpleDataSet размещен в подкаталоге, соответствующем главе 22.
Привязка DataTable к интерфейсу пользователя
Теперь, когда мы обсудили процесс взаимодействия с DataSets в общем, давайте рассмотрим соответствующий пример приложения Windows Forms. Нашей целью является построение формы, отображающей содержимое DataTable в рамках элемента управления DataGridView. На рис. 22.13 показано окно исходного пользовательского интерфейса проекта.
Рис. 22.13. Привязка DataTable к DataGridView
Замечание.Для представления реляционных баз данных в .NET 2.0 элемент управления DataGridView считается наиболее "предпочтительным", однако остается доступным и устаревший элемент управления .NET 1.x DataGrid.
Создайте новое приложение Windows Forms с именем CarDataTableViewer. Добавьте в форму элемент управления DataGridView (назвав его carInventoryGridView) и Label с подходящим описанием. Затем добавьте в проект новый C#-класс (с именем Car), определив его так, как показано ниже.
public class Car {
// Здесь public используется для простоты.
public string carPetName, carMake, carColor;
public Car(string petName, string make, string color) {
Читать дальше