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

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

Другие объекты модели ADO

Свойства, методы и события основных объектов ADO - Connection, Command, Recordset, Error уже рассмотрены. В примерах появлялись и другие объекты - Field, Parameter, Property и их коллекции. Рассмотрим свойства и методы этих и других объектов ADO, но уже с меньшей степенью детализации.

Объект Record

Этот объект представляет отдельную запись набора Recordset. Поскольку, однако, объект Recordset не имеет свойства Records, возвращающее коллекцию записей, ни свойства Item, возвращающего отдельную запись, то явным способом получить этот объект из набора записей не удается. Некоторые Провайдеры возвращают объект Record в тех случаях, когда в результате запроса результатом является объект Recordset, состоящий из одной записи. Обычно создается этот объект методом Open, имеющим привычный для объектов ADO синтаксис:

Sub Open([Source], [ActiveConnection], [Mode As ConnectModeEnum], [CreateOptions As 
RecordCreateOptionsEnum = adFailIfNotExists], [Options As RecordOpenOptionsEnum = 
adOpenRecordUnspecified], [UserName As String], [Password As String])

При открытии задается источник данных, соединение, устанавливаются параметры открытия и при необходимости задаются имя пользователя и пароль доступа к данным. Заметьте, источники могут быть различных типов. Объект Record хотя и подобен набору записей, состоящему из одной записи, но имеет все-таки отличающийся набор свойств и методов. Этот объект часто используют при доставке данных из Интернета, поскольку его значениями могут быть файл или каталог. Некоторые Провайдеры поддерживают объекты Record и Stream как альтернативу объекту Recordset или как дополнительные объекты, позволяющие манипулировать данными, поступающими от Провайдеров. В роли Провайдера часто выступает Microsoft OLE DB Provider for Internet Publishing. Этот Провайдер позволяет использовать объект Record для управления данными, такими как каталоги и папки файловой системы, а также сообщениями в системе электронной почты. Источником данных в этом случае выступает абсолютный или относительный адрес URL, сочетаемый с объектом Connection.

Этот объект с успехом может использоваться при работе с данными, имеющими иерархическую структуру. С одной стороны его родителем может быть объект Recordset. С другой стороны, объект Recordset может быть его потомком, поскольку метод GetChildren объекта Record возвращает в качестве результата объект Recordset. Чуть позже я приведу пример такого взаимодействия этих двух объектов.

Большая часть свойств объекта Record совпадает со свойствами объекта Recordset. К таковым относятся свойства: ActiveConnection, Source, Fields, Properties, State. То, что эти два объекта имеют свойство Fields, возвращающее коллекцию полей записей, более всего роднит эти объекты. Еще одно свойство Mode, имеющее значениями константы из перечисления ConnectModeEnum, является общим с объектом Connection. Особых свойств у этого объекта два:

  • RecordType задает тип объекта, его значениями являются константы из перечисления RecordTypeEnum: adCollectionRecord, adSimpleRecord, adStructDoc, имена которых достаточно точно отражают смысл типа объекта.
  • ParentURL определяет URL-адрес родителя объекта Record.

Методов у объекта Record немного. О центральном методе Open, позволяющем создать объект я уже сказал. Кроме этого есть типичные для всех объектов методы Close и Cancel. Три метода CopyRecord, MoveRecord и DeleteRecord выполняют типичные операции над этим объектом. О специфическом методе GetChildren скажу чуть подробнее. Его синтаксис:

Function GetChildren() As Recordset

Записи возвращаемого объекта Recordset являются потомками текущего объекта Record. Например, потомками объекта Record, представляющего собой каталог, могут быть файлы и подкаталоги, содержащиеся внутри родительского каталога.

Рассмотрим теперь пример, в котором в роли Провайдера выступает Internet Publishing Provider, а участниками будут объекты Record, Recordset и Stream. Я поочередно создам два объекта Record, в первый раз для чтения текстового файла и передачи этих данных объекту Stream. Во втором случае объект Record будет представлять каталог, а созданный на его основе объект Recordset будет содержать имена файлов этого каталога. Вот процедура, решающая эту задачу:

Public Sub CreateRecord()
	'Создание и работа с объектом Record
	Dim FirstRec As New Record
	Dim fld As Field
	Dim strText As String
	'Create Connection with Internet Publishing Provider
	If Con1.State = adStateOpen Then Con1.Close	'закрыть соединение
	Con1.Open "Provider = MSDAIPP.DSO; " & _
		"Data Source = http://serverva/proba2_2/testtext.txt"
	'Объекту Record передается текстовый файл
	FirstRec.Open ActiveConnection:=Con1
		'Поля объекта Record
		Debug.Print "Число полей:", FirstRec.Fields.Count
		For Each fld In FirstRec.Fields
			Debug.Print "Имя поля: ", fld.Name, _
			 "Значение поля:", fld.Value, "Тип:", fld.Type
		Next fld
		
	'Создание объекта Stream на основе объекта Record
	If Strm1.State = adStateOpen Then Strm1.Close
	Strm1.Open Source:=FirstRec, Mode:=adModeRead, _
				Options:=adOpenStreamFromRecord
	strText = Strm1.ReadText(100)
	Debug.Print "Текстовый файл:", strText
	Con1.Close
	'Новое соединение и открытие объекта Record
	'Объекту Record передается каталог
	Con1.Open "Provider = MSDAIPP.DSO; " & _
		"Data Source = http://serverva/"
	FirstRec.Open ActiveConnection:=Con1, _
				Options:=adOpenSource, Mode:=adModeRead
	 'Поля объекта Record
		Debug.Print "Число полей:", FirstRec.Fields.Count
		For Each fld In FirstRec.Fields
			Debug.Print "Имя поля: ", fld.Name, _
			 "Значение поля:", fld.Value, "Тип:", fld.Type
		Next fld
		'Создание объекта Recordset
	Set Rst1 = FirstRec.GetChildren
	Debug.Print Rst1.ActiveConnection
	Debug.Print Rst1.RecordCount
	Rst1.MoveFirst
	Do While Not Rst1.EOF
			'Обработка текущей записи
		Debug.Print Rst1(2).Name, Rst1(2).Value
		Rst1.MoveNext
	Loop
	Con1.Close

End Sub

Приведу комментарии к этой программе:

  • При установлении соединения с Провайдером в качестве источника данных я указал текстовый файл, находящийся в виртуальном каталоге Proba2_2. Этот каталог установлен под Internet Information Server на моем компьютере. Соответствующие строки программного текста подсвечены.
  • Создается объект FirstRec класса Record методом Open, которому в качестве параметра передается имя открытого соединения. В этот момент данные из текстового файла передаются объекту FirstRec.
  • Я не стал выводить информацию о всех свойствах открытого объекта, ограничившись лишь наиболее важным свойством Fields. Полей у этого объекта в данном контексте достаточно много - 26. Приведу имена и значения пяти полей:
    RESOURCE_PARSENAME - testtext.txt 
    RESOURCE_PARENTNAME - http://serverva/proba2_2 
    RESOURCE_ABSOLUTEPARSENAME - http://serverva/proba2_2/testtext.txt
    RESOURCE_ISHIDDEN - False 
    RESOURCE_CONTENTCLASS - text/plain
    В данном контексте большая часть полей, но не все, определяет характеристики ресурса.
  • Поскольку созданный объект FirstRec задает теперь текстовый файл, то он может в свою очередь послужить источником данных для объекта Stream, который создается, как обычно, методом Open.
  • Вызов метода ReadText глобального объекта Strm1 класса Stream позволяет прочесть нужную порцию символов в обычную строку и распечатать ее, что позволяет убедиться в правильности передачи данных.
  • На следующем шаге объект FirstRec закрывается и заново открывается, но теперь у него другой источник данных и его значением становится каталог.
  • Число полей в данном контексте уменьшилось до 18, все они определяют характеристики ресурса. Приведу имена и значения тех же полей в этом новом контексте:
    RESOURCE_PARSENAME - 
    RESOURCE_PARENTNAME - http://serverva
    RESOURCE_ABSOLUTEPARSENAME - http://serverva
    RESOURCE_ISHIDDEN -
    RESOURCE_CONTENTCLASS -
    В сравнении с предыдущим случаем не для всех полей определены значения, в частности не задан класс контента.
  • Данный объект, представляющий каталог, может использоваться для построения объекта Recordset, записи которого будут содержать сведения о подкаталогах и файлах, хранимых в каталоге. Для создания объекта Recordset используется метод GetChildren, вызываемый объектом FirstRec.
  • Для каждой записи из созданного набора я вывожу на печать имя и значение второго поля. Приведу лишь первые пять строчек:
    RESOURCE_ABSOLUTEPARSENAME	http://serverva/_private
    RESOURCE_ABSOLUTEPARSENAME	http://serverva/images
    RESOURCE_ABSOLUTEPARSENAME	http://serverva/win2000.gif
    RESOURCE_ABSOLUTEPARSENAME	http://serverva/web.gif
    RESOURCE_ABSOLUTEPARSENAME	http://serverva/warning.gif

