Шаг 120 - Метод FillCache

Описание
Заполняет частично или полностью локальный буфер объекта Recordset, содержащего данные из источника данных ODBC, подключенного к ядру Microsoft Jet (только для баз данных ODBC, подключенных к Microsoft Jet).

наборЗаписей.FillCache строки, начало

Параметры
наборЗаписей
Объектная переменная, представляющая объект Recordset, созданный на основе источника данных ODBC, такого как объект TableDef, представляющий присоединенную таблицу или объект QueryDef, созданный на основе такого объекта TableDef.
строки
Необязательный. Выражение или переменная типа Variant (подтип Integer), указывающая число строк, которые следует поместить в локальный буфер. Если данный аргумент опущен, то число заполняемых строк будет определяться значением свойства CacheSize.
начало Необязательный. Выражение или переменная типа Variant (подтип String), определяющая закладку. Заполнение буфера начнется с записи, на которую указывает закладка. Если значение данного аргумента не задано, то по умолчанию заполнение начнется с записи, определяемой значением свойства CacheStart.

Замечания
Использование буферов повышает быстродействие приложения, в котором данные загружаются с удаленного сервера. Локальный буфер представляет собой область памяти, в которой содержатся данные, полученные с сервера во время последних обращений. Буфер обеспечивает возможность повторного обращения к помещенным в него данным во время выполнения приложения. При поступлении требования на определенные данные ядро базы данных Microsoft Jet сначала проверяет, не содержатся ли запрошенные данные в локальном буфере, прежде чем запросить данные с сервера. На последнюю операцию уходит намного больше времени. Данные, которые поступают из источника данных, не являющегося источником ODBC, в локальном буфере не сохраняются.
Вместо того чтобы ожидать заполнения буфера записями по мере обращения к серверу, можно явно заполнить локальный буфер в любой момент с помощью метода FillCache. Данный метод заполнения буфера является более быстрым, поскольку метод FillCache запрашивает с сервера сразу несколько записей, а не по одной записи за обращение. Например, пока на экран выводится определенная порция данных, можно вызвать в приложении метод FillCache для получения с сервера следующей порции данных.
Создание локального буфера допускается для объекта Recordset при подключении ядра Microsoft Jet к любому источнику данных ODBC. Для создания локального буфера следует открыть объект Recordset на основе удаленного источника данных, а затем задать значения свойств CacheSize и CacheStart объекта Recordset.
Если аргументы строки и начало задают диапазон записей, который частично или полностью выходит за пределы области, определяемой с помощью свойств CacheSize и CacheStart, то часть набораЗаписей, находящаяся вне заданной области, игнорируется и не загружается в локальный буфер.
Если метод FillCache запрашивает больше записей, чем остается в удаленном источнике данных, то в локальный буфер передаются только остающиеся записи; ошибка при этом не возникает.
Полученные из локального буфера записи не отражают изменений, внесенных другими пользователями в записи источника данных после заполнения буфера.
Метод FillCache помещает в буфер только записи, которые еще не содержатся в буфере. Для принудительного обновления всего содержимого буфера следует присвоить значение 0 свойству CacheSize объекта Recordset, после чего задать первоначальное значение размера буфера и вызвать метод FillCache.

Пример
В данном примере методы CreateTableDef и FillCache и свойства CacheSize, CacheStart и SourceTableName используются, чтобы дважды перебрать все записи в присоединенной таблице, первый раз без временного буфера и второй с временным буфером на 50 записей. Далее выводятся статистические данные о выполнении этой операции с временным буфером и без него.

Sub ClientServerX3()

	Dim dbsCurrent As Database
	Dim tdfRoyalties As TableDef
	Dim rstRemote As Recordset
	Dim sngStart As Single
	Dim sngEnd As Single
	Dim sngNoCache As Single
	Dim sngCache As Single
	Dim intLoop As Integer
	Dim strTemp As String
	Dim intRecords As Integer

	' Открывает базу данных, в которую будет добавлена
	' присоединенная таблица.
	Set dbsCurrent = OpenDatabase("DB1.mdb")
	' Создает таблицу, присоединенную к базе данных
	' Microsoft SQL Server.
	Set tdfRoyalties = dbsCurrent.CreateTableDef("Отчисления")
	tdfRoyalties.Connect = 	"ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers"
	tdfRoyalties.SourceTableName = "roysched"
	dbsCurrent.TableDefs.Append tdfRoyalties
	Set rstRemote = dbsCurrent.OpenRecordset("Отчисления")
	With rstRemote
		' Дважды перебирает записи в объекте Recordset
		' и определяет затраченное время.
		sngStart = Timer
		For intLoop = 1 To 2
			.MoveFirst
			Do While Not .EOF
				' Выполняет простую операцию 
				' для проверки быстродействия.
				strTemp = !title_id
				.MoveNext
			Loop
		Next intLoop
		sngEnd = Timer
		sngNoCache = sngEnd - sngStart
		' Помещает в буфер первые 50 записей.
		.MoveFirst
		.CacheSize = 50
		.FillCache
		sngStart = Timer
		' Дважды перебирает записи в объекте Recordset
		' и определяет затраченное время.
		For intLoop = 1 To 2
			intRecords = 0
			.MoveFirst
			Do While Not .EOF
				' Выполняет простую операцию 
				' для проверки быстродействия.
				strTemp = !title_id
				' Подсчитывает записи. Если достигнут конец
				' буфера, то в буфер помещаются
				' следующие 50 записей.
				intRecords = intRecords + 1
				.MoveNext
				If intRecords Mod 50 = 0 Then
					.CacheStart = .Bookmark
					.FillCache

				End If
			Loop
		Next intLoop
		sngEnd = Timer
		sngCache = sngEnd - sngStart
		' Выводит результаты.
		MsgBox "Сравнение результатов:" & vbCr & "    Без буфера: " & Format(sngNoCache, _
			"##0.000") & " секунд" & vbCr & "    С буфером на 50 записей: " & Format(sngCache, _
			"##0.000") & " секунд"
		.Close
	End With

	' Удаляет присоединенную таблицу, созданную для демонстрации.
	dbsCurrent.TableDefs.Delete tdfRoyalties.Name
dbsCurrent.Close
End Sub

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 23.03.2002