Поделиться через


Свойство 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