На этом я закончу описание примера, в котором успешно взаимодействовали объекты Record, Stream и Recordset. Знакомство с объектом Stream уже состоялось, но давайте, хотя бы вкратце познакомимся с его свойствами и методами.

Объект Stream

Этот объект представляет двоичный поток данных или текст. Методы и свойства этого объекта позволяют выполнять операции над этим потоком, позволяя читать, писать, копировать и сохранять данные потока. Объекты Stream обычно используются при работе с данными, сохраненными в XML-формате, при работе с текстовыми файлами и сообщениями электронной почты, во всех случаях, когда данные рассматриваются как поток байтов. Объект Stream может быть получен тремя способами:

  • Заданием URL-адреса, указывающего на объект, обычно файл, содержащий двоичные данные или текст. Этот объект может быть простым документом, объектом Record, представляющим структурированный документ, или папкой.
  • Заданием потока, ассоциированного с объектом Record.
  • Быть созданным непосредственно в приложении, не будучи связанным ни с каким источником данных.
Свойства объекта Stream

Объект Stream имеет следующие свойства:

  • Property Charset As String. Строка, задающая множество символов, в которое транслируется данные потока. Свойство имеет смысл только для текстовых файлов, которые по умолчанию должны быть представлены в кодировке Unicode, -значением свойства по умолчанию.
  • Property EOS As Boolean. Аналог свойства EOF для файлов, позволяет проследить за окончанием потока при последовательном чтении его байтов. Принимает значение True, когда свойство Position определяет позицию, лежащую за последним символом потока.
  • Property LineSeparator As LineSeparatorEnum. Константы перечисления задают символы, задающие конец строки в текстовом файле. Возможные значения: adCR, adCRLF, adLF.
  • Property Mode As ConnectModeEnum. Свойство, задающее статус объекта. Им обладают большинство объектов ADO.
  • Property Position As Long. Определяет текущую позицию в потоке. Поскольку над потоком определены операции чтения и записи, то понятно, что должна быть определена текущая позиция (курсор), отмечающая начальную точку при выполнении этих операций.
  • Property Size As Long. Задает размер потока. И позиция и размер потока измеряются в байтах.
  • Property State As ObjectStateEnum. Свойство, задающее состояние объекта. Им обладают большинство объектов ADO.
  • Property Type As StreamTypeEnum. Тип потока задается константой из перечисления. Имеет два возможных значения: adTypeBinary, adTypeText.
Ольга Гафарова
Ольга Гафарова

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

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

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