Файл: 1_C#_Введение_в_программирование_Уч_пособ_(Марченко-2005).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.12.2025

Просмотров: 1369

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Приложение-потребитель данных. Объект-представитель класса DataSet представляет НАБОР ДАННЫХ – хранилище данных на локальном компе.

Посредник между потребителем и базой данных. Провайдер данных Data Provider.

База данных. Хранилище информации.

ADO.NET. Объектная модель

 

Отсоединенные объекты

Подсоединенные объекты

DataSet

 

Connection

DataTable

DataView

Transaction

 

 

DataRow

DataAdapter

DataColumn

Comand

Constraint

 

Parameter

DataRelation

 

DataReader

Отсоединенные объекты объектной модели ADO.NET. Им посвящаются следующие главы пособия.

DataTable

Каждый объект DataTable представляет одну таблицу. Таблица в каждый конкретный момент своего существования характеризуется:

СХЕМОЙ таблицы,

СОДЕРЖИМЫМ таблицы (информацией).

При этом СХЕМА таблицы (структура объекта DataTable) определяется двумя наборами:

211

множеством столбцов таблицы (набор DataColumns, состоящий из множества объектов DataColumn),

множеством ограничений таблицы (набор Constraints, состоящий из множества объектов Constraint).

События класса DataTable

В члассе определены четыре события, которые позволяют отслеживать и в случае необходимости отменять значения данных.

1. Изменения строк. Позволяют отслеживать и при необходимости отменять изменения данных.

DataRowChanging – изменения вносятся в строку таблицы. Объявление соответствующего обработчика события имеет вид:

private static void Row_Changing( object sender, DataRowChangeEventArgs e )

DataRowChanged – изменения внесены в строку таблицы. Объявление соответствующего обработчика события имеет вид:

private static void Row_Changed( object sender, DataRowChangeEventArgs e )

private static void DataTableRowChange()

{

DataTable custTable = new DataTable("Customers");

//Добавляем столбики. custTable.Columns.Add( "id", typeof(int) );

custTable.Columns.Add( "name", typeof(string) );

//Определяем первичный ключ. custTable.Columns[ "id" ].Unique = true;

custTable.PrimaryKey = new DataColumn[] { custTable.Columns["id"] };

//Добавляем RowChanging event handler для нашей таблицы. custTable.RowChanging += new DataRowChangeEventHandler( Row_Changing );

//Добавляем a RowChanged event handler для нашей таблицы. custTable.RowChanged += new DataRowChangeEventHandler( Row_Changed );

//Добавляем строки.

for( int id=1; id<=10; id++ )

{

custTable.Rows.Add(

new object[] { id, string.Format("customer{0}", id)} );

}

custTable.AcceptChanges();

//Изменяем значение поля name во всех строках.

//Скромненько так все имена убираются, а на их место

//подставляется странное буквосочетание, состоящее из

//префикса vip и значения поля id каждого клиента.

//Была customer129 - стала vip129.

foreach( DataRow row in custTable.Rows )

{

row["name"] = string.Format( "vip{0}", row["id"] );

}

}

//И после такого вмешательства результаты становятся известны

//обработчику события. Row_Changing. А толку-то…

private static void Row_Changing( object sender, DataRowChangeEventArgs e )

{

Console.WriteLine( "Row_Changing Event: name={0}; action={1}", e.Row["name"], e.Action );

}

212


// Аналогично устроен обработчик. Row_Changed.

private static void Row_Changed( object sender, DataRowChangeEventArgs e )

{

Console.WriteLine( "Row_Changed Event: name={0}; action={1}", e.Row["name"], e.Action );

}

Параметр обработчика события DataRowChangeEventArgs обладает двумя свойствами (Action и Row), которые позволяют определить изменяемую строку и выполняемое над строкой действие. Действие кодируется значениями специального перечисления:

enum RowDataAction

{

Add,

Change,

Delete,

Commit,

Rollback, Nothing

}

