Что такое код ifx_update_blob


FPublisher

Web-технологии: База знаний

Документация PHP

ifx_update_blob

(No version information available, might be only in CVS)

ifx_update_blob — Updates the content of the blob object

Описание

bool ifx_update_blob ( int $bid , string $content )

Updates the content of the blob object for the given blob object bid .

Список параметров

A BLOB object identifier.

The new data, as a string.

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Смотрите также

Последние поступления:

ТехЗадание на Землю

Размещена 14 марта 2020 года

Пpоект Genesis (из коpпоpативной пеpеписки)

Шпаргалка по работе с Vim

Размещена 05 декабря 2020 года

Vim довольно мощный редактор, но работа с ним не всегда наглядна.
Например если нужно отредактировать какой-то файл например при помощи crontab, без знания специфики работы с viv никак.

Ошибка: Error: Cannot find a val >Размещена 13 сентабря 2020 года

Если возникает ошибка на centos 5 вида
YumRepo Error: All mirror URLs are not using ftp, http[s] or file.
Eg. Invalid release/

Linux Optimization

Размещена 30 июля 2012 года

Что такое код ifx_update_blob

(PHP 3 >= 3.0.4, PHP 4, PHP 5)

ifx_update_blob — Updates the content of the blob object

Description bool ifx_update_blob ( int bid, string content )

Updates the content of the blob object for the given blob object bid . content is a string with new data. Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Пред. Начало След.
ifx_textasvarchar Уровень выше ifx_update_char

Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:


ifx_update_blob

