Semenalidery.com

IT Новости из мира ПК
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Двоичные данные access

Двоичные данные access

Помогите пожалуйста, уже целый день промучался.
В Access надо использовать двоичные данные, поскольку тип BINARY отсутствует приходится использовать тип «Поле объекта OLE».

Когда пытаюсь запихнуть файл:

Насколько я понимаю ето из-за несоответствия типов OLE и LONGVARCHAR. Перепробывал уже все варианты типов данных, нечиго не помогает.

И есть ещё одна фигня. Когда запихиваю с типом SQL_CHAR(в котором нельзя использовать большое количество данных):

а затем достаю по частям:

то между символами вставляет нулевые значения. То есть в файл вместо последовательности:

Здравствуйте, morden, Вы писали:

M>[/ccode]
M>то между символами вставляет нулевые значения. То есть в файл вместо последовательности:
M>
M>записывается:
M>

Как все запущено. Тебе знакомо такое: Unicode. Более того, это нативный формат представления текстовых строк в виндах начиная с NT 4. В уникоде каждый символ не однобайтовый, а двухбайтовый.

Здравствуйте, _d_m_, Вы писали:

___>Как все запущено. Тебе знакомо такое: Unicode. Более того, это нативный формат представления текстовых строк в виндах начиная с NT 4. В уникоде каждый символ не однобайтовый, а двухбайтовый.

Вообщето я работаю не с Юникодом, а с однобыйтовыми символами.

Насколько мне известно тип SQL_C_CHAR соответствует типу, точнее массиву символов, char* а не wchar_t в Си, а SQL_CHAR типу CHAR в SQL, если я не ошибаюсь. Или оно под CHAR в SQL, в Access, подразумивает Unicode?

Здравствуйте, morden, Вы писали:

M>Здравствуйте, _d_m_, Вы писали:

___>>Как все запущено. Тебе знакомо такое: Unicode. Более того, это нативный формат представления текстовых строк в виндах начиная с NT 4. В уникоде каждый символ не однобайтовый, а двухбайтовый.

M>Вообщето я работаю не с Юникодом, а с однобыйтовыми символами.

M>Насколько мне известно тип SQL_C_CHAR соответствует типу, точнее массиву символов, char* а не wchar_t в Си, а SQL_CHAR типу CHAR в SQL, если я не ошибаюсь. Или оно под CHAR в SQL, в Access, подразумивает Unicode?

С акцессом тебе не подскажу — не имел дела.

M>>Насколько мне известно тип SQL_C_CHAR соответствует типу, точнее массиву символов, char* а не wchar_t в Си, а SQL_CHAR типу CHAR в SQL, если я не ошибаюсь. Или оно под CHAR в SQL, в Access, подразумивает Unicode?

___>С акцессом тебе не подскажу — не имел дела.

Access хранит любые текстовые данные в юникоде — ничего не попишешь.

В полях, имеющих по определению тип TEXT (он же MEMO) или CHAR (он же TEXT(n) с указанной длиной), знаки хранятся в формате представления знаков Unicode. Каждый знак в формате Юникод всегда кодируется с помощью двух байтов. Для существующих баз данных Microsoft Jet, содержащих в основном символьные данные, это может означать увеличение размера файла базы данных примерно в два раза после преобразования в формат Microsoft Jet версии 4.0. Тем не менее, для многих наборов символов, ранее обозначавшихся как однобайтовые наборы символов (SBCS), представление в формате Unicode может быть без труда сжато до одного байта. Более подробные сведения содержатся в разделе CREATE TABLE. Если столбец CHAR был определен с атрибутом COMPRESSION, то при сохранении в нем данных осуществляется их автоматическое сжатие, а при извлечении данных — обратная операция.

5 . Типы данных и таблицы

Встроенные типы данных Microsoft Access и SQL Server, числовые, текстовые, даты/времени, логический, двоичные, счетчик, уникальный идентификатор

В реляционной базе данных информация хранится в таблицах. Самое важное при создании базы данных — правильно спроектировать и реализовать систему таблиц, а при работе с имеющейся базой данных — разобраться, какая информация находится в столбцах таблиц.

5.1 Встроенные типы данных в SQL Server и Access