2. Изменения полей (элементов в строках таблицы)

DataColumnChanging – изменения вносятся в поле строки данных. Объявление соответствующего обработчика события имеет вид:

private static void Column_Changing( object sender, DataColumnChangeEventArgs e )

DataColumnChanged – изменения были внесены в поле строки данных. Объявление соответствующего обработчика события имеет вид:

private static void Column_Changed( object sender, DataColumnChangeEventArgs e )

Параметр

обработчика события

DataColumnChangeEventArgs e обладает тремя

свойствами.

 

 

 

 

 

 

 

Свойство

 

Описание

 

Column

 

Gets the DataColumn with a changing value.

ProposedValue

 

Gets or sets the proposed new value for the column. Новое значение

 

 

для поля в строке.

 

Row

 

Строка, содержащая запись с изменяемым (изменённым) значением.

Пример аналогичного содержания. Только теперь реакция на модификацию столбца (поля), а не строки.

private static void DataTableColumnChanging()

{

DataTable custTable = new DataTable("Customers"); // add columns

custTable.Columns.Add( "id", typeof(int) ); custTable.Columns.Add( "name", typeof(string) );

// set PrimaryKey

custTable.Columns[ "id" ].Unique = true;

custTable.PrimaryKey = new DataColumn[] { custTable.Columns["id"] };

// add a ColumnChanging event handler for the table.

custTable.ColumnChanging += new DataColumnChangeEventHandler( Column_Changing ); // add a ColumnChanged event handler for the table.

custTable.ColumnChanged += new DataColumnChangeEventHandler( Column_Changed );

// add ten rows

for( int id=1; id<=10; id++ )

{

custTable.Rows.Add(

new object[] { id, string.Format("customer{0}", id)} );

}

213


custTable.AcceptChanges();

// Изменяем значение поля name во всех строках. foreach( DataRow row in custTable.Rows )

{

row["name"] = string.Format( "vip{0}", row["id"] );

}

}

private static void Column_Changing( object sender, DataColumnChangeEventArgs e )

{

Console.WriteLine

("Column_Changing Event: name={0}; Column={1}; proposed name={2}", e.Row["name"],

e.Column.ColumnName, e.ProposedValue );

}

private static void Column_Changed( object sender, DataColumnChangeEventArgs e )

{

Console.WriteLine

("Column_Changed Event: name={0}; Column={1}; proposed name={2}", e.Row["name"],

e.Column.ColumnName, e.ProposedValue );

}

DataColumns

Прежде всего!

DataColumnCollection задаёт схему таблицы, определяя тип данных каждой колонки.

В классе DataTable объявлено get-свойство DataColumns.

С помощью которого может быть получена коллекция принадлежащих таблице столбцов.

public DataColumnCollection Columns {get;}

Возвращается коллекция объектов-представителей класса DataColumn таблицы. Если у объекта-таблицы нет столбцов, возвращается null.

Объекты-представители класса DataColumn образуют набор DataColumns, который является обязательным элементом каждого объекта-представителя класса DataTable. Эти объекты соответствуют столбцам таблицы, представленной объектом-представителем класса DataTable. Объект DataColumn содержит информацию о структуре столбца (метаданные). Например, у этого объекта имеется свойство, Type, описывающее тип данных столбца. Также имеются свойства ReadOnly, Unique, Default, AutoIncrement, которые, в частности,

позволяют ограничить диапазон допустимых значений поля и определить порядок генерации значений для новых данных.

Представляет тип колонки в DataTable. Это стандартный блок, предназначенный

для построения схемы

DataTable.

характеризуется собственным типом,

Каждый DataColumn

как элемент схемы

который определяет тип значений, которые DataColumn содержит. Если объект DataTable создаётся как отсоединённое хранилище информации, представляющее таблицу базы данных, тип столбца объекта-таблицы должен соответствовать типу столбца таблицы в базе данных.

DataRows

