Свойство Field2.FieldSize (DAO)
Область применения: Access 2013, Office 2013
Возвращает количество байтов, используемых в базе данных (а не в памяти) объекта Memo или Long Binary Field2 в коллекции Fields объекта Recordset .
Синтаксис
expression . FieldSize
expression — переменная, представляющая объект Field2.
Замечания
Вы можете использовать FieldSize с методами AppendChunk и GetChunk для управления большими полями.
Так как размер поля Long Binary или Memo может превышать 64 КБ, следует присвоить значение, возвращаемое FieldSize , переменной, достаточно большой для хранения переменной Long .
Чтобы определить размер объекта Field2 , отличного от типа Memo и Long Binary, используйте свойство Size .
Если сервер базы данных или драйвер ODBC не поддерживают серверные курсоры.
Если вы используете библиотеку курсоров ODBC (то есть свойство DefaultCursorDriver имеет значение dbUseODBC или dbUseDefault , если сервер не поддерживает серверные курсоры).
Если вы используете запрос без курсоров (то есть свойство DefaultCursorDriver имеет значение dbUseNoCursor).
Свойство FieldSize и функции VBA Len() или LenB() могут возвращать разные значения длины одной строки. Строки хранятся в базе данных Microsoft Access в многобайтовой форме набора символов (MBCS), но предоставляются через VBA в формате Юникода. В результате функция Len() всегда возвращает количество символов, LenB — количество символов X 2 (Юникод использует два байта для каждого символа), но FieldSize вернет некоторое значение, если строка содержит символы MBCS. Например, учитывая строку, состоящую из трех обычных символов и двух символов MBCS, Len() вернет 5, LenB() вернет 10, а FieldSize — 7, сумма 1 для каждого обычного символа и 2 для каждого символа MBCS.
Пример
В этом примере свойство FieldSize используется для перечисления количества байтов, используемых объектами Memo и Long Binary Field в двух разных таблицах.
Sub FieldSizeX()
Dim dbsNorthwind As Database
Dim rstCategories As Recordset
Dim rstEmployees As Recordset
Set dbsNorthwind = OpenDatabase("Northwind.mdb")
Set rstCategories = _
dbsNorthwind.OpenRecordset("Categories", _
dbOpenDynaset)
Set rstEmployees = _
dbsNorthwind.OpenRecordset("Employees", _
dbOpenDynaset)
Debug.Print _
"Field sizes from records in Categories table"
With rstCategories
Debug.Print " CategoryName - " & _
"Description (bytes) - Picture (bytes)"
' Enumerate the Categories Recordset and print the size
' in bytes of the picture field for each record.
Do While Not .EOF
Debug.Print " " & !CategoryName & " - " & _
!Description.FieldSize & " - " & _
!Picture.FieldSize
.MoveNext
Loop
.Close
End With
Debug.Print "Field sizes from records in Employees table"
With rstEmployees
Debug.Print " LastName - Notes (bytes) - " & _
"Photo (bytes)"
' Enumerate the Employees Recordset and print the size
' in bytes of the picture field for each record.
Do While Not .EOF
Debug.Print " " & !LastName & " - " & _
!Notes.FieldSize & " - " & !Photo.FieldSize
.MoveNext
Loop
.Close
End With
dbsNorthwind.Close
End Sub
В этом примере методы AppendChunk и GetChunk используются для заполнения поля объекта OLE данными из другой записи( 32 КБ за раз). В реальном приложении можно использовать подобную процедуру для копирования записи сотрудника (включая фотографию сотрудника) из одного стола в другой. В этом примере запись просто копируется обратно в ту же таблицу. Обратите внимание, что все операции с блоками происходят в одной последовательности AddNew-Update.
Sub AppendChunkX()
Dim dbsNorthwind As Database
Dim rstEmployees As Recordset
Dim rstEmployees2 As Recordset
Set dbsNorthwind = OpenDatabase("Northwind.mdb")
' Open two recordsets from the Employees table.
Set rstEmployees = _
dbsNorthwind.OpenRecordset("Employees", _
dbOpenDynaset)
Set rstEmployees2 = rstEmployees.Clone
' Add a new record to the first Recordset and copy the
' data from a record in the second Recordset.
With rstEmployees
.AddNew
!FirstName = rstEmployees2!FirstName
!LastName = rstEmployees2!LastName
CopyLargeField rstEmployees2!Photo, !Photo
.Update
' Delete new record because this is a demonstration.
.Bookmark = .LastModified
.Delete
.Close
End With
rstEmployees2.Close
dbsNorthwind.Close
End Sub
Function CopyLargeField(fldSource As Field2, _
fldDestination As Field2)
' Set size of chunk in bytes.
Const conChunkSize = 32768
Dim lngOffset As Long
Dim lngTotalSize As Long
Dim strChunk As String
' Copy the photo from one Recordset to the other in 32K
' chunks until the entire field is copied.
lngTotalSize = fldSource.FieldSize
Do While lngOffset < lngTotalSize
strChunk = fldSource.GetChunk(lngOffset, conChunkSize)
fldDestination.AppendChunk strChunk
lngOffset = lngOffset + conChunkSize
Loop
End Function