Прежде, чем создавать таблицы, необходимо разобраться с типами данных — то есть какие именно данные можно будет помещать в столбцы таблиц. Информация будет даваться для SQL Server и Access.

Вначале — о числовых типах данных.

В SQL Server числовые типы данных можно разделить на целочисленные, десятичные дроби и числа с плавающей запятой. В нашем распоряжении следующие числовые типы данных:

· целочисленные: tinyint (0 — 255), smallint (от -32 768 до 32 767), int (от -2,147,483,648 до 2,147,483,647) и bigint (от -2^63 до 2^63 -1);

· десятичные: decimal и numeric (это — два названия одного и того же);

· денежные: money (от -2^63 до 2^63 — 1 с точностью 4 знака после запятой) и smallmoney (от -214,748.3648 до +214,748.3647).;

· с плавающей запятой: float (от -1.79E + 308 до 1.79E + 308) и real (от -3.40E + 38 до 3.40E + 38).

В MS Access все проще — там есть единственный тип поля — числовое и его подтипы в строке «размер».

Обычно, если база данных не относится к числу специальных, большая часть столбцов в ее таблицах отводится под текстовые данные. В SQL Server предусмотрены две дублирующих разновидности полей для представления текстовых данных: поля Unicode и не-Unicode. Unicode — типы данных отличить очень просто: они начинаются на n (от слова national, то есть с поддержкой национальных символов). Если есть возможность, то следует выбирать именно типы Unicode (хоть они и требуют в два раза больше места под хранение каждого символа) — поскольку современные клиенты изначально разрабатываются для удобной работы с кодировками этого типа.

Всего в SQL Server предусмотрены следующие типы для текстовых данных:

· char / nchar — строковые данные фиксированной длины (максимум 8000/4000 символов);

· varchar / nvarchar — строковые данные переменной длины (то же самое);

· text / ntext — для очень больших текстовых записей — до двух миллионов/миллиона символов.

Читать еще:  25 ти значный ключ офис 2020

В Access, как обычно, все проще. Есть тип данных текстовый с максимальной длинной записей в 255 символов (данные автоматически хранятся в Unicode) и тип данных Memo с максимальной длиной 65 536 знаков.

В реальных базах данных, конечно, не обойтись без полей для хранения информации дате и времени. В SQL Server это datetime (8 байт, точность то 3,33 миллисекунд) и smalldatetime (4 байта, точность до минуты). В большинстве приложений вполне хватает s malldatetime , но часто разработчики про s malldatetime забывают.

В Access у нас предусмотрен единственный 8-байтовый тип данных дата/время.

Еще один распространенный тип данных — это логический, который может хранить в себе значения вида true/false (единица/ноль). Обычно он используется как флаг чего-либо. В SQL Server он представлен типом данных bit , а в Access — типом данных, который так и называется «логический».

В современных базах данных также часто хранятся большие двоичные данные — BLOB, например, документы, фотографии, архивы и т.п. В SQL Server для них традиционно используется тип данных Image (до 2 Гбайт). Есть еще типы данных binary и varbinary , но максимальный их размер — 8000 байт, а такие маленькие двоичные данные встречаются нечасто. В Acce ss для этой цели используется тип данных поле объекта OLE (до 1 Гбайт) — то есть могут храниться данные только OLE-совместимых программ.

Есть также и некоторые специальные типы данных, которые используются нечасто:

· UniqueIdentifier в SQL Server , числовой для кодов репликации в Access. Это — большие случайно сгенерированные числа, вероятность совпадения которых практически нулевая. В базах данных они обычно используются для того, чтобы гарантировать уникальность какой-либо записи;

· поле счетчика в Access, числовой тип данных со свойством Identity в true в SQL Server. Это — числовое поле с автоприращением, обычно применяется как суррогатный ключ;

· sql_variant в SQL Server — позволяет хранить в столбце данные разных типов;

· timestamp — метка версии строки в SQL Server ;

· гиперссылка — специальный вид поля (до 64 000 знаков) в Access.

Другие типы данных ( cursor , table в SQL Server) в таблицах использоваться не могут и применяются только в запросах и хранимых процедурах.

Двоичные данные access

