carRow["Color"] = "черный";
carRow["PetName"] = "Hamlet";
inveritoryTable.Rows.Add(carRow);
// Выводит 'Состояние строки: Added.'
Console.WriteLine("Состояние строки: {0}.",
inventoryTable.Rows[0].RowState);
}
Как видите, DataRow в ADO.NET является достаточно "сообразительным" для того, чтобы контролировать текущее положение вещей. Поэтому, имея DataTable, вы можете выяснить, какие строки были изменены. Эта особенность DataSet очень важна, поскольку именно она при отправке обновленной информации в хранилище данных позволяет отправлять только измененные данные.
Тип DataTable определяет большое количество членов, многие из которых по именам и возможностям идентичны членам DataSet. В табл. 22.14 предлагаются описания основных свойств типа DataTable, за исключением Rows и Columns.
Таблица 22.14. Основные свойства типа DataTable
Свойство |
Описание |
CaseSensitive |
Индикатор необходимости учета регистра символов при сравнении строк в пределах таблицы. Значением по умолчанию является false (ложь) |
ChildRelations |
Возвращает коллекцию дочерних отношений для данного объекта DataTable (если таковые имеются) |
Constraints |
Возвращает коллекцию ограничений, поддерживаемых таблицей |
DataSet |
Возвращает объект DataSet, содержащий данную таблицу (если таковой имеется) |
DefaultView |
Возвращает пользовательское представление таблицы, которое может включать фильтр или позицию курсора |
MinimumCapacity |
Читает или устанавливает значение для начального числа строк данной таблицы (это значение по умолчанию равно 25) |
ParentRelations |
Возвращает коллекцию родительских отношений для данного объекта DataTable |
PrimaryKey |
Читает или устанавливает массив столбцов, функционирующих в качестве первичных ключей для таблицы данных |
RemotingFormat |
Позволяет определить, как объект DataSet должен выполнять сериализацию соответствующего содержимого (в двоичном или XML-формате) для слоя удаленного взаимодействия .NET. Это свойство появилось в .NET 2.0 |
TableName |
Читает или устанавливает имя таблицы. Это же свойство может быть указано в качестве параметра конструктора |
В нашем примере мы установим свойство 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.
Читать дальше