Присвоение свойству AllowDBNull значения True указывает на то, что в данном поле допускается использование неопределенных значений.
Присвоение свойству AutoIncrement значения True указывает на то, что значение поля увеличивается при каждом добавлении в таблицу новой записи. Для указания начального значения и приращения используются свойства AutoIncrementSeed и AutoIncrementStep.
НА ЗАМЕТКУ
Объект DataTable принимает новую запись и присваивает автоматически увеличенное значение для поля, свойство которого AutoIncrement имеет значение True, только если значение поля отличается от принимаемого по умолчанию.
Среди других свойств объекта DataColumn следует отметить MaxLength (для полей с данными типа String), DefaultValue и Table. Поле также можно определить с выражением для вычисления значения, создания итогового поля или фильтрования строк. Такое выражение может состоять из имен полей текущей записи или других записей, констант, операторов, символов подстановки, итоговых и других функций. Более подробную информацию и примеры таких выражений можно найти в справочных материалах для свойства Expression объекта DataColumn.
Вставка данных в объект DataTable
После определения объекта DataTable и его схемы можно начинать ввод данных.
В листинге 5.2 приводится код вставки записей с данными в DataTable. Подпрограмма AddData включает четыре записи с данными в таблицу Departments и три записи с данными в таблицу Employees следующим образом.
1. Сначала создается новый экземпляр объекта DataRow для нужной таблицы с помощью метода NewRow.
2. Затем присваиваются значения полям этой записи.
3. После этого запись включается в коллекцию записей Rows таблицы с помощью метода Add свойства Rows таблицы.
ЛИСТИНГ 5.2. Код программного ввода данных в объект DataTable
Private Sub AddData ()
Dim dtDepartments As DataTable = dsEmployeeInfo.Tables ("Departments")
Dim dtEmployees As DataTable = dsEmployeeInfo.Tables("Employees")
' Вставка четырех записей в таблицу Departments.
Dim rowDept As DataRow
rowDept = dtDepartments.NewRow
rowDept("ID") = 11
rowDept("DepartmentName") = "Administration"
dtDepartments.Rows.Add(rowDept)
rowDept = dtDepartments.NewRow rowDept("ID") = 22
rowDept("DepartmentName") = "Engineering"
dtDepartments.Rows.Add(rowDept)
rowDept = dtDepartments.NewRow
rowDept("ID") = 33
rowDept("DepartmentName") = "Sales"
dtDepartments.Rows.Add(rowDept)
rowDept = dtDepartments.NewRow rowDept("ID") =44
rowDept("DepartmentName") = "Marketing"
dtDepartments.Rows.Add(rowDept)
' Вставка трех записей в таблицу Employees.
Dim rowEmployee As DataRow
rowEmployee = dtEmployees.NewRow
rowEmployee("FirstName") = "Jackie"
rowEmployee("LastName") = "Goldstein"
rowEmployee("DepartmentID") = 22
dtEmployees.Rows.Add(rowEmployee)
rowEmployee = dtEmployees.NewRow
rowEmployee("FirstName") = "Jeffrey"
rowEmployee("LastName") = "McManus"
rowEmployee("DepartmentID") = 33
dtEmployees.Rows.Add(rowEmployee)
rowEmployee = dtEmployees.NewRow
rowEmployee("FirstName") = "Sam"
rowEmployee("LastName") = "Johnson"
rowEmployee("DepartmentID") = 33
dtEmployees.Rows.Add(rowEmployee)
End Sub
НА ЗАМЕТКУ
Новую запись можно вставить в таблицу, передавая методу Add массив объектов, содержащих данные в порядке следования полей в определении таблицы. В листинге 5.2 этот способ мог быть представлен так:
Dim empData(2) As Object
empData(0) = "Sam"
empData(1) = "Johnson"
empData(3) = 33
dtEmployees.Rows.Add(empData)
Обновление данных в объекте DataSet
Для обновления отдельной записи таблицы необходимо просто организовать доступ к нужной записи и присвоить новое значение одному из полей. Например, для изменения номера отдела, к которому относится Sam Johnson, можно использовать следующую строку кода:
dtEmployees.Rows(2) ("DepartmentID") = 2
НА ЗАМЕТКУ
В этой строке кода номер записи (2) приводится из предположения, что нам известно расположение записей в таблице. Но с практической точки зрения этот способ не совсем удачен, более эффективный и безопасный способ основан на поиске нужной строки (или нескольких строк). Он описывается в разделе о доступе к данным в объекте DataTable далее в главе.
Таким образом, в данные можно вносить произвольное количество изменений, но все они не будут зафиксированы до тех пор, пока не будет вызван метод AcceptChanges. Для отката изменений, внесенных после загрузки данных или последнего вызова метода AcceptChanges, используется метод RejectChanges.
НА ЗАМЕТКУ
Метод AcceptChanges (и метод RejectChanges) можно использовать на нескольких разных уровнях, т.е. в классах DataTable, DataSet и DataRow. Вызов метода AcceptChanges объекта DataSet приведет к вызову этого метода для каждой таблицы объекта DataSet. Аналогично вызов метода AcceptChanges DataTable приведет к вызову этого метода для каждой записи объекта DataTable. Таким образом можно зафиксировать изменения отдельно для каждой записи или сразу для всех данных объекта DataSet. To же самое относится к методу RejectChanges.
Строки можно вставлять и удалять целиком. До сих пор был показан только процесс создания записей, а удаление записи основано на методе Remove объекта DataRowCollection (т.е. свойство Rows объекта DataTable). Этот метод полностью удаляет запись из коллекции. Другой способ удаления записи основан на методе Delete объекта DataRow. Этот метод отмечает запись для удаления, которое на самом деле произойдет только после вызова метода AcceptChanges.
После вызова метода Remove все данные записи будут удалены необратимо, даже если после этого вызвать метод RejectChanges.
Состояние и версия записи
Каждый объект DataRow имеет свойство RowState, которое обозначает текущее состояние или статус записи. Кроме того, каждая запись хранит информацию о четырех разных версиях своего значения. По мере редактирования записи изменяется ее состояние и версия значения. В табл. 5.1 приведено краткое описание свойства RowState, а в табл. 5.2 – краткое описание свойства DataRowVersion.
Таблица 5 1. Свойство RowState
Член перечисления Описание Unchanged Никаких изменений не внесено с момента последнего вызова метода AcceptChanges или после загрузки данных с помощью объекта DataAdapter Added Запись вставлена в коллекцию DataRowCollection (т.е. в свойство Rows объекта DataTable), но метод AcceptChanges еще не вызывался Deleted Метод Delete вызван для удаления записи, но метод AcceptChanges еще не вызывался Modified Запись изменена, но метод AcceptChanges еще не вызывался Detached Запись создана, но не добавлена в коллекцию DataRowCollection, либо метод Remove вызван для удаления записи из коллекции DataRowCollection, либо метод Delete вызван для удаления записи и вызван метод AcceptChanges
Таблица 5.2. Свойство DataRowVersion
Член перечисления Описание Original Исходные значения записи. Эта версия не существует для строки со значением Added свойства состояния записи RowState Current Текущее (возможно измененное) значение записи. Эта версия не существует для строки со значением Deleted свойства состояния записи RowState Default Используемая по умолчанию версия записи, которая зависит от текущего состояния записи. Если состояние записи RowState имеет значение Deleted, то по умолчанию используется версия Original, если значение Detached – версия Proposed. Во всех остальных случаях по умолчанию используется версия Current Proposed Предлагаемое значение записи. Эта версия существует только во время редактирования (начинается с вызова метода BeginEdit и заканчивается вызовами методов EndEdit или CancelEdit) либо для записи, которая еще не включена в коллекцию DataRowCollection
Если запись находится в состоянии Deleted в момент вызова метода AcceptChanges, то она удаляется из коллекции DataRowCollection. В противном случае версия записи Original обновляется версией Current, а состояние записи становится равным Unchanged.
НА ЗАМЕТКУ
Поскольку все четыре версии записей возможны далеко не всегда, то можно вызвать метод HasVersion для объекта DataRow, чтобы проверить конкретную версию в текущем состоянии. Методу HasVersion передается значение одного из членов перечисления DataRowVersion, а он возвращает логическое значение, которое указывает, существует ли данная версия.
Наоборот, если запись находится в состоянии Added в момент вызова метода RejectChanges, то запись удаляется из коллекции DataRowCollection. В противном случае версия записи Current обновляется версией Original, а состояние записи становится равным Unchanged.
НА ЗАМЕТКУ
Доступ к версии поля DataRow (при условии, что она существует) можно получить, указывая нужную версию в качестве второго параметра для метода объекта DataRow при явном или неявном вызове этого метода: