Описание
Задает или возвращает число записей, загруженных из источника данных ODBC, которых следует поместить в локальный буфер.
Значение
Задаваемое или возвращаемое значение имеет тип данных Long и должно находиться в пределах от 5 до 1200, но не превышать объем доступной памяти. Типичным значением данного свойства является число 100. Значение 0 отключает буфер.
Замечания
Помещение данных в локальный буфер повышает быстродействие при использовании объектов Recordset для загрузки данных с удаленного сервера. Буфером называется область локальной памяти, содержащая данные, которые были получены с сервера во время последних обращений. Данные заносятся в локальный буфер в предположении, что во время выполнения приложения потребуется повторное обращение к этим данным. Во время обращения к данным ядро базы данных Microsoft Jet сначала проверяет наличие данных в локальном буфере вместо обращения к серверу, которое занимает намного больше времени. В локальном буфере сохраняются только данные, поступающие из источника данных ODBC.
Любой источник данных ODBC, подключенный к ядру Microsoft Jet, такой как присоединенная таблица, может иметь собственный локальный буфер. Для создания локального буфера следует открыть объект Recordset на основе удаленного источника данных, задать значения свойств CacheSize и CacheStart, а затем вызвать метод FillCache или осуществить переходы по записям с помощью методов группы Move.
Для источника данных ODBCDirect также поддерживается использование локального буфера. Для создания буфера следует определить свойство CacheSize объекта QueryDef. Для объекта Relation свойство CacheSize доступно только для чтения и определяется значением свойства CacheSize объекта QueryDef. В рабочей области ODBCDirect невозможно использовать свойство CacheStart в методе FillCache.
Выбор значения свойства CacheSize основывается на числе записей, с которыми приложение может работать одновременно. Например, если объект Recordset используется как источник данных для вывода на экран, удобно задать для свойства CacheSize значение 20 для сохранения в буфере 20 одновременно выводимых на экран записей.
Записи, которые помещены в локальный буфер, принимаются ядром базы данных Microsoft Jet непосредственно из буфера, а записи вне этого диапазона загружаются с сервера.
Записи, полученные из локального буфера, не отражают изменений, внесенных в источник данных другими пользователями со времени записи данных в буфер.
Для принудительного обновления содержимого локального буфера следует задать значение 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