(PHP 4, PHP ifx_update_blob — Updates the content of the blob object

Description

Updates the content of the blob object for the given blob object bid .

Parameters

A BLOB object identifier.

The new data, as a string.

Return Values

Returns TRUE on success or FALSE on failure.

See Also

  • ifx_update_char() — Updates the content of the char object

XLIV. жХОЛГЙЙ Informix

дТБКЧЕТ Informix ДМС Informix (IDS) 7.x, SE 7.x, Universal Server (IUS) 9.x Й IDS 2000 ТЕБМЙЪПЧБО Ч «ifx.ec» Й «php3_ifx.h» Ч ДЙТЕЛФПТЙЙ ТБУЫЙТЕОЙС informix. рПДДЕТЦЛБ IDS 7.x ЧЕУШНБ ПУОПЧБФЕМШОБ, У РПМОПК РПДДЕТЦЛПК УФПМВГПЧ BYTE Й TEXT. рПДДЕТЦЛБ IUS 9.x ЮБУФЙЮОП ЪБЧЕТЫЕОБ: ЧЧЕДЕОЩ ОПЧЩЕ ФЙРЩ ДБООЩИ, ОП РПДДЕТЦЛБ SLOB Й CLOB ЧУЈ ЕЭЈ Ч УФБДЙЙ ТБЪТБВПФЛЙ.

ъБНЕЮБОЙС РП ЛПОЖЙЗХТБГЙЙ: ЧБН ОЕПВИПДЙНБ ЧЕТУЙС ESQL/C ДМС ЛПНРЙМСГЙЙ ДТБКЧЕТБ Informix ДМС тот. ESQL/C ЧЕТУЙЙ У 7.2x ДПМЦОЩ ТБВПФБФШ ОПТНБМШОП. ESQL/C СЧМСЕФУС ФЕРЕТШ ЮБУФША Informix Client SDK.

хВЕДЙФЕУШ, ЮФП РЕТЕНЕООБС «INFORMIXDIR» ХУФБОПЧМЕОБ Й ЮФП $INFORMIXDIR/bin ЙНЕЕФУС Ч ЧБЫЕК РЕТЕНЕООПК ПЛТХЦЕОЙС PATH, РТЕЦДЕ ЮЕН ЪБРХУЛБФШ УЛТЙРФ «configure».

рТЙНЕЮБОЙЕ: УЛТЙРФ configure ВХДЕФ БЧФПНБФЙЮЕУЛЙ ПРТЕДЕМСФШ ДЙТЕЛФПТЙЙ ВЙВМЙПФЕЛ Й include, ЕУМЙ ЧЩ ЪБРХУФЙФЕ configure —with_informix=yes . чЩ НПЦЕФЕ РЕТЕПРТЕДЕМЙФШ ЬФП БЧФППРТЕДЕМЕОЙЕ, УРЕГЙЖЙГЙТПЧБЧ «IFX_LIBDIR», «IFX_LIBS» Й «IFX_INCDIR» Ч ПЛТХЦЕОЙЙ. уЛТЙРФ configure ФБЛЦЕ РПРЩФБЕФУС ПРТЕДЕМЙФШ ЧЕТУЙА ЧБЫЕЗП УЕТЧЕТБ Informix. пО ХУФБОПЧЙФ РЕТЕНЕООХА ХУМПЧОПК ЛПНРЙМСГЙЙ «HAVE_IFX_IUS», ЕУМЙ ЧБЫБ ЧЕТУЙС Informix >= 9.00.

рТЙНЕЮБОЙЕ: ХВЕДЙФЕУШ, ЮФП РЕТЕНЕООЩЕ ПЛТХЦЕОЙС Informix INFORMIXDIR Й INFORMIXSERVER ДПУФХРОЩ ДМС PHP ifx-ДТБКЧЕТБ Й ЮФП ДЙТЕЛФПТЙС INFORMIX bin ОБИПДЙФУС Ч PATH. рТПЧЕТШФЕ ЬФП, ЪБРХУФЙЧ УЛТЙРФ, УПДЕТЦБЭЙК ЧЩЪПЧ phpinfo() , РТЕЦДЕ ЮЕН ОБЮБФШ ФЕУФЙТПЧБОЙЕ. оБ ЧЩЧПДЕ phpinfo() ЬФЙ РЕТЕНЕООЩЕ ДПМЦОЩ ВЩФШ РЕТЕЮЙУМЕОЩ. ьФП TRUE ЛБЛ ДМС CGI php, ФБЛ Й ДМС Apache mod_php. чБН НПЦЕФ РПОБДПВЙФШУС ХУФБОПЧЙФШ ЬФЙ РЕТЕНЕООЩЕ ПЛТХЦЕОЙС Ч УФБТФПЧПН УЛТЙРФЕ ЧБЫЕЗП Apache.

уПЧНЕУФОП ЙУРПМШЪХЕНЩЕ ВЙВМЙПФЕЛЙ Informix ФБЛЦЕ ДПМЦОЩ ВЩФШ ДПУФХРОЩ ЪБЗТХЪЮЙЛХ (РТПЧЕТШФЕ LD_LINBRARY_PATH ЙМЙ ld.so.conf/ldconfig).

оЕЛПФПТЩЕ ЪБНЕЮБОЙС ПВ ЙУРПМШЪПЧБОЙЙ BLOB’ПЧ (УФПМВГЩ TEXT Й BYTE): BLOB’Щ ОПТНБМШОП БДТЕУХАФУС BLOB-ЙДЕОФЙЖЙЛБФПТБНЙ. ъБРТПУЩ ЧЩВПТЛЙ ЧПЪЧТБЭБАФ «blob ДБУФ ЧБН filename. йУРПМШЪХКФЕ ОПТНБМШОЩК I/O ЖБКМПЧ ДМС РПМХЮЕОЙС УПДЕТЦЙНПЗП blob.

дМС ЪБРТПУПЧ insert/update ЧЩ ПВСЪБОЩ УПЪДБФШ ЬФЙ «blob id’Щ» УБНПУФПСФЕМШОП У РПНПЭША » ifx_create_blob() ;». ъБФЕН РПДЛМАЮЙФЕ blob id’Щ Ч НБУУЙЧ Й ЪБНЕУФЙФЕ blob-УФПМВГЩ ЪОБЛПН ЧПРТПУБ (?) Ч УФТПЛЕ ЪБРТПУБ. дМС update/insert ЧЩ ПФЧЕФУФЧЕООЩ ЪБ ХУФБОПЧЛХ blob-УПДЕТЦЙНПЗП У РПНПЭША ifx_update_blob() .

рПЧЕДЕОЙЕ BLOB-УФПМВГПЧ НПЦЕФ ВЩФШ ЙЪНЕОЕОП РЕТЕНЕООЩНЙ ЛПОЖЙЗХТБГЙЙ, ЮФП ФБЛЦЕ НПЦОП УДЕМБФШ ОБ ЬФБРЕ РТПЗПОБ РТПЗТБННЩ:

РЕТЕНЕООБС ЛПОЖЙЗХТБГЙЙ : ifx.textasvarchar

РЕТЕНЕООБС ЛПОЖЙЗХТБГЙЙ : ifx.byteasvarchar

ifx_textasvarchar(0) : ЙУРПМШЪПЧБФШ blob id’Щ ДМС select-ЪБРТПУПЧ УП УФПМВГБНЙ TEXT

ifx_byteasvarchar(0) : ЙУРПМШЪПЧБФШ blob id’Щ ДМС select-ЪБРТПУПЧ УП УФПМВГБНЙ BYTE

ifx_textasvarchar(1) : ЧПЪЧТБЭБФШ УФПМВГЩ TEXT, ЛБЛ ЕУМЙ ВЩ ПОЙ ВЩМЙ УФПМВГБНЙ VARCHAR, ЮФПВЩ ЧБН ОЕ ОХЦОП ВЩМП ЙУРПМШЪПЧБФШ blob id’Щ ДМСselect-ЪБРТПУПЧ

ifx_byteasvarchar(1) : ЧПЪЧТБЭБФШ УФПМВГЩ BYTE, ЛБЛ ЕУМЙ ВЩ ПОЙ ВЩМЙ УФПМВГБНЙ VARCHAR, ЮФПВЩ ЧБН ОЕ ОХЦОП ВЩМП ЙУРПМШЪПЧБФШ blob id’Щ ДМС select-ЪБРТПУПЧ

РЕТЕНЕООБС ЛПОЖЙЗХТБГЙЙ : ifx.blobinfile

ifx_blobinfile_mode(0) : ЧПЪЧТБЭБФШ УФПМВГЩ BYTE Ч РБНСФЙ, blob id РПЪЧПМСЕФ РПМХЮБФШ УПДЕТЦЙНПЕ

ifx_blobinfile_mode(1) : ЧПЪЧТБЭБФШ УФПМВГЩ BYTE Ч ЖБКМЕ, blob id РПЪЧПМСЕФ РПМХЮБФШ ЙНС ЖБКМБ

еУМЙ ЧЩ ХУФБОБЧМЙЧБЕФЕ ДМС ifx_text/byteasvarchar ЪОБЮЕОЙЕ 1, ЧЩ НПЦЕФЕ ЙУРПМШЪПЧБФШ УФПМВГЩ TEXT Й BYTE Ч select-ЪБРТПУБИ, ЛБЛ ОПТНБМШОЩЕ (ОП ЧУЈ ЦЕ long) РПМС VARCHAR. рПУЛПМШЛХ ЧУЕ УФТПЛЙ «РПДУЮЙФБОЩ» Ч PHP, ПО ПУФБЈФУС «binary safe». чЩ ПВСЪБОЩ ПВТБВПФБФШ ЬФП ЛПТТЕЛФОП. чПЪЧТБЭБЕНЩЕ ДБООЩЕ НПЗХФ УПДЕТЦБФШ ЧУЈ ЮФП ХЗПДОП, ЧЩ ПФЧЕЮБЕФЕ ЪБ УПДЕТЦЙНПЕ.

еУМЙ ЧЩ ХУФБОБЧМЙЧБЕФЕ ДМС ifx_blobinfile ЪОБЮЕОЙЕ 1, ЙУРПМШЪХКФЕ ЙНС ЖБКМБ, ЧПЪЧТБЭБЕНПЕ ifx_get_blob(..), ДМС РПМХЮЕОЙС blob-УПДЕТЦЙНПЗП. ъБНЕФШФЕ, ЮФП Ч ЬФПН УМХЮБЕ чщ пфчеюбефе ъб хдбмеойе чтенеоощи жбкмпч, упъдбоощи INFORMIX, ЛПЗДБ ЙЪЧМЕЛБЕФЕ ТСДЩ. лБЦДЩК ОПЧЩК ЙЪЧМЕЮЈООЩК ТСД УПЪДБУФ ОПЧЩК ЧТЕНЕООЩК ЖБКМ ДМС ЛБЦДПЗП УФПМВГБ BYTE.


тБЪНЕЭЕОЙЕ ЧТЕНЕООЩИ ЖБКМПЧ НПЦЕФ ВЩФШ ОБУФТПЕОП РЕТЕНЕООПК ПЛТХЦЕОЙС «blobdir», РП ХНПМЮБОЙА «.» (ФЕЛХЭБС ДЙТЕЛФПТЙС). юФП-ФП ЧТПДЕ putenv(blobdir=tmpblob»); ПВМЕЗЮЙФ ЪБЮЙУФЛХ ЧТЕНЕООЩИ ЖБКМПЧ, УМХЮБКОП РТПРХЭЕООЩИ (ЙНЕОБ ЙИ ЧУЕИ ОБЮЙОБАФУС У «blb»).

бЧФПНБФЙЮЕУЛБС ДПЧПДЛБ «char»-ДБООЩИ (SQLCHAR Й SQLNCHAR): ЬФП НПЦОП ХУФБОПЧЙФШ РЕТЕНЕООПК ПЛТХЦЕОЙС

ifx.charasvarchar : ЕУМЙ ХУФБОПЧМЕОП 1, ЧЕДПНЩЕ РТПВЕМЩ БЧФПНБФЙЮЕУЛЙ ХДБМСАФУС, ДБЧБС ЧБН ОЕЛПФПТПЕ РПДПВЙЕ «ПФУЕЮЕОЙС/chopping».

NULL -ЪОБЮЕОЙС: РЕТЕНЕООБС ЛПОЖЙЗХТБГЙЙ ifx.nullformat (Й ЖХОЛГЙС ЧТЕНЕОЙ ЧЩРПМОЕОЙС ifx_nullformat() ), ЕУМЙ ХУФБОПЧМЕОБ Ч TRUE , ЧПЪЧТБФЙФ NULL -УФПМВГЩ ЛБЛ УФТПЛХ » NULL «, ЕУМЙ ХУФБОПЧМЕОБ FALSE , ПОЙ ЧПЪЧТБФСФ РХУФХА УФТПЛХ. ьФП РПЪЧПМСЕФ ЧБН ЧЩВЙТБФШ НЕЦДХ NULL -УФПМВГБНЙ Й РХУФЩНЙ УФПМВГБНЙ.

ьФП ТБУЫЙТЕОЙЕ ОЕ ПРТЕДЕМСЕФ ОЙЛБЛЙИ ЛПОУФБОФ.

Devart Forum

Discussion forums for open issues and questions concerning database tools, data access components and developer tools from Devart

  • Темы без ответов
  • Активные темы
  • Поиск

Update blob загрузка image

Update blob загрузка image

Сообщение imobile » Сб 08 фев 2014 13:41

Re: Update blob загрузка image

Сообщение imobile » Вс 09 фев 2014 12:25

Re: Update blob загрузка image

Сообщение Alexp » Ср 12 фев 2014 11:53

Это поведение связано с настройками MySQL сервера. Для загрузки больших данных Вам необходимо увеличить значение серверной переменной max_allowed_packet в my.ini файле. Например:
max_allowed_packet = 16M

Re: Update blob загрузка image

Сообщение imobile » Ср 12 фев 2014 19:36

Re: Update blob загрузка image

Сообщение Alexp » Чт 13 фев 2014 08:23

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

P.S. После выполнения команды SET запрос

Re: Update blob загрузка image

Сообщение imobile » Вс 16 фев 2014 10:12

Re: Update blob загрузка image

Сообщение Alexp » Пн 17 фев 2014 08:32

Илон Маск рекомендует:  Медиа-запросы в CSS

A BLOB column with a maximum length of 255 (28 – 1) bytes. Each TINYBLOB value is stored using a one-byte length prefix that indicates the number of bytes in the value.

A BLOB column with a maximum length of 65,535 (216 – 1) bytes. Each BLOB value is stored using a two-byte length prefix that indicates the number of bytes in the value.


An optional length M can be given for this type. If this is done, MySQL creates the column as the smallest BLOB type large enough to hold values M bytes long.

A BLOB column with a maximum length of 16,777,215 (224 – 1) bytes. Each MEDIUMBLOB value is stored using a three-byte length prefix that indicates the number of bytes in the value.

A BLOB column with a maximum length of 4,294,967,295 or 4GB (232 – 1) bytes. The effective maximum length of LONGBLOB columns depends on the configured maximum packet size in the client/server protocol and available memory. Each LONGBLOB value is stored using a four-byte length prefix that indicates the number of bytes in the value.

XLIV. Функции Informix

Драйвер Informix для Informix (IDS) 7.x, SE 7.x, Universal Server (IUS) 9.x и IDS 2000 реализован в «ifx.ec» и «php3_ifx.h» в директории расширения informix. Поддержка IDS 7.x весьма основательна, с полной поддержкой столбцов BYTE и TEXT. Поддержка IUS 9.x частично завершена: введены новые типы данных, но поддержка SLOB и CLOB всё ещё в стадии разработки.

Замечания по конфигурации: вам необходима версия ESQL/C для компиляции драйвера Informix для РНР. ESQL/C версии с 7.2x должны работать нормально. ESQL/C является теперь частью Informix Client SDK.

Убедитесь, что переменная «INFORMIXDIR» установлена и что $INFORMIXDIR/bin имеется в вашей переменной окружения PATH, прежде чем запускать скрипт «configure».

Примечание: скрипт configure будет автоматически определять директории библиотек и include, если вы запустите configure —with_informix=yes . Вы можете переопределить это автоопределение, специфицировав «IFX_LIBDIR», «IFX_LIBS» и «IFX_INCDIR» в окружении. Скрипт configure также попытается определить версию вашего сервера Informix. Он установит переменную условной компиляции «HAVE_IFX_IUS», если ваша версия Informix >= 9.00.

Примечание: убедитесь, что переменные окружения Informix INFORMIXDIR и INFORMIXSERVER доступны для PHP ifx-драйвера и что директория INFORMIX bin находится в PATH. Проверьте это, запустив скрипт, содержащий вызов phpinfo() , прежде чем начать тестирование. На выводе phpinfo() эти переменные должны быть перечислены. Это TRUE как для CGI php, так и для Apache mod_php. Вам может понадобиться установить эти переменные окружения в стартовом скрипте вашего Apache.

Совместно используемые библиотеки Informix также должны быть доступны загрузчику (проверьте LD_LINBRARY_PATH или ld.so.conf/ldconfig).

Некоторые замечания об использовании BLOB’ов (столбцы TEXT и BYTE): BLOB’ы нормально адресуются BLOB-идентификаторами. Запросы выборки возвращают «blob даст вам filename. Используйте нормальный I/O файлов для получения содержимого blob.

Для запросов insert/update вы обязаны создать эти «blob id’ы» самостоятельно с помощью » ifx_create_blob() ;». Затем подключите blob id’ы в массив и заместите blob-столбцы знаком вопроса (?) в строке запроса. Для update/insert вы ответственны за установку blob-содержимого с помощью ifx_update_blob() .

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

переменная конфигурации : ifx.textasvarchar

переменная конфигурации : ifx.byteasvarchar

ifx_textasvarchar(0) : использовать blob id’ы для select-запросов со столбцами TEXT

ifx_byteasvarchar(0) : использовать blob id’ы для select-запросов со столбцами BYTE

ifx_textasvarchar(1) : возвращать столбцы TEXT, как если бы они были столбцами VARCHAR, чтобы вам не нужно было использовать blob id’ы дляselect-запросов

ifx_byteasvarchar(1) : возвращать столбцы BYTE, как если бы они были столбцами VARCHAR, чтобы вам не нужно было использовать blob id’ы для select-запросов

переменная конфигурации : ifx.blobinfile

ifx_blobinfile_mode(0) : возвращать столбцы BYTE в памяти, blob id позволяет получать содержимое

ifx_blobinfile_mode(1) : возвращать столбцы BYTE в файле, blob id позволяет получать имя файла

Если вы устанавливаете для ifx_text/byteasvarchar значение 1, вы можете использовать столбцы TEXT и BYTE в select-запросах, как нормальные (но всё же long) поля VARCHAR. Поскольку все строки «подсчитаны» в PHP, он остаётся «binary safe». Вы обязаны обработать это корректно. Возвращаемые данные могут содержать всё что угодно, вы отвечаете за содержимое.

Если вы устанавливаете для ifx_blobinfile значение 1, используйте имя файла, возвращаемое ifx_get_blob(..), для получения blob-содержимого. Заметьте, что в этом случае ВЫ ОТВЕЧАЕТЕ ЗА УДАЛЕНИЕ ВРЕМЕННЫХ ФАЙЛОВ, СОЗДАННЫХ INFORMIX, когда извлекаете ряды. Каждый новый извлечённый ряд создаст новый временный файл для каждого столбца BYTE.

Размещение временных файлов может быть настроено переменной окружения «blobdir», по умолчанию «.» (текущая директория). Что-то вроде putenv(blobdir=tmpblob»); облегчит зачистку временных файлов, случайно пропущенных (имена их всех начинаются с «blb»).

Автоматическая доводка «char»-данных (SQLCHAR и SQLNCHAR): это можно установить переменной окружения

ifx.charasvarchar : если установлено 1, ведомые пробелы автоматически удаляются, давая вам некоторое подобие «отсечения/chopping».

NULL -значения: переменная конфигурации ifx.nullformat (и функция времени выполнения ifx_nullformat() ), если установлена в TRUE , возвратит NULL -столбцы как строку » NULL «, если установлена FALSE , они возвратят пустую строку. Это позволяет вам выбирать между NULL -столбцами и пустыми столбцами.

Это расширение не определяет никаких констант.

Как обновить BLOB в SQL SERVER с помощью TSQL

Как обновить поле BLOB только с использованием TSQL (например, из SSMS и не использовать какой-либо код, такой как ADO.Net или Linq)?

Существует два способа ВЫБРАТЬ BLOB с TSQL:

Обратите внимание на имя корреляции после предложения FROM, которое является обязательным.


Вторая версия может использоваться для UPDATE, как в следующем примере:

Для частичных обновлений можно использовать муттер SET.WRITE, как описано в этой статье MSDN, вот синтаксис:

Обратите внимание, что мусор WRITE может использоваться только для полей NON-NULL.

Фактически это также можно использовать для полного обновления (если столбец не содержит NULL), установив @offset на 0 и @length на NULL (или на фактическую длину), как в следующем примере:

ifx_update_blob

(PHP 4, PHP ifx_update_blob — Updates the content of the blob object

Описание

Updates the content of the blob object for the given blob object bid .

Список параметров

A BLOB object identifier.

The new data, as a string.

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Смотрите также

  • ifx_update_char() — Updates the content of the char object

Delphi-Help

Работа с BLOB-полями в клиентских приложениях InterBase и Firebird на основе компонентов FIBPlus

  • размер шрифта уменьшить размер шрифтаувеличить размер шрифта
  • Печать

Работа с BLOB-полями в клиентских приложениях InterBase и Firebird на основе компонентов FIBPlus

Достаточно часто желательно хранить в базе данных разнообразные неструктурированные данные: изображения, OLE-объекты, звук и т.д. Специально для этих целей существует специальный тип данных — BLOB. Прежде чем рассматривать работу FIBPlus с полями этого типа на примерах, вспомним о том, как сам сервер реализовывает работу с ними. Важно знать и помнить следующее: В отличие от всех других полей, данные BLOB поля не хранятся непосредственно в записи таблицы. В записи таблицы хранится лишь идентификатор BLOB (BLOB_ID), а само тело BLOB хранится на отдельных страницах базы данных и доступ к ним осуществляется специальными функциями IB API. Эта особенность позволяет хранить в BLOB полях данные нефиксированного размера. FIBPlus максимально скрывает эти нюансы непосредственно от разработчика, от вас не требуется самостоятельно вызывать вышеупомянутые функции IB API, но, тем не менее, полезно знать, что происходит «за кулисами» .

Итак, продемонстрируем использование BLOB-полей на примере следующей таблицы:

Использование TpFIBDataSet при работе с BLOB-полями

Рис . 1. Внешний вид формы приложения для работы с BLOB-полями.

Для вывода изображений, сохраненных в поле GRAPHIC, мы будем использовать стандартный компонент DBIMage1: TDBImage. Очевидно также, что запросы при работе с BLOB-полями внешне ничем не отличаются от запросов со стандартными типами полей:

Нюансы при чтении:

Сразу же акцентируем внимание на первом скрытом нюансе. Выполнение «SELECT * FROM BIOLIFE» не вычитывает данные из BLOB полей на клиента. В поле «GRAPHIC» возвращается идентификатор BLOB’a. Далее «за кулисами» происходит следующее: Компонент DBImage1 хочет отобразить содержимое поля из первой записи. Он обращается к pFIBDataSet1 за этим содержимым, и тот «втайне» от нас обращается к серверу через специальные функции IB API непосредственно за телом BLOB поля, пользуясь Blob_ID поля из ПЕРВОЙ записи. Таким образом, мы должны понимать, что в отображенной на иллюстрации ситуации мы «вытащили» на клиента содержимое BLOB поля только первой записи. По мере скроллирования по записям в TpFIBDataSet, DBImage1 будет обращаться за данными других записей, и эти обращения будут транслироваться к серверу.

Илон Маск рекомендует:  Использование отладчика

Нюансы при модификации:

BLOB- поля в TFIBDataSet представлены потомками от TBlobField , и как следствие, наследуют четыре специальных метода модификации таких полей: методы LoadFromFile, LoadFromStream, SaveToFile и SaveToStream.


Первый метод (LoadFromFile) используется для сохранения в поле данных из внешнего файла, второй (LoadFromStream) — для сохранения из любого объекта типа TStream.

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

Обратите внимание на важный момент: перед тем, как присваивать значение BLOB-полю, необходимо перевести pFIBDataSet в состояние редактирования данных. В данном случае это делается безусловным вызовом метода Edit. После загрузки данных остается только сохранить изменения вызовом метода Post.

Второй важный момент — необходимо прописать явное приведение поля к типу TBlobField. Дело в том, что FieldByName возвращает объект типа TField, а он не имеет нужных нам методов.

Помимо специальных методов LoadFromXXX, для модификации BLOB полей можно использовать и простые методы типа FieldByName(…).AsString:=’asfdsafsadfsad’;

Методами SaveToFile, SaveToStream мы можем сохранить значение BLOB-поля в некоторый внешний файл или TStream.

Пример сохранения в файл:

Пример очистки поля.

Иногда также нужно знать, является ли BLOB-поле пустым или нет. При использовании визуальных компонентов типа TDBImage мы не можем быть в этом уверены. Согласитесь, что никто не мешает нам «нарисовать» пустую картинку и сохранить ее в BLOB-поле. В этом случае, мы не сможем отличить «на глаз»: есть ли какое-то изображение в BLOB-поле, или нет. Однако мы можем написать обработчик события OnDataChange компонента DataSource1: TDataSource:

Это событие вызывается, в частности, при навигации по DBGrid1, таким образом, мы всегда можем узнать, является ли текущее поле пустым или нет.

Итак, с внешней стороной дела мы разобрались, давайте теперь заглянем «за кулисы». Что происходит при модификациях записи, содержащей BLOB поле?

Вариант 1. Если BLOB поле не изменялось в процессе редактирования, то в соответствующий параметр UPDATE SQL попадет прежний BLOB_ID. Само содержимое BLOB поля на сервер не передается.

Вариант 2. BLOB поле подверглось модификации. Фактически для записи нового содержимого производится несколько действий. Во-первых, с помощью IB API функций isc_create_blob2, isc_put_segment, isc_close_blob в базе данных сохраняется тело НОВОГО BLOB. Так же при этом действии клиент узнает и запоминает BLOB_ID для нового поля. Во-вторых, в UPDATE SQL передается этот новый BLOB_ID, и UPDATE запускается на выполнение. В-третьих (ОЧЕНЬ НЕОЧЕВИДНЫЙ НЮАНС), сервер при фиксации изменений записи ПРЕОБРАЗУЕТ полученный BLOB_ID. То есть, тот BLOB_ID, который передавался клиентом, становится негодным к повторному использованию.

Из упомянутых нюансов, можно сделать несколько практических выводов. Во-первых, для TpDataSet, в которых вы будете модифицировать BLOB поля, просто необходимо использовать опцию poRefreshAfterPost (если используются две транзакции и не используется AutoCommit, то свойство датасета «RefreshTransactionKind» должно иметь значение «tkUpdateTransaction»). При этом действии FIBPlus получит преобразованный сервером BLOB_ID и подменит им тот, который уже стал невалидным. Во-вторых, мы видим, что тело BLOB поля передается на сервер ДО выполнения модификации записи. Если по каким-либо причинам последующая модификация записи будет отвергнута сервером (например, через constraints), то при повторной попытке модификации нам придется передавать тело BLOB поля заново. Это может быть накладно и с точки зрения сетевого трафика, и с точки зрения «разбухания» базы. Поэтому иногда имеет смысл разделить два процесса: отдельным запросом делать модификации всех не BLOB полей, a после успешного завершения этих модификацй отдельно отправлять изменения BLOB полей. (для TpFIBDataSet с автогенерацией модифицирующих запросов в FIBPlus есть специальная опция, регулирующая такое поведение: AutoUpdateOptions. SeparateBlobUpdate).

Использование TpFIBQuery при работе с BLOB-полями

Если вы используете TpFIBQuery для работы с BLOB-полями, то общий принцип остается тем же — можно использовать либо файлы, либо методы работы с TStream. Например, мы можем написать следующую процедуру для сохранения всех изображений из нашей таблицы в файлы:

pFIBQuery.SQL: SELECT * FROM BIOLIFE

Примечание: Метод FN является аналогом метода FieldByName.

Смысл кода, приведенного выше, совершенно очевиден: мы получаем все записи из таблицы BIOLIFE, в цикле берем от сервера очередную запись из запроса, сохраняем в файл значение поля GRAPHIC при помощи метода SaveToFile и запрашиваем следующую запись при помощи метода Next. Аналогичным образом мы могли бы присваивать значение BLOB-параметру:

Данный пример вставляет три новые записи в таблицу BIOLIFE и сохраняет в них изображения из некоторых файлов “1.bmp”, “2.bmp” и “3.bmp”.

Примечание: поскольку в данном примере для сохранения изменений использовался метод Commit, то необходимо перезапустить приложение, чтобы увидеть вставленные записи в DBGrid1.

Поиск по BLOB полям

До сих пор мы рассматривали только операции чтения/модификации BLOB полей. Рассмотрим ситуацию, когда BLOB поля присутствуют в условиях выборки. Если BLOB параметр присутствует в where клаузе, то нужно понимать, что при выполнении запроса сравниваются не содержимое BLOB поля и параметра, а BLOB_ID поля и BLOB_ID параметра. Поэтому нам следует избегать появления BLOB параметров и не пользоваться методами LoadFromFile или LoadFromStream.
Поскольку если вы загружаете в параметр значения через TStream, в реальности вы создаете НОВЫЙ BLOB на сервере с НОВЫМ BLOB_ID. BLOB_ID получается ВРЕМЕННЫЙ, и не предназначен для сравнения с чем-либо. Поэтому сервер в ответ на такую попытку, выдает сообщение о внутренней ошибке. Если вам крайне необходимо сравнивать BLOB поле с неким содержимым, то у вас есть две возможности:

Ситуация, когда нужно найти записи, в которых BLOB поле сравнивается со строкой менее 32 Kб.

Вам необходимо присвоить искомое значение в параметр через свойство AsString. В этом случае на сервер уйдет параметр типа SQL_TEXT и сервер сам произведет необходимую конвертацию значения, необходимую для сравнения.
Например, так::

Если нужно сравнить BLOB поле со значением большим, чем 32 Кб, то придется использовать специальные udf.
Например, так::

В этом примере blobCRC -это udf, а blobCRCPas — функция Pascal.
Обе функции должны быть идентичными, то есть возвращать один и тот же результат для одних и тех же входных данных.

И последнее (почти очевидное) замечание: «Волшебная» цифра 32 Кб — это максимальный размер значений типа CHAR и VARCHAR.

Уникальные возможности FIBPlus: Client BLOB-filters. «Прозрачное» сжатие BLOB-полей..

Многие из вас знают о технологии BLOB фильтров в Firebird/InterBase. Эти пользовательские функции позволяют обрабатывать (т.е. кодировать/декодировать, сжимать и т.д.) BLOB поля на сервере прозрачно для клиентского приложения. Особенно это полезно, если вам нужно заархивировать BLOB поля в базе данных, так как для этого не нужно вносить изменения в клиентскую программу. Но, используя такой подход, вы не сможете снизить сетевой трафик, потому что сервер и приложение в любом случае будут обмениваться несжатыми полями.

В FIBPlus есть механизм клиентских BLOB фильтров, очень схожий с аналогичным механизмом на серерве. Но преимущество локальных BLOB фильтров FIBPlus в том, что они значительно снижают сетевой трафик приложения, если BLOB поле сжимается до отправки на клиентское приложение и распаковывается после того, как оно получено на клиенте. Вы можете сделать это путем регистрации двух процедур: чтения и записи BLOB полей в TpFIBDatabase. После этого FIBPlus будет автоматически использовать эти процедуры для того, чтобы обрабатывать все BLOB поля заданного типа во всех TpFIBDataSet’ах, используя один экземпляр TpFIBDatabase. Проиллюстрируем этот механизм примером:

Сначала мы создадим таблицу с BLOB полями и триггер для генерации уникальных значений первичного ключа:

Обратите внимание, что sub_type должен иметь отрицательное значение!


Примечание: «Существует несколько предопределенных подтипов BLOB, которые встроены в InterBase. Все эти подтипы имеют неотрицательные номера, например subtype 0 — это данные неопределенного типа, subtype 1 — текст, subtype 2 — BLR (Binary Language Representation, см. глоссарий и главу «Структура базы данных InterBase») и т. д. Пользователь также может определять свои подтипы BLOB, которые могут иметь отрицательные значения.». Мир InterBase, А. Ковязин, С. Востриков.

Илон Маск рекомендует:  Создание первой задачи

Теперь положите следующие компоненты на форму:

Свяжите компоненты FIBPlus и сгенерируйте запросы для pFIBDataSet1 (только для таблицы “BlobTable”) с SQL Generator. Получится следующая форма:

Рис.2. Приложение с использованием BLOB-фильтров FIBPlus

Напишем обработчик нажатия на кнопку:

Теперь создадим функции сжатия/распаковки BLOB полей:

Не забудьте добавить два модуля в секцию uses: zStream, IBBlobFilter. Первый модель предназначен доя создания архива с данными, второй входит в FIBPlus и отвечает за контроль над BLOB фильтрами. Теперь нам остается только зарегистрировать BLOB фильтры. Это можно сделать путем вызова функции RegisterBlobFilter. Значение первого параметра — это тип BLOB поля (в нашем случае оно равно -15). Второй и третий параметры — это функции кодирования и декодирования BLOB поля:

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

Рис. 3. Данные в BLOB-поле, упакованные при помощи локального фильтра FIBPlus.

Итак, приложение отсылает на сервер (и получает с сервера) уже заархивированные BLOB поля, и, таким образом, сетевой трафик значительно снижается! Конечно, вы можете упаковывать BLOB поля, не используя вышеописанный механизм BLOB фильтров. Например, вы можете сжимать поле в процедуре Button1Click перед его сохранением, а затем распаковывать его в обработчике AfterScroll (или делать что-то подобное). Но, во-первых, предлагаемый централизованный механизм значительно упрощает ваш код (так как BLOB поля обрабатываются независимо от других частей программы), а, во-вторых, он помогает избежать типичных ошибок (например, когда вы пакуете BLOB поля в одной части программы и не делаете то же самое в другой).

Если запись «фильтрованных» BLOB осуществляется через хранимые процедуры, то в процедуре обязательно должен быть указан подтип входного параметра. Например:

В том случае, если подтип входного параметра не будет указан, при вызове этой процедуры BLOB-параметр будет иметь подтип ноль, и, соответственно, фильтрации на клиенте не произойдет.

XLIV. Функции Informix

Драйвер Informix для Informix (IDS) 7.x, SE 7.x, Universal Server (IUS) 9.x и IDS 2000 реализован в «ifx.ec» и «php3_ifx.h» в директории расширения informix. Поддержка IDS 7.x весьма основательна, с полной поддержкой столбцов BYTE и TEXT. Поддержка IUS 9.x частично завершена: введены новые типы данных, но поддержка SLOB и CLOB всё ещё в стадии разработки.

Замечания по конфигурации: Вам необходима версия ESQL/C для компиляции драйвера Informix для РНР. ESQL/C версии с 7.2x должны работать нормально. ESQL/C является теперь частью Informix Client SDK.

Убедитесь, что переменная «INFORMIXDIR» установлена и что $INFORMIXDIR/bin имеется в вашей переменной окружения PATH, прежде чем запускать скрипт «configure».

Примечание: Скрипт configure будет автоматически определять директории библиотек и include, если вы запустите configure —with_informix=yes . Вы можете переопределить это автоопределение, специфицировав «IFX_LIBDIR», «IFX_LIBS» и «IFX_INCDIR» в окружении. Скрипт configure также попытается определить версию вашего сервера Informix. Он установит переменную условной компиляции «HAVE_IFX_IUS», если ваша версия Informix >= 9.00.

Примечание: Убедитесь, что переменные окружения Informix INFORMIXDIR и INFORMIXSERVER доступны для PHP ifx-драйвера и что директория INFORMIX bin находится в PATH. Проверьте это, запустив скрипт, содержащий вызов phpinfo() , прежде чем начать тестирование. На выводе phpinfo() эти переменные должны быть перечислены. Это TRUE как для CGI php, так и для Apache mod_php. Вам может понадобиться установить эти переменные окружения в стартовом скрипте вашего Apache.

Совместно используемые библиотеки Informix также должны быть доступны загрузчику (проверьте LD_LINBRARY_PATH или ld.so.conf/ldconfig).

Некоторые замечания об использовании BLOB’ов (столбцы TEXT и BYTE): BLOB’ы нормально адресуются BLOB-идентификаторами. Запросы выборки возвращают «blob даст вам filename. Используйте нормальный I/O файлов для получения содержимого blob.

Для запросов insert/update вы обязаны создать эти «blob id’ы» самостоятельно с помощью » ifx_create_blob() ;». Затем подключите blob id’ы в массив и заместите blob-столбцы знаком вопроса (?) в строке запроса. Для update/insert вы ответственны за установку blob-содержимого с помощью ifx_update_blob() .

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

переменная конфигурации : ifx.textasvarchar

переменная конфигурации : ifx.byteasvarchar

ifx_textasvarchar(0) : использовать blob id’ы для select-запросов со столбцами TEXT

ifx_byteasvarchar(0) : использовать blob id’ы для select-запросов со столбцами BYTE

ifx_textasvarchar(1) : возвращать столбцы TEXT, как если бы они были столбцами VARCHAR, чтобы вам не нужно было использовать blob id’ы дляselect-запросов

ifx_byteasvarchar(1) : возвращать столбцы BYTE, как если бы они были столбцами VARCHAR, чтобы вам не нужно было использовать blob id’ы дляselect-запросов

переменная конфигурации : ifx.blobinfile

ifx_blobinfile_mode(0) : возвращать столбцы BYTE в памяти, blob id позволяет получать содержимое

ifx_blobinfile_mode(1) : возвращать столбцы BYTE в файле, blob id позволяет получать имя файла

Если вы устанавливаете для ifx_text/byteasvarchar значение 1, вы можете использовать столбцы TEXT и BYTE в select-запросах, как нормальные (но всё же long) поля VARCHAR. Поскольку все строки «подсчитаны» в PHP, он остаётся «binary safe». Вы обязаны обработать это корректно. Возвращаемые данные могут содержать всё что угодно, вы отвечаете за содержимое.

Если вы устанавливаете для ifx_blobinfile значение 1, используйте имя файла, возвращаемое ifx_get_blob(..), для получения blob-содержимого. Заметьте, что в этом случае ВЫ ОТВЕЧАЕТЕ ЗА УДАЛЕНИЕ ВРЕМЕННЫХ ФАЙЛОВ, СОЗДАННЫХ INFORMIX, когда извлекаете ряды. Каждый новый извлечённый ряд создаст новый временный файл для каждого столбца BYTE.

Размещение временных файлов может быть настроено переменной окружения «blobdir», по умолчанию «.» (текущая директория). Что-то вроде putenv(blobdir=tmpblob»); облегчит зачистку временных файлов, случайно пропущенных (имена их всех начинаются с «blb»).

Автоматическая доводка «char»-данных (SQLCHAR и SQLNCHAR): Это можно установить переменной окружения

ifx.charasvarchar : если установлено 1, ведомые пробелы автоматически удаляются, давая вам некоторое подобие «отсечения/chopping».

NULL -значения: Переменная конфигурации ifx.nullformat (и функция времени выполнения ifx_nullformat() ), если установлена в TRUE , возвратит NULL -столбцы как строку » NULL «, если установлена FALSE , они возвратят пустую строку. Это позволяет вам выбирать между NULL -столбцами и пустыми столбцами.

Это расширение не определяет никаких констант.

Содержание ifx_affected_rows — получает количество рядов, задействованных в запросе ifx_blobinfile_mode — устанавливает blob-режим по умолчанию для всех select-запросов ifx_byteasvarchar — устанавливает byte-режим по умолчанию ifx_close — закрывает соединение Informix ifx_connect — открывает серверное соединение Informix ifx_copy_blob — дублирует данный blob-объект ifx_create_blob — создаёт blob-объект ifx_create_char — создаёт char-объект ifx_do — выполняет ранее подготовленный SQL-оператор ifx_error — Возвращает код ошибки последнего вызова Informix ifx_errormsg — Возвращает сообщение об ошибке последнего вызова Informix ifx_fetch_row — получает ряд как перечислимый массив ifx_fieldproperties — выдаёт список свойств SQL-полей ifx_fieldtypes — выдаёт список Informix SQL-полей ifx_free_blob — удаляет blob-объект ifx_free_char — удаляет char-объект ifx_free_result — освобождает ресурсы для запроса ifx_get_blob — возвращает содержимое blob-объекта ifx_get_char — возвращает содержимое char-объекта ifx_getsqlca — получает содержимое sqlca.sqlerrd[0..5] после запроса ifx_htmltbl_result — форматирует все ряды запроса в виде HTML-таблицы ifx_nullformat — устанавливает return-значение по умолчанию при извлечении ряда ifx_num_fields — возвращает количество столбцов в запросе ifx_num_rows — подсчитывает ряды, уже извлечённые из запроса ifx_pconnect — открывает постоянное соединение Informix ifx_prepare — готовит SQL-оператор для выполнения ifx_query — отправляет Informix query ifx_textasvarchar — устанавливает текстовый режим по умолчанию ifx_update_blob — обновляет содержимое blob-объекта ifx_update_char — обновляет содержимое char-объекта ifxus_close_slob — удаляет slob-объект ifxus_create_slob — создаёт slob-объект и открывает его ifxus_free_slob — удаляет slob-объект ifxus_open_slob — открывает slob-объект ifxus_read_slob — читает n байт slob-объекта ifxus_seek_slob — устанавливает текущую позицию файла или поиска ifxus_tell_slob — возвращает текущую позицию файла или поиска ifxus_write_slob — записывает строку в slob-объект


Назад Оглавление Вперёд
imap_utf8 Вверх ifx_affected_rows

© 2006-2012 Веб-мастер Борисов Виктор Александрович

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL