Тверской государственный университет
Опубликован: 13.09.2006 | Доступ: свободный | Студентов: 5133 / 388 | Оценка: 4.23 / 3.83 | Длительность: 28:12:00
Специальности: Программист, Менеджер
Лекция 6:

Объекты ADO (продолжение)

Объект Table

Этот объект определяет таблицу базы данных. Является элементом коллекции Tables, вложенной в объект Catalog. Создается конструктором New и добавляется в коллекцию Tables методом Append. Вот типичная схема программного создания новой таблицы:

Dim NewTable As New ADOX.Table
'Формирование объекта Table
…
Call Cat1.Tables.Append(NewTable)

Чуть позже я приведу полный пример программного создания объекта Table, а пока займемся рассмотрением его свойств, методов и событий. Задача облегчается тем, что у объекта Table нет методов и событий, - есть только свойства, рассмотрением которых сейчас и займемся.

Свойства объекта Table

Свойства объекта позволяют определить новую таблицу или модифицировать уже существующую. Свойств у объекта сравнительно немного. Вот они:

  • Три основных свойства: Columns, Keys и Indexes возвращают одноименные коллекции, которые и задают основные элементы таблицы - ее поля, ключи и индексы. Все три коллекции имеют одинаковый и уже описанный набор из трех методов: Append, Delete, Refresh и двух свойств - Item и Count. Создаются элементы коллекций конструктором New, а добавляются в коллекцию методом Append, в полном соответствии с выше приведенной схемой для объекта Table.
  • Property DateCreated As Variant, Property DateModified As Variant. Свойства имеют статус только для чтения и возвращают дату создания и дату последней модификации таблицы.
  • Property Name As String. Задает имя таблицы.
  • Property ParentCatalog As Catalog. Задает родительский каталог, - объект, метод Create которого создал базу данных, которой и принадлежит таблица.
  • Property Properties As Properties. Возвращает коллекцию свойств, стандартную для многих объектов ADO.
  • Property Type As String. Свойство задает тип, но не, как обычно, константой, а строкой, значения которой могут быть, например, "TABLE", "SYSTEM TABLE" или "GLOBAL TEMPORARY".

Таким образом, для создания таблицы или ее модификации приходится, главным образом, работать с объектами Column, Key, Index и их коллекциями. Рассмотрим устройство этих объектов.

Объект Column

Коллекция Columns с элементами Column возвращается при вызове одноименного свойства объекта Table, в этом случае она задает поля таблицы. Но эта коллекция появляется и в других случаях. Напомню, ключи и индексы таблицы могут быть составными и состоять из нескольких полей, по этой причине объекты Key и Index также обладают свойством Columns, которое возвращает коллекции полей, задающих составной ключ или составной индекс. Так что объект Column может задавать поле таблицы, ключа или индекса. Этот объект является центральным объектом в мире, связанном с таблицами. Устроен он достаточно просто, у него нет ни методов, ни событий, - есть только свойства.

Свойства объекта Column

Свойства этого объекта определяют различные характеристики поля, включенного в таблицу:

  • Property Name As String. Задает имя поля.
  • Property Type As DataTypeEnum. Задает тип поля. Возможные значения определяются константами из уже упоминавшегося перечисления DataTypeEnum.
  • Property DefinedSize As Long. Задает определяемый размер поля. Заметьте, фактический размер может быть меньше и зависит от значения, хранимого в поле.
  • Property Precision As Long, Property NumericScale As Byte. Эти два свойства определены только для полей, хранящих числовые значения. Они определяют общее число хранимых цифр и число цифр после запятой.
  • Property SortOrder As SortOrderEnum. Записи в таблице могут быть упорядочены по тому или иному полю. Данное свойство определяет порядок сортировки, - по возрастанию или убыванию, что задается его возможными значениями: adSortAscending, adSortDescending. Свойство применимо только для индексируемых полей.
  • Property ParentCatalog As Catalog. Свойство задает родительский каталог, позволяя подняться при необходимости к корневому объекту ADOX. Включение корневого объекта в объекты нижних уровней типично для объектных моделей, используемых Microsoft. Такое включение облегчает программистам работу, упрощая навигацию между объектами.
  • Property RelatedColumn As String. Это свойство применимо только для ключевых полей, оно указывает имя поля, являющегося внешним ключом в связываемой таблице. Для уже присоединенных полей к коллекции Columns свойство имеет статус "только для чтения".
  • Property Attributes As ColumnAttributesEnum. Как и для других объектов ADO, обладающих подобным свойством, данное свойство задает набор дополнительных атрибутов объекта. Значение свойства представляет маску, каждый бит которой определяет, включен или выключен тот или иной атрибут. Возможных атрибутов, которые можно установить, всего два - adColFixed и adColNullable. Они указывают, имеет ли поле фиксированную длину и может ли использоваться значение Null. Значение этого свойства, принимаемое по умолчанию и равное 0, означает, что упомянутые атрибуты не включены.
  • Property Properties As Properties. Задает коллекцию свойств, зависящих от Провайдера.

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

Объект Key