СОДЕРЖИМОЕ таблицы (данные) задаётся набором DataRows – это конкретное множество строчек таблицы, каждая из которых является объектом-представителем класса DataRow.

Его методы и свойства представлены в таблице.

214


Открытые свойства

HasErrors

 

 

Возвращает значение, показывающее, есть ли ошибки в

 

 

 

строке.

 

 

Item

 

 

Перегружен. Возвращает или задает данные, сохраненные в

 

 

 

указанном столбце.

 

 

 

 

 

В языке C# это свойство является индексатором класса

 

 

 

DataRow.

 

 

ItemArray

 

 

Возвращает или задает все значения для этой строки с

 

 

 

помощью массива.

 

 

RowError

 

 

Возвращает или задает пользовательское описание ошибки

 

 

 

для строки.

 

 

RowState

 

 

Возвращает текущее состояние строки по отношению к

 

 

 

DataRowCollection.

 

 

Table

 

 

Возвращает DataTable, для которой

эта строка имеет

 

 

 

схему.

 

 

Открытые методы

 

 

 

 

AcceptChanges

 

Сохраняет все изменения, сделанные с этой строкой со

 

 

 

времени последнего вызова AcceptChanges.

 

BeginEdit

 

 

Начинает операцию редактирования объекта DataRow.

 

 

 

 

 

CancelEdit

 

 

Отменяет текущее редактирование строки.

 

 

 

 

ClearErrors

 

Удаляет ошибки в строке, включая RowError и ошибки,

 

 

 

установленные SetColumnError.

 

 

Delete

 

 

Удаляет DataRow.

 

 

 

 

 

 

 

 

EndEdit

 

 

Прекращает редактирование строки.

 

 

 

 

 

 

Equals

(унаследовано

от

Перегружен. Определяет, равны ли два экземпляра Object.

Object)

 

 

 

 

 

 

 

 

GetChildRows

 

Перегружен. Возвращает дочерние строки DataRow.

 

 

 

GetColumnError

 

Перегружен. Возвращает описание ошибки для столбца.

 

 

 

 

GetColumnsInError

 

Возвращает массив столбцов, имеющих ошибки.

 

 

 

 

GetHashCode (унаследовано

от

Служит хеш-функцией для конкретного типа, пригоден для

Object)

 

 

использования в алгоритмах хеширования и структурах

 

 

 

данных, например в хеш-таблице.

 

 

GetParentRow

 

Перегружен. Возвращает родительскую строку DataRow.

 

 

 

GetParentRows

 

Перегружен. Возвращает родительские строки DataRow.

 

 

 

 

 

 

GetType

(унаследовано

от

Возвращает Type текущего экземпляра.

 

 

Object)

 

 

 

 

 

 

 

 

 

HasVersion

 

 

Возвращает значение, показывающее, существует ли

 

 

 

указанная версия.

 

 

IsNull

 

 

Перегружен. Возвращает значение, показывающее, содержит

 

 

 

ли нулевое значение указанный столбец.

 

RejectChanges

 

Отменяет все значения, выполненные со строкой после

 

 

 

последнего вызова AcceptChanges.

 

 

SetColumnError

 

Перегружен. Устанавливает описание ошибки для столбца.

 

 

 

SetParentRow

 

Перегружен. Устанавливает родительскую строку DataRow.

 

 

 

 

ToString

(унаследовано

от

Возвращает String, который представляет текущий Object.

Object)

 

 

 

 

 

 

 

 

 

 

Защищенные методы

 

 

 

 

Finalize

(унаследовано

от

Переопределен. Позволяет объекту

Object

попытаться

Object)

 

 

освободить ресурсы и выполнить

другие

завершающие

 

 

 

операции, перед тем как объект Object будет уничтожен в

 

 

 

процессе сборки мусора.

 

 

 

 

 

В языках C# и C++ для функций финализации используется

 

 

 

синтаксис деструктора.

 

 

MemberwiseClone

 

Создает неполную копию текущего Object.

 

(унаследовано от Object)

 

 

 

 

215