Для определения поля таблицы обязательно задаются Имя поля (Field Name) и Тип данных (Data Type).

Имя поля (Field Name). Каждое поле в таблице должно иметь уникальное имя, удовлетворяющее соглашениям об именах объектов в Access. Оно является комбинацией из букв, цифр, пробелов и специальных символов, за исключением точки (.), восклицательного знака (!), надстрочного знака (`) и квадратных скобок ([ ]). Имя не может начинаться с пробела и содержать управляющие символы с кодами ASCII от 0 до 31. Максимальная длина имени 64 символа.

Тип данных в MS Access (Data Type). Тип данных определяется значениями, которые предполагается хранить в поле, и операциями, которые будут выполняться с этими значениями. В Access допускается использование двенадцати типов данных.


Рассмотрим вкратце типы данных в MS Access, виды, назначение и допустимый размер данных, которые могут назначаться полям таблицы в Access.

  • Текстовый (Text) — используется для хранения текста или комбинаций алфавитно-цифровых знаков, не применяемых в расчетах (например, код товара). Максимальная длина поля 255 знаков.
  • Поле МЕМО (Memo) — используется для хранения обычного текста или комбинаций алфавитно-цифровых знаков длиной более 255 знаков. Поля с этим типом данных в базах данных формата Access 2007 поддерживают также форматирование текста. Это единственный в Access тип данных, обеспечивающий встроенную поддержку отображения и хранения форматированного текста. Максимальный размер поля 1 Гбайт знаков или 2 Гбайт памяти (2 байта на знак) при программном заполнении полей, и 65 535 знаков при вводе данных вручную в поле и в любой элемент управления, связанный с этим полем.
  • Числовой (Number) — служит для хранения числовых значений (целых или дробных), предназначенных для вычислений, исключением являются денежные значения, для которых используется тип данных Денежный (Currency). Размер поля 1, 2, 4 и 8 байтов, или 16 байтов (если используется для кода репликации) зависит от типа чисел, вводимых в поле.
  • Дата/время (Date/Time) — используется для хранения значений даты и времени в виде 8-байтовых чисел двойной точности с плавающей запятой. Целая часть значения, расположенная слева от десятичной запятой, представляет собой дату. Дробная часть, расположенная справа от десятичной запятой, — это время. Хранение значений даты и времени в числовом формате позволяет выполнять различные вычисления с этими данными.
  • Денежный (Currency) — используется для хранения денежных значений в виде 8-байтовых чисел с точностью до четырех знаков после запятой. Этот тип данных применяется для хранения финансовых данных и в тех случаях, когда значения не должны округляться.
  • Счетчик (AutoNumber) — используется для уникальных числовых 4-байтовых значений, которые автоматически вводит Access при добавлении записи. Вводимые числа могут последовательно увеличиваться на указанное приращение или выбираться случайно. Обычно используются в первичных ключах.
  • Логический (Yes/No) — применяется для хранения логических значений, которые могут содержать одно из двух значений: Да/Нет, Истина/Ложь или Вкл/Выкл. (8 битов = 1 байт). Используется 1 для значений Да и 0 для значений Нет. Размер равен 1 биту.
  • Поле объекта OLE (OLE Object) — используется для хранения изображений, документов, диаграмм и других объектов из приложений MS Office и других программ Windows в виде растровых изображений, которые затем отображаются в элементах управления форм или отчетов, связанных с этим полем таблицы.
    Чтобы в Access просматривать эти изображения, необходимо, чтобы на компьютере, использующем базу данных, был зарегистрирован OLE-сервер (про-грамма, поддерживающая этот тип файлов). Если для данного типа файлов OLE-сервер не зарегистрирован, отображается значок поврежденного изображения.
Читать еще:  Ключ от майкрософт офис 365 бесплатно
  • Гиперссылка (Hyperlink) — применяется для хранения ссылок на Web-узлы (URL-адреса), на узлы или файлы интрасети или локальной сети (UNC-адреса — стандартного формата записи пути), а также на узлы или файлы локального компьютера. Кроме того, можно использовать ссылку на объекты Access, хранящиеся в базе данных. Может хранить до 1 Гбайт данных.
  • Вложение (Attachment) — используется для вложения в поле записи файлов изображений, электронных таблиц, документов, диаграмм и других файлов поддерживаемых типов точно так же, как в сообщения электронной почты. Вложенные файлы можно просматривать и редактировать в соответствии с заданными для поля параметрами. Эти поля не имеют ограничений, связанных с отсутствием зарегистрированных OLE-серверов. Более рационально используют место для хранения, чем поля с типом данных Поле объекта OLE (OLE Object), поскольку не создают растровые изображения исходного файла. Максимальная длина поля для сжатых вложений — 2 Гбайт, для несжатых — примерно 700 Кбайт в зависимости от степени возможного сжатия вложения.
  • Вычисляемый (Calculated) — предназначен для создания вычисляемых полей: числовых, текстовых, денежных, дата/время, логических. Значение вычисляемого поля определяется выражением, записанным в поле и использующим другие поля текущей записи, некоторые встроенные функции и константы, связанные арифметическими, логическими или строковыми операторами.
  • Мастер подстановок (Lookup Wizard) или Подстановка и отношения (Lookup & Relationship) — вызывает мастера подстановок, с помощью которого можно создать поле, позволяющее выбрать значения из списка, построенного на основе значений поля другой таблицы, запроса или фиксированного набора значений. Такое поле отображается как поле со списком. Если список построен на основе поля таблицы или запроса, тип данных и размер создаваемого поля определяется типом данных и размером привязанного столбца; если на основе набора значений — размером текстового поля, содержащего значение. Кроме того, мастер подстановок позволяет определить связь таблиц и включить проверку связной целостности данных.
  • Закрепим полученные знания просмотром видео:

    Про основные свойства полей MS Access читаем тут.

    Средства работы с двоичными данными


    Пример: анализ файлов в формате JPEG

    Вы можете скачать приложенную обработку прямо сейчас

    Постановка задачи

    Необходимо просканировать каталог с файлами, выбрать файлы с расширением «.jpg» или «.jpeg» и для каждого такого файла собрать информацию об изображении. Если при анализе выяснится, что файл не соответствует формату JPEG, то такой файл следует пропустить.

    Информация, которая нас интересует:

    • Ширина изображения в пикселах,
    • Высота изображения в пикселах,
    • Глубина цвета (количество битов на один пиксел).

    Краткое описание формата JPEG

    Кратко опишем некоторые детали формата, существенные для решения нашей задачи. За более подробным описанием формата JPEG можно обратиться к соответствующим источникам:

    Файл JPEG содержит последовательность маркеров, каждый из которых начинается с байта 0xFF, свидетельствующего о начале маркера, и байта-идентификатора. Некоторые маркеры состоят только из этой пары байтов, другие же содержат дополнительные данные, состоящие из двухбайтового поля с длиной информационной части маркера (включая длину этого поля, но за вычетом двух байтов начала маркера, то есть 0xFF и идентификатора) и собственно данных. Такая структура файла позволяет быстро отыскать маркер с необходимыми данными (например, с длиной строки, числом строк и числом цветовых компонентов сжатого изображения).

    Решение

    Создадим функцию, которая будет сканировать файл, определять его формат и выделять нужную нам информацию.

    Важно, что для корректного разбора маркеры необходимо читать последовательно, один за другим, т.к. байты, совпадающие с маркером могут быть в содержимом фрагментов.

    Теперь, когда мы написали основную функцию для анализа JPEG-файла, напишем вспомогательную функцию — ПрочитатьМаркер, которая читает очередной маркер и возвращает информацию о нем:

    • РазмерСекции: размер секции, начало которой отмечает маркер
    • ЭтоОписаниеИзображения: признак того, что секция, отмеченная маркером, содержит нужную нам информацию об изображении.

    Копировать в буфер обмена

    И, наконец, соберем всё вместе и напишем функцию, которая будет анализировать все файлы в заданной папке и выдавать полученную информацию в виде таблицы.

    Пример: Работа с составными (multipart) HTTP-сообщениями

    Вы можете скачать приложенную конфигурацию прямо сейчас

    Постановка задачи

    В данном примере мы создадим HTTP-сервис, который будет в ответ на запрос от клиента выдавать текстовое сообщение с вложенными картинками. Затем на клиенте мы отобразим полученный ответ.

    Ответ от сервиса будет иметь следующий вид:

    В этом сообщении надо обратить внимание на тип содержимого (заголовок Content-Type) — «multipart/form-data». Первое слово «multipart» указывает на то, что HTTP-сообщение является составным, т.е. содержит внутри себя несколько вложенных сообщений. Второе слово — «form-data» — указывает на конкретный стандарт составных сообщений, который часто используется для кодирования почтовых сообщений.

    В любых составных сообщениях в заголовке Content-Type обязательно должен присутствовать атрибут boundary, определяющий строку, которая отделяет друг от друга вложенные сообщения внутри составного сообщения.

    В случае стандарта «multipart/form-data», каждое вложенное сообщение в свою очередь должно содержать заголовок Content-Disposition со значением «form-data» и атрибутом «name», который позволяет идентифицировать сообщения.

    Создание cервиса для формирования составного сообщения

    Добавим новый HTTP-сервис и назовем его «TestMultipart». Для простоты будем считать, что наш сервис будет возвращать заданное составное сообщение в ответ на любой GET-запрос. Поэтому добавляем Шаблон URL с именем «ДляВсех» и значением «/*». Т.е. данный шаблон соответствует любому запросу. Далее добавляем в шаблон HTTP-метод GET с именем «Get».

    В качестве обработчика для метода создаем в модуле сервиса функцию ДляВсех_Get:

    Вся работа по созданию сообщения выполняется в функции СоздатьСообщение. Данная функция определяется следующим образом:

    У нас есть функция, формирующая составное сообщение и теперь нам осталось только определить две вспомогательные функции для создания вложенных сообщения:

    • функция СоздатьСообщение_Текст нужна для создания HTTP-сообщения, содержащего текст,
    • функция СоздатьСообщение_Изображение нужна для создания HTTP-сообщения, содержащего изображение.

    Копировать в буфер обмена

    Разбор составного сообщения на стороне клиента

    Теперь посмотрим, как мы можем работать с составными сообщениями на стороне клиента. Нам необходимо распаковать вложенные сообщения и показать их содержимое.

    Создаем новую общую форму. На форму добавляем реквизиты типа Строка:

    • Сообщение — текст сообщения,
    • АдресКартинки1 — адрес первой картинки во временном хранилище,
    • АдресКартинки2 — адрес второй картинки во временном хранилище.

    Далее добавляем элементы управления:

    • Кнопка.
    • Поле текстового документа (реквизит Сообщение).
    • Поле картинки (реквизит АдресКартинки1).
    • Поле картинки (реквизит АдресКартинки2).

    Также создаем новую команду формы с именем ОтправитьЗапрос и привязываем команду к кнопке.

    Создаем обработчик команды:

    Вся работа по запросу сервиса и отображению результата выполняется в серверной функции ВыполнитьЗапрос:

    Функция ПрочитатьСообщение содержит самое интересное — разбор полученного от сервиса составного сообщения с использованием новых средств работы с двоичными данными:

    Осталось определить вспомогательные функции:

    • ПрочитатьЗаголовки — читает заголовки сообщения и представляет их в виде объекта Соответствие
    • ПолучитьРазделительСоставногоСообщения — получает разделитель составного сообщения из заголовков сообщения
    • ПолучитьИмяСообщения — получает имя вложенного сообщения из заголовков сообщения

    Копировать в буфер обмена

    Двоичные данные в 1С 8.3

    • Контроль вносимых изменений;
    • Исключение избыточной нагрузки;
    • Обеспечение работоспособности системы

    Двоичные данные платформы 1С:Предприятие – это универсальный объект встроенного языка программирования для работы с файлами. Благодаря объекту ДвоичныеДанные можно любой файл представить в виде последовательности байт. Объект доступен в тонком клиенте, веб-клиенте, мобильном клиенте, на сервере, толстом клиенте, внешнем соединении, мобильном приложении (клиент/сервер).

    Объект сериализуется

    Данный объект может быть сериализован в/из XML, может использоваться в реквизитах управляемой формы, а также он может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен . Имя типа XDTO может быть любым из перечисленных: base64Binary, hexBinary.

    Благодаря тому, что двоичные данные доступны и на клиенте, и на сервере, мы можем смело передавать файл в виде двоичных данных с клиента на сервер, однако рекомендованный «шаблон» для передачи файла – использовать хранилище значений.

    Задачи, для решения которых можно использовать двоичные данные:

    • Хранение файлов в базе данных (с использованием ХранилищеЗначения);
    • Передача файла с клиента на сервер;
    • Передача файлов при работе с протоколом HTTP;
    • Передача вложений при работе с электронными письмами;
    • Криптография;
    • Представления файла в виде текста (с использованием Base64).

    Работа с двоичными данными:

    Данный пример кода показывает, как прочитать двоичные данные и передать их с клиента на сервер, используя объект ДвоичныеДанные.

    Примеры по работе с двоичными данными

    Самый очевидный пример, где применяются двоичные данные, – сохранение файла в базе данных. Для хранения файла в виде двоичных данных необходимо в объекте добавить реквизит с типом «ХранилищеЗначений». Далее представлен пример кода по работе с реквизитом (заполнение значения и получение значения).

    Заполнение:

    Получение (фрагмент кода, выполняемый на сервере):

    Рассмотрим еще один пример: скачивание картинки из интернета и отображение ее на управляемой форме. Для этого также добавляем реквизит с типом ХранилищеЗначения, в котором будет помещаться картинка в двоичном формате.

    Использование функции:

    Теперь у нас в реквизите «Аватар» лежат двоичные данные картинки. Чтобы картинку вывести на управляемую форму, необходимо добавить реквизит формы «Тип строка», перекинуть его на форму (drag-and-drop), либо создать самостоятельно элемент формы, указав в поле «Путь к данным» наш реквизит «Картинка», после чего изменить вид на «Поле картинки».

    По событию ПриСозданииНаСервере

    Готово, на форме у нас картинка.

    Двоичные данные и потоки

    Говоря о двоичных данных, стоит упомянуть о возможности работы с потоками. Она появилась относительно недавно, а именно в версии 8.3.9. Чтобы потоком можно было читать из двоичных данных, применяется метод ОткрытьПотокДляЧтения. Допустим, у нас в базе данных лежит заархивированный xml-файл (как хранить файлы в базе данных рассматривалось ранее). Нам нужно вывести пользователю содержимое этого файла, или у вас настроен какой-то обмен, и вы передаете файлы в заархивированном виде (для экономии трафика).

    Последовательность действий при работе с двоичными данными без использования потоков:

    • Получить двоичные данные из базы;
    • Записать их во временный файл;
    • Разархивировать;
    • Удалить временный файл;
    • Прочитать разархивированный файл.

    Последовательность действий при работе с потоками:

    • Получить двоичные данные из базы;
    • Открыть поток для чтения;
    • Разархивировать;
    • Прочитать разархивированный файл.

    Пример кода без использования потоков:

    Пример кода по работе с потоком:

    Если диск у вас на SSD, рекомендую использовать потоки не только в примере с архивацией, а везде, где это возможно. Да, в данном примере все же происходит запись на диск (разархивация), но будем надеяться, когда-нибудь 1С реализует метод двоичных данных ОткрытьПотокДляЗаписи.

    Работа с Base64

    Base64 – это стандарт, позволяющий кодировать двоичные данные в виде строки (для кодирования используется 64 символа таблицы ASCII, отсюда и название). Тип ДвоичныеДанные сериализуем, то есть его можно представить в виде XML, для этого применяется объект встроенного языка СериализаторXDTO. После сериализации данные представлены одним узлом base64Binary, содержимое которого есть последовательность байт, закодированная в формате Base64.

    строка в Base64

    Платформа 1С также позволяет кодировать двоичные данные, не прибегая к сериализации. Для этого есть две функции:

    Они преобразуются в Base64 и обратно в двоичные данные.

    Если у вас остались вопросы по работе с двоичными данными в среде 1С:Предприятие, обратитесь к нашим специалистам и получите консультацию по 1С 8.3 или воспользуйтесь услугами по сопровождению 1С.

    Ссылка на основную публикацию
    Adblock
    detector