Напомню, ключом таблицы называется совокупность полей, однозначно идентифицирующая каждую запись таблицы. Если для идентификации записи требуется несколько полей, то такой ключ называется составным. Среди возможных ключей выделяется один, называемый первичным ключом (primary key). Access при построении таблицы, если не задается ее ключ, предлагает включить в число полей специальное поле типа "Счетчик". Это поле объявляется ключевым, а его значения строятся автоматически, чаще всего путем увеличения предыдущего значения счетчика на 1 при каждом добавлении новой записи, что и обеспечивает уникальность значений ключа. Однако, заметьте, среди типов полей, задаваемых перечислением DataTypeEnum, значения, соответствующего полю "Счетчик", нет.

Таблицы в реляционных базах данных связываются между собой, за счет того, что они имеют общие ключевые поля. Поле в связанной таблице называется внешним ключом, если это поле является частью ключа другой таблицы. Таблица с первичным ключом называется основной или базисной, а таблица, содержащая внешний ключ, связанной или связующей. В предыдущих версиях Access все таблицы обязаны были иметь первичный ключ. В Access 2000 связующие таблицы могут и не иметь первичного ключа. Разумно, однако, задавать ключи для всех таблиц базы данных. Ключ, который не является первичным, имеет статус "уникальный" (Unique).

Объект Key представляет первичный, внешний или уникальный ключ. Создается объект конструктором New, а добавляется в коллекцию методом Append, в соответствии с приведенной выше схемой. С объектной точки зрения объект Key устроен достаточно просто. Также как и многие другие объекты ADOX, он не имеет ни событий, ни методов, - только свойства. Их немного, - всего 6. Вот их описание:

  • Property Name As String. Задает имя ключа.
  • Property Type As KeyTypeEnum. Задает тип ключа. Возможные значения задаются константами перечисления: adKeyPrimary, adKeyForeign, adKeyUnique, определяющими, соответственно, первичный, внешний и уникальный ключ.
  • Property Columns As Columns. Возвращает коллекцию полей для составного ключа.
  • Property DeleteRule As RuleEnum, Property UpdateRule As RuleEnum. Эти два свойства определяют правила (процедуры), выполняемые при удалении или изменении первичного ключа.
  • Property RelatedTable As String. Задает таблицу, которой принадлежит ключ, что позволяет подняться по иерархии объектов.

Объект Index

Если таблица имеет первичный ключ, то она имеет и индекс, который автоматически создается по данному ключу. Однако индексы могут создаваться и независимо от создания ключевых полей. На индексы не накладывается жесткое условие уникальности значений индекса в таблице. Индексы служат для того, чтобы ускорить операции по поиску и сортировке данных таблицы. Платой за это является увеличение памяти, требуемой для индексов и увеличение времени, требуемое на перестроение индексов, когда записи в таблицу добавляются или удаляются. Для больших, редко обновляемых таблиц, к которым часто приходится обращаться для поиска данных, построение индексов может существенно ускорить работу с базой данных. Для больших, часто обновляемых таблиц задание индексов может приводить к потере эффективности. Поэтому разумное введение индексов требует, как правило, проведения специальных исследований и опыта работы у администратора базы данных.

Объект Index задает индекс таблицы. Он создается с использованием конструктора New и добавляется в коллекцию Indexes методом Append, в соответствии с ранее приведенной схемой. Как и объекты Table и Key он имеет только свойства. Рассмотрим их:

  • Property Name As String. Свойство по умолчанию, задает имя индекса.
  • Property PrimaryKey As Boolean, Property Unique As Boolean, Property Clustered As Boolean. Булевы свойства, позволяющие определить, является ли индекс первичным ключом, возможным ключом с неповторяющимися значениями индекса, составным индексом, состоящим из нескольких полей.
  • Property Columns As Columns. Для составного индекса возвращает коллекцию полей, входящих в индекс.
  • Property IndexNulls As AllowNullsEnum. Позволяет указать, как обрабатываются значения Null, если они встречаются в поле индекса.
  • Property Properties As Properties. Возвращает коллекцию свойств, специфических для используемого Провайдера.

Несколько примеров программной работы с таблицами

Пора привести пример программного создания таблицы и работы с объектами, связанными с таблицами базы данных. В предыдущих примерах уже была создана программно база данных с именем NewDB. Рассмотрим еще одну процедуру из модуля "TestingADOX", в которой в эту базу данных будет добавлена таблица "Книги", уже появлявшаяся в наших примерах. Но теперь создадим эту таблицу программно, используя возможности объектов ADOX. Вот текст процедуры, решающей эту задачу:

