Классы из пространства имен System.Data DataSet DataTable DataView Object MarshalByValueComponent DataColumn DataRow DataRelation ForeignKeyConstraint Constraint UniqueKeyConstraint Пространство имен 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 DataTable(); DataTable( string tableName ); Свойство TableName используется для идентификации таблицы: public string TableName {get; set;} После создания объекта DataTable с использованием открытых конструкторов класса он не имеет схемы (schema). Чтобы определить схему таблицы DataTable, необходимо создать объекты DataColumn и добавить их к коллекции Columns таблицы. Класс DataColumn При создании столбцов DataColumn используется конструктор класса или одна из перегруженных версий метода Add класса DataColumnCollection. Некоторые конструкторы класса DataColumn DataColumn(); DataColumn( string columnName ); DataColumn( string columnName, Type dataType ); В приведенном фрагменте кода создается таблица с именем “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; True, если запрещено изменение значений в set;} столбце после того, как строка добавлена в таблицу. Умолчание – 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 В таблице DataTable данные хранятся в виде строк – объектов типа DataRow. Класс DataRow не имеет открытых конструкторов. Ссылку на новую строку в таблице можно получить как возвращаемое значение метода NewRow класса DataTable. DataRow NewRow(); Строка 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 DataTable и DataSet • IListSource • ISupportInitializeNotification • ISupportInitialize • ISerializable • IXmlSerializable DataView • IBindingListView • IBindingList • IList • ICollection • IEnumerable • ITypedList • ISupportInitializeNotification • ISupportInitialize Интерфейс 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. Значения перечисления DataRowState Unchanged Строка не изменялась. Added Строка была добавлена к таблице. Modified Один из элементов строки был изменен. Deleted Строка была удалена из таблицы. Detached Состояние Detached имеет строка, которая была создана, но не добавлена в коллекцию DataRowCollection. Информация о текущем состоянии строки доступна через свойство: public DataRowState RowState {get;} Значения полей для разных версий строки Можно получить значения полей для разных версий строки с помощью определенных в DataRow индексаторов : object this[ DataColumn column, DataRowVersion version ] {get;} object this[ string columnName, DataRowVersion version ] {get;} object this[ int columnIndex, DataRowVersion version ] {get;} Значения перечисления DataRowVersion Current Текущее значение строки. Не определено для значения Deleted свойства RowState. Default Зависит от состояния строки. Для значений Added, Modified и Unchanged это версия Current, для Deleted Original, для Detached - Proposed. Original Исходное значение строки, не определено для значения Added свойства RowState. Proposed Предлагаемое значение для строки. Существует только в процессе выполнения редактирования строки, а также для строк, которые не являются элементами коллекции DataRowCollection. Значения полей для разных версий строки -2 В следующем примере все строки таблицы DataTable tbl, для которых существует версия DataRowVersion.Current, выводятся в MessageBox 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 В классе DataTable определены следующие события, которые может обработать приложение: ColumnChanged Происходит, когда процесс изменения значения успешно завершен. ColumnChanging Происходит непосредственно перед тем, как столбец таблицы будет изменен. RowChanged Происходит после того, как успешно завершено редактирование строки. RowChanging Происходит непосредственно перед тем, как строка таблицы будет изменена. RowDeleted Происходит после того, как строка таблицы была помечена как удаленная (Deleted). RowDeleting Происходит непосредственно перед тем, как строка таблицы будет помечена как удаленная (Deleted). События класса DataTable -2 По умолчанию каждое изменение значения в столбце порождает четыре события – сначала ColumnChanging и ColumnChanged для столбца, в котором изменилось значение, а затем события RowChanging и RowChanged. Обработчики событий ColumnChanging и ColumnChanged имеют тип: public delegate void DataColumnChangeEventHandler ( object sender, DataColumnChangeEventArgs e); В обработчик передается новое значение и информация о столбце и строке таблицы через свойства класса DataColumnChangeEventArgs. public DataColumn Column {get;} public DataRow Row {get;} public object ProposedValue {get; set;} События RowChanging и RowChanged не содержат информации о том, в каком из столбцов изменилось значение. Информация о корректности данных Свойства класса DataRow с информацией о корректности данных в строке: bool HasErrors {get;} string RowError {get; set;} Методы класса DataRow для проверки корректности данных. 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(); В классе DataTable 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 public DataView(); public DataView(DataTable); public DataView(DataTable, string, string, DataViewRowState); В конструкторе класса DataView можно сразу задать критерии фильтрации и сортировки. Критерии сортировки и фильтрации можно задать и как свойства класса DataView : virtual string RowFilter {get; set;} DataViewRowState RowStateFilter {get; set;} string Sort {get; set;} Критерий фильтрации определяется значением двух свойств RowFilter и RowStateFilter. Сортировка string Sort {get; set;} Строка, определяющая критерий сортировки, должна содержать имя столбца, за которым после пробела следуют символы "ASC" (ascending – умолчание) или "DESC" (descending). Через запятую можно перечислить имена нескольких столбцов. В приведенном ниже примере строки сортируются в порядке убывания по значению столбца с именем “Shape”, строки с одинаковым значением в столбце “Shape” сортируются в порядке убывания по значению столбца с именем “Height”. DataView dview2 = new DataView(tbl.Table); dview2.Sort = "Shape DESC, Height DESC"; Фильтрация Критерий фильтрации определяется значением двух свойств RowFilter и RowStateFilter. virtual string RowFilter {get; set;} DataViewRowState RowStateFilter {get; set;} Свойство RowStateFilter дает возможность сформировать DataView, на основе версии строки, которая определяется значением перечисления DataViewRowState . В приведенном ниже примере в представление DataView входят исходные версии измененных строк (состояние ModifiedOriginal). DataView dview1 = new DataView(tbl.Table); dview1.RowStateFilter = DataViewRowState.ModifiedOriginal; Фильтрация -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;} Строка находится в процессе редактирования.