Классы из пространства имен System.Data ObjectMarshalByValueComponentDataSetDataTableDataViewDataColumnDataRowDataRelationConstraintForeignKeyConstraintUniqueKeyConstraint
Пространство имен System.Data В пространство имен System.Data входят классы, поддерживающие клиентскую часть архитектуры ADO.NET. Центральный класс ADO.NET – класс DataSet, представляющий собой полную или частичную копию данных на локальном компьютере. Класс DataSet состоит из набора таблиц DataTable, которые могут содержать данные, полученные из разных источников. Классы DataView и DataViewManager используются для представлений таблицы, классы DataRow и DataSet - для строк и столбцов таблицы. Классы DataRelation, Constraint, ForeignKeyConstraint и UniqueConstraint используются для описания связей между таблицами и ограничений для столбцов. В пространстве имен System.Data также определены делегаты для обработчиков событий, классы исключений и перечисления.
Класс DataTable Класс DataTable описывает таблицу данных и содержит коллекции строк (объектов DataRow ) и столбцов (DataColumn). Коллекция столбцов определяет схему (schema) таблицы. Строки таблицы состоят из полей, отвечающих схеме таблицы. Свойства Rows и Columns дают доступ к коллекции строк и столбцов таблицы: public DataRowCollection Rows {get;} public DataColumnCollection Columns {get;} В коллекциях определены индексаторы, причем доступ к элементам коллекций возможен как по номеру, так и по имени объекта.
Класс DataTable -2 Открытые конструкторы класса DataTable public string TableName {get; set;} После создания объекта DataTable с использованием открытых конструкторов класса он не имеет схемы (schema). Чтобы определить схему таблицы DataTable, необходимо создать объекты DataColumn и добавить их к коллекции Columns таблицы. Свойство TableName используется для идентификации таблицы: DataTable(); DataTable( string tableName );
Класс DataColumn DataColumn(); DataColumn( string columnName ); DataColumn( string columnName, Type dataType ); При создании столбцов DataColumn используется конструктор класса или одна из перегруженных версий метода Add класса DataColumnCollection. Некоторые конструкторы класса DataColumn В приведенном фрагменте кода создается таблица с именем DataMix, в которую добавляются два столбца: DataTable tbl = new DataTable("Data Mix"); tbl.Columns.Add(Color", typeof(System.Drawing.Color)); tbl.Columns.Add("EqualSizes", typeof (bool));
Свойства класса DataColumn Некоторые свойства класса DataColumn: DataTable Table {get;} Ссылка на таблицу, в которой находится столбец. string ColumnName {get; set;} Каждый столбец таблицы должен иметь имя. Если имя не задано явно, при добавлении столбца в таблицу свойство ColumnName получит значение по умолчанию. Type DataType {get; set;} Тип данных в столбце. Если свойство изменить после добавления данных в таблицу, будет брошено исключение. bool ReadOnly {get; set;} True, если запрещено изменение значений в столбце после того, как строка добавлена в таблицу. Умолчание – false.
Свойства класса DataColumn -2 bool Unique {get; set;} true, если все значения в столбце должны быть различны. Умолчание – false. bool AutoIncrement {get; set;} true - при добавлении в таблицу значение поля вычисляется автоматически с использованием значений свойств AutoIncrementSeed (тип long ) и AutoIncrementStep (тип long ). string Caption {get; set;} Заголовок столбца. object DefaultValue {get; set;} Значение по умолчанию. int Ordinal {get;} Порядковый номер в коллекции DataColumnCollection; -1, если столбец не добавлен в таблицу. bool AllowDBNull {get; set;} true - поле может иметь значение null. Умолчание true.
Класс DataRow DataRow NewRow(); Класс DataRow не имеет открытых конструкторов. Ссылку на новую строку в таблице можно получить как возвращаемое значение метода NewRow класса DataTable. В таблице DataTable данные хранятся в виде строк – объектов типа DataRow. Строка DataRow добавляется к коллекции строк таблицы Rows при вызове метода Add класса DataRowCollection. void Add( DataRow row ); virtual DataRow Add( object[] values ); Доступ к отдельным полям (столбцам) строки таблицы дают индексаторы, которые принимают как параметр номер или имя столбца.
Свойства класса DataRow DataTable Table {get;} Ссылка на таблицу, в которой находится строка. bool HasErrors {get;} Информация об ошибках в строке. string RowError {get; set;} Описание ошибки. DataRowState RowState {get;} Состояние строки. object[] ItemArray {get; set;} Значения всех полей строки в виде массива. Доступ к отдельным полям (столбцам) строки дают индексаторы, определенные в классе DataRow. object this[ string columnName ] {get; set;} object this[ DataColumn column ] {get; set;} object this[ int columnIndex ] {get; set;}
Интерфейсы в классах System.Data IListSource ISupportInitializeNotification ISupportInitialize ISerializable IXmlSerializable DataTable и DataSet IBindingListView IBindingList IList ICollection IEnumerable ITypedList ISupportInitializeNotification ISupportInitialize DataView
Интерфейс IListSource Интерфейс IListSource дает доступ к объекту, который можно использовать как источник данных public interface IListSource { IList GetList(); bool ContainsListCollection {get;} // true, если элементы // коллекции также реализуют интерфейс IList }
Редактирование данных таблицы Класс DataTable поддерживает средства для восстановления (rollback) исходных значений, которые хранились в таблице до ее изменения (в том числе программного). Для каждой строки таблицы поддерживается четыре версии: Current – измененные значения; Original – значения до изменения; Proposed – существует только в процессе редактирования ; Default – одна из предыдущих версий (зависит от состояния строки). Методы класса DataTable public void AcceptChanges(); public virtual void RejectChanges();
Текущее состояние строки Значения перечисления DataRowState Unchanged Строка не изменялась. AddedСтрока была добавлена к таблице. Modified Один из элементов строки был изменен. DeletedСтрока была удалена из таблицы. DetachedСостояние Detached имеет строка, которая была создана, но не добавлена в коллекцию DataRowCollection. public DataRowState RowState {get;} Каждая строка таблицы хранит информацию о текущем состоянии в виде значения перечисления DataRowState. Информация о текущем состоянии строки доступна через свойство:
Значения полей для разных версий строки Значения перечисления DataRowVersion CurrentТекущее значение строки. Не определено для значения Deleted свойства RowState. DefaultЗависит от состояния строки. Для значений Added, Modified и Unchanged это версия Current, для Deleted - Original, для Detached - Proposed. OriginalИсходное значение строки, не определено для значения Added свойства RowState. ProposedПредлагаемое значение для строки. Существует только в процессе выполнения редактирования строки, а также для строк, которые не являются элементами коллекции DataRowCollection. Можно получить значения полей для разных версий строки с помощью определенных в DataRow индексаторов : object this[ DataColumn column, DataRowVersion version ] {get;} object this[ string columnName, DataRowVersion version ] {get;} object this[ int columnIndex, DataRowVersion version ] {get;}
Значения полей для разных версий строки -2 string str = " Current Version \n"; foreach ( DataRow dtRow in tbl.Rows ) { if ( dtRow.HasVersion(DataRowVersion.Current)) for ( int j=0; j< dtRow.ItemArray.Length; j++) { str += dtRow[j,DataRowVersion.Current].ToString()+ "\t"; } str += "\n"; } MessageBox.Show(str); В следующем примере все строки таблицы DataTable tbl, для которых существует версия DataRowVersion.Current, выводятся в MessageBox
События класса DataTable ColumnChangedПроисходит, когда процесс изменения значения успешно завершен. ColumnChangingПроисходит непосредственно перед тем, как столбец таблицы будет изменен. RowChangedПроисходит после того, как успешно завершено редактирование строки. RowChangingПроисходит непосредственно перед тем, как строка таблицы будет изменена. RowDeletedПроисходит после того, как строка таблицы была помечена как удаленная (Deleted). RowDeletingПроисходит непосредственно перед тем, как строка таблицы будет помечена как удаленная (Deleted). В классе DataTable определены следующие события, которые может обработать приложение:
События класса DataTable -2 public delegate void DataColumnChangeEventHandler ( object sender, DataColumnChangeEventArgs e); public DataColumn Column {get;} public DataRow Row {get;} public object ProposedValue {get; set;} По умолчанию каждое изменение значения в столбце порождает четыре события – сначала ColumnChanging и ColumnChanged для столбца, в котором изменилось значение, а затем события RowChanging и RowChanged. Обработчики событий ColumnChanging и ColumnChanged имеют тип: События RowChanging и RowChanged не содержат информации о том, в каком из столбцов изменилось значение. В обработчик передается новое значение и информация о столбце и строке таблицы через свойства класса DataColumnChangeEventArgs.
Информация о корректности данных В классе DataTable void SetColumnError( DataColumn column, string error ); void SetColumnError( int columnIndex, string error ); void SetColumnError( string columnName, string error ); string GetColumnError( DataColumn column ); // 3 версии public DataColumn[] GetColumnsInError(); void ClearErrors(); Свойства класса DataRow с информацией о корректности данных в строке: Методы класса DataRow для проверки корректности данных. bool HasErrors {get;} string RowError {get; set;} bool HasErrors {get;} public DataRow[] GetErrors(); В классе DataSet bool HasErrors {get;}
Класс DataView Класс DataView дает возможность создать несколько представлений (view) для одного и того же множества данных из объекта DataTable, используя различные критерии сортировки и/или фильтрации. public class DataView : MarshalByValueComponent, IBindingList, IList, ICollection, IEnumerable, ITypedList, ISupportInitialize Класс DataView всегда связан с объектом DataTable. С каждым объектом DataTable по умолчанию всегда связан один объект DataView. Ссылку на него можно получить через свойство класса DataTable: public DataView DefaultView {get;} Другие представления для таблицы можно создать с помощью конструкторов класса DataView.
Класс DataView -2 В конструкторе класса DataView можно сразу задать критерии фильтрации и сортировки. Критерии сортировки и фильтрации можно задать и как свойства класса DataView : public DataView(); public DataView(DataTable); public DataView(DataTable, string, string, DataViewRowState); virtual string RowFilter {get; set;} DataViewRowState RowStateFilter {get; set;} string Sort {get; set;} Критерий фильтрации определяется значением двух свойств - RowFilter и RowStateFilter.
Сортировка Строка, определяющая критерий сортировки, должна содержать имя столбца, за которым после пробела следуют символы "ASC" (ascending – умолчание) или "DESC" (descending). Через запятую можно перечислить имена нескольких столбцов. В приведенном ниже примере строки сортируются в порядке убывания по значению столбца с именем Shape, строки с одинаковым значением в столбце Shape сортируются в порядке убывания по значению столбца с именем Height. DataView dview2 = new DataView(tbl.Table); dview2.Sort = "Shape DESC, Height DESC"; string Sort {get; set;}
Фильтрация Свойство RowStateFilter дает возможность сформировать DataView, на основе версии строки, которая определяется значением перечисления DataViewRowState. В приведенном ниже примере в представление DataView входят исходные версии измененных строк (состояние ModifiedOriginal). DataView dview1 = new DataView(tbl.Table); dview1.RowStateFilter = DataViewRowState.ModifiedOriginal; virtual string RowFilter {get; set;} DataViewRowState RowStateFilter {get; set;} Критерий фильтрации определяется значением двух свойств - RowFilter и RowStateFilter.
Фильтрация -2 Свойство RowFilter дает возможность фильтровать строки по значениям полей. Критерий фильтрации задается с помощью строки, которая содержит имя столбца, знак операции и значение. В приведенном ниже примере, в представление будут входить строки, для которых значение полей в столбце с именем Width больше 10, но меньше 50: DataView dview2 = new DataView(tbl.Table); Dview2.RowFilter = Width > 10 AND Width < 50 "; В приведенном ниже фрагменте кода, в представление будут входить строки, для которых значение поля в столбце с именем Shape содержит символы кр: DataView dview2 = new DataView(tbl.Table); dview2. RowFilter = Shape LIKE *кр*";
Свойства DataView Некоторые свойства класса DataView: bool AllowDelete {get; set;} Разрешено удаление строк. bool AllowEdit {get; set;} Разрешено редактирование строк. bool AllowNew {get; set;} Разрешено добавление строк. DataRowView this[ int recordIndex ] {get;} Индексатор для доступа к строке. DataTable Table {get; set;} Ссылка на таблицу. bool ApplyDefaultSort {get; set;} Применить сортировку по умолчанию.
Класс DataRowView Класс DataRowView описывает отдельную строку представления DataView. Свойства класса DataRowView: DataView DataView {get;} Ссылка на DataView, которой принадлежит строка. DataRow Row {get;} Ссылка на DataRow, которую представляет DataRowView. DataRowVersion RowVersion {get;} Текущая версия строки. object this[ int ndx ] {get; set;} object this[ string property ] {get; set;} Индексатор, с помощью которого можно получить доступ к полям разных версий строки. bool IsNew {get;} Строка является новой. bool IsEdit {get;} Строка находится в процессе редактирования.