Public Sub CreateTable()
	'Создание таблицы "Книги" и присоединение ее к базе данных NewDB
	'Создание объектов - таблицы, ее полей и ключа
	Dim myT As New ADOX.Table	'таблица
	Dim myC(1 To 6) As New ADOX.Column	'поля таблицы
	Dim myK As New ADOX.Key	 'ключ таблицы
	'Установить соединение с базой NewDB
	CreateConnection
	Cat1.ActiveConnection = Con1
	'Создание объекта Table
	'Создание полей таблицы
	myC(1).ParentCatalog = Cat1
	myC(1).Name = "Код_книги"
	myC(1).Type = adInteger
	Call myT.Columns.Append(myC(1))
	
	
	myC(2).ParentCatalog = Cat1
	myC(2).Name = "Автор"
	Call myT.Columns.Append(myC(2))
	
	myC(3).ParentCatalog = Cat1
	myC(3).Name = "Название_книги"
	Call myT.Columns.Append(myC(3))
	
	myC(4).ParentCatalog = Cat1
	myC(4).Name = "Год_издания"
	Call myT.Columns.Append(myC(4))
	
	myC(5).ParentCatalog = Cat1
	myC(5).Name = "Число_страниц"
	myC(5).Type = adSmallInt
	Call myT.Columns.Append(myC(5))
	
	myC(6).ParentCatalog = Cat1
	myC(6).Name = "Цена"
	myC(6).Type = adCurrency
	Call myT.Columns.Append(myC(6))
	
	'Создание ключа
	myK.Columns.Append (myC(1))
	myK.RelatedTable = "myT"
	myK.Type = adKeyPrimary
	myK.Name = "Код_книги"
	Call myT.Keys.Append(myK)
	
	'Присоединение таблицы
	myT.Name = "Книги"
	Call Cat1.Tables.Append(myT)
End Sub

А теперь комментарии к этой процедуре:

  • В процедуре создаются, формируются, а затем добавляются к соответствующей коллекции объекты Table, Column и Key. Работа с ними ведется в полном соответствии со схемой, которую я приводил выше. Заметьте, я ввел массив объектов Column, число элементов которого определяется по числу полей, добавляемых в таблицу.
  • Для каждого поля таблицы я задавал лишь три свойства - имя, тип и ссылку на родительский каталог, оставляя значения остальных полей те, которые приняты по умолчанию. Для текстовых полей я не указывал и тип поля, поскольку это тип, принятый по умолчанию.
  • Замечу, что мои попытки указать тип поля в методе Append в момент присоединения поля к коллекции не увенчались успехом в данном контексте. В этом случае все поля создаваемой таблицы в Access имели один и тот же текстовый тип.
  • При формировании ключа - объекта myK я добавил к его коллекции Columns ключевое поле - уже созданный объект myC(1). Заметьте, добавление в коллекцию Columns объекта Key возможно только после того, как объект добавлен в коллекцию Columns объекта Table.
  • Далее для ключа были заданы его имя, тип и ссылка на родительский объект - таблицу myT, после чего мне осталось только присоединить объект к коллекции Keys.
  • Последним шагом было присоединение таблицы с именем "Книги", чьи свойства Tables и Keys уже сформированы, к коллекции Tables объекта Catalog, для которого установлено соединение с ранее созданной базой данных Access с именем NewDB.
Добавление индексов

В следующем примере в таблицу "Книги" я добавляю два индекса, один из них связан с полем "Автор", другой - "Название_книги". Приведу процедуру, решающую задачу:

Public Sub AddIndex()
	'Процедура добавляет индексы в таблицу "Книги"
	Dim myT As ADOX.Table	'таблица
	Dim myC1 As Column, myC2 As Column	'поля таблицы
	Dim myInd1 As New Index, myInd2 As New Index	'индексы таблицы
	'Установить соединение с базой NewDB
	CreateConnection
	Cat1.ActiveConnection = Con1
	'Связывание объекта Table с таблицей "Книги"
	Set myT = Cat1.Tables("Книги")
	Set myC1 = myT.Columns("Автор")
	Set myC2 = myT.Columns("Название_книги")
	'Формирование индексов
	myInd1.Columns.Append (myC1)
	myInd1.Name = "Author"
	myInd1.PrimaryKey = False
	myInd1.Unique = False
	myInd1.Clustered = False
	
	myInd2.Columns.Append (myC2)
	myInd2.Name = "Book"
	myInd2.PrimaryKey = False
	myInd2.Unique = False
	myInd2.Clustered = False
	
	'Добавление индексов
	Call myT.Indexes.Append(myInd1)
	Call myT.Indexes.Append(myInd2)
	'Отладочная печать
	Debug.Print "Число индексов =", myT.Indexes.Count
	For Each myInd1 In myT.Indexes
		Debug.Print "Имя индекса -", myInd1.Name
	Next myInd1
	
End Sub

Результаты отладочной печати для нее следующие:

Число индексов =   3 
Имя индекса - Код_книги
Имя индекса - Author
Имя индекса - Book

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

Думаю, что в особых комментариях данная процедура не нуждается, поскольку работа с индексами ведется по той же схеме, что и при работе с ключами таблицы. Чтобы убедиться, что все работает должным образом, взгляните, как выглядит таблица "Книги", открытая в режиме конструктора:

Программно созданная таблица "Книги"

Рис. 6.9. Программно созданная таблица "Книги"
Ольга Гафарова
Ольга Гафарова

Добрый день. Подскажите формулы при решении задачи на рис. 2.2 в лекции №2. Закон Ома, какие должны использоваться формулы для I и R

Курс: Основы офисного программирования и документы Excel

Серегй Лушников
Серегй Лушников