Выбрать главу

Итак, прежде всего нужно определить схему (или структуру) всех используемых таблиц. Для этого нужно определить все объекты DataColumn таблицы и указать их свойства, как показано на примере подпрограммы CreateDataSet () в листинге 5.1. 

ЛИСТИНГ 5.1. Код создания Объектов DataSet и DataTable

Private Sub CreateDataSet()

 ' Создание объекта dsEmployeeInfo.

 dsEmployeelnfo = New DataSet()

 ' Создание таблицы Employees.

 Dim dtEmployees As DataTable = New DataTable("Employees")

 dtEmployees.CaseSensitive = False

 dtEmployees.Columns.Add("FirstName", Type.GetType("System.String"))

 dtEmployees.Columns.Add("LastName", Type.GetType("System.String"))

 dtEmployees.Columns.Add("DepartmentID", Type.GetType("System.Int32"))

 ' Вставка таблицы Employees в объект EmployeeInfo.

 dsEmployeeInfo.Tables.Add(dtEmployees)

 ' Создание таблицы Departments с

 ' помощью перегруженной версии конструктора.

 ' Это более длительный способ при создании стандартных полей,

 ' но он позволяет задавать другие свойства полей (например, Readonly & Unique)

 ' до включения поля DataColumn в коллекцию Columns.

 Dim dtDepartments As DataTable

 dtDepartments = New DataTable()

 dtDepartments.TableName = "Departments"

 dtDepartments.MinimumCapacity = 5

 dtDepartments.CaseSensitive = False

 Dim NewColumn As New DataColumn()

 With NewColumn

  .ColumnName = "ID"

  .DataType = Type.GetType("System.Int32")

  .Readonly = True

  .Unique = True

  .AutoIncrement = True

 End With

 dtDepartments.Columns.Add(NewColumn)

 NewColumn = New DataColumn()

 With NewColumn

  .ColumnName = "DepartmentName"

  .DataType = Type.GetType("System.String")

  .Unique = True

  .AllowDBNull = False

 End With

 dtDepartments.Columns.Add(NewColumn)

 ' Включение таблицы Departments в объект dsEmployeeInfo.

 dsEmployeeInfo.Tables.Add(dtDepartments)

End Sub

После создания экземпляра dsEmployeeInfo объекта DataSet создается таблица Employees с помощью перегруженных конструкторов объекта DataTable с использованием параметра – имени таблицы. Затем задается значение False для свойства CaseSensitivity объекта DataTable. Это свойство определяет, будут ли операции сортировки, поиска и фильтрации выполняться с учетом регистра символов. По умолчанию значение этого свойства определяется как значение свойства CaseSensitivity родительского объекта DataSet или принимается равным False, если объект DataTable создан независимо от объекта DataSet.

НА ЗАМЕТКУ

Свойство CaseSensitivity применяется только для данных объекта DataTable и не влияет на имена самих объектов DataTable. Например, объект DataSet может  иметь две таблицы (или отношения) с именами или mytable или Mytable. Для работы с ними нужно записывать имена с точным указанием регистра символов, поскольку их поиск ведется с учетом регистра (case-sensitive search). Однако это не обязательно при наличии только одной таблицы с таким именем, поскольку при этом используется поиск без учета регистра (case-insensitive search).

Затем создаются определения полей с помощью метода Add объекта Column по указанному имени поля и типу данных. Учтите, что здесь указываются .NET-совместимые типы данных, а не используемые в базе данных типы. При отсутствии типа данных для него по умолчанию принимается строковый тип. Наконец, таблица Employee включается в объект dsEmployeeInfo.

Далее этот процесс повторяется для таблицы Departments, но теперь уже с перегруженными конструкторами и функциями. Таким образом та же цель достигается другим способом. Разработчик может самостоятельно выбрать наиболее подходящий способ на основе собственного вкуса, корпоративных стандартов или особенностей поставленной задачи.

Для свойства MinimumCapacity объекта dtDepartments задается значение 5, т.е. экземпляр объекта DataTable создается уже с пятью записями. Указание для него другого значения (отличного от используемого по умолчанию значения 25) позволяет управлять выделением ресурсов и оптимизировать производительность в критических ситуациях. Конечно, на самом деле эти пять записей фактически появятся только после того, как пользователь добавит их в таблицу DataTable, а пока для них резервируется место.

Кроме того, перед добавлением полей в коллекцию Columns для них задаются значения других свойств. Перечисленные ниже свойства Readonly, Unique, AllowDBNull и AutoIncrement уже наверняка знакомы тем, кто имеет опыт создания приложений для работы с базами данных.

Присвоение свойству Readonly значения True указывает на то, что значение поля нельзя изменить.

Присвоение свойству Unique значения True указывает на то, что значения данного поля во всех записях таблицы должны быть уникальными. Это свойство реализуется с помощью автоматического создания ограничения UniqueConstraint для данного поля. Этот способ более подробно рассматривается в разделе об ограничениях таблицы далее в главе.