Получение с помощью псевдозапроса
Синтаксические правила
BLOB GET {ROWID=< rowid записи > [< имя схемы >.]< имя таблицы >.< имя столбца > |[COLUMN=< номер столбца >]} [FILE=< спецификация файла >]
Все имена в команде могут задаваться в двойных кавычках.
blob get rowid=250 "Админ"."Авто"."Модель";
Описание
Опция ROWID
задает внутренний идентификатор строки в таблице, к которой относится BLOB-команда. При её использовании требуется обязательное указание имени столбца таблицы (не выборки данных !) с указанием имени таблицы и опционально имени схемы. При обработке данной опции СУБД самостоятельно
выполняет новый SELECT-запрос, для получения записи с указанным ROWID, в результате чего текущая выборка данных будет испорчена.
blob get rowid=250 auto.make;
Если задана опция COLUMN
, все операции с BLOB-данными применяются к указанному
столбцу текущей записи последней выборки данных. Отсчет столбцов начинается с
1. Если опция не задана, по умолчанию используется первый BLOB-столбец
выборки.
blob get column; blob get column=3;
Опция FILE
задает спецификацию файла (в терминах текущей ОС), в который должны
быть выгружены BLOB-данные. Возможность доступна только при сборке Qt-драйвера
с установленным макросом ENABLE_ACCESS_BLOBFILE
(по умолчанию выключен).
Если спецификация файла не задана, BLOB-данные будут извлекаться СУБД ЛИНТЕР в
текстовом виде в стандартный выходной поток с помощью функции printf
.
Примечание
В случае претрансляции запроса (псевдозапроса) существует возможность модифицировать его поведение путем привязки параметров. Это возможно только в случае операций над выборкой. На запрос с опцией ROWID
привязка параметров не действует.
Для команды GET
также возможна привязка 4 параметров:
-
параметр с номером 0 задает адрес массива типа
QByteArray
, который будет использован в качестве буфера для извлекаемых BLOB-данных. Размер буфера подразумевается равным размеру массиваQByteArray
(методsize()
). Если параметр не привязан, используется внутренний буферQByteArray
, выделяемый по размеру порции BLOB-значения. Если порция данных больше, чем массив байт, то заполняется весь массив, иначе только часть буфера с начала. Реальный размер возвращаемой порции можно получить с помощью методаsize QByteArray
после выполнения методаexec()
или в параметре с номером 1; -
параметр с номером 1 указывает размер буфера для извлекаемых BLOB-данных. Используется наименьший размер между заданным размером и размером массива
QByteArray
. Если параметр не привязан, подразумевается размер, равный размеру массиваQByteArray
; -
параметр с номером 2 указывает смещение требуемой порции BLOB-данных в BLOB-столбце. Если параметр не привязан, подразумевается смещение 0;
-
параметр с номером 3 указывает номер BLOB-столбца в выборке данных (отсчет начинается с 1). Если параметр не указан, подразумевается первый BLOB-столбец в выборке данных.
Команда GET
возвращает порцию BLOB-данных в привязанных параметрах с номерами 0
и 1 после выполнения метода exec()
. Значения параметров могут быть получены с
помощью метода boundValue
. В параметре с номером 1 возвращается реальная длина
полученной порции BLOB-данных, в параметре с номером 0 возвращаются буфер
данных, даже если он не был явно привязан.
По умолчанию результаты выборки BLOB-значения будут помещены во вновь созданную переменную типа QByteArray
, которая может быть получена методом boundValue
с аргументом 0.
q.exec("select * from test;"); q.exec("blob get column=2"); cout< < "Blob data:"< < q.boundValue(0).toString()< < endl;
Имеется возможность получить данные в заранее выделенный массив данных типа QByteArray
. Для этого необходимо выполнить prepare()
для запроса типа blob get
, привязать массив типа QByteArray
к нулевому параметру этого псевдозапроса методом QSqlQuery.bindValue(int, QVariant)
,
и выполнить его методом exec()
без аргументов. В этом случае полученные BLOB-значения BLOB-столбца будут сохранены в привязанном массиве QByteArray
.
QByteArray ba = QByteArray(128); q.prepare("blob get"); q.bindValue(0, ba); //QByteArray to return the data q.exec(); cout< < "Blob data in QByteArray:"< < ba< < " size QByteArray="< < ba.size()< < endl
Максимальная длина получаемых данных будет равна длине переменной QByteArray
, которую можно получить путем вызова методов size()
или length()
.
Имеется возможность установить явно максимальную длину запрашиваемых
BLOB-данных. Для этого ее необходимо привязать в параметре номер 1. В этом
случае максимальная длина данных выбирается как минимальная величина между
указанной явно длиной и размером буфера QByteArray
. С помощью этого же
параметра может быть получена реальная длина полученных BLOB-данных после выполнения псевдозапроса
blob get(QSqlQuery.exec(), QSqlQuery.boundValue(1).toInt())
Реальная длина прочитанной порции данных
может быть получена также методом size()
буфера QByteArray
.
q.bindValue(0, ba); //Can be skipped q.bindValue(1, 64); //max data length q.exec(); cout< < "Blob data in QByteArray:"< < ba< < " size ="< < q.boundValue(1).toInt()< < endl
Такое поведение параметра номер 1 (длины буфера) сохраняется и в случае, если параметр номер 0 (QByteArray
) был не привязан: привязывание параметра ограничивает максимальную длину получаемых данных, просмотр привязанных данных после исполнения позволяет получить реальную длину полученных данных. Последнее действительно даже в том случае, если параметр номер 1 не был привязан явно, максимальная длина возвращаемых данных соответствует длине BLOB-данных в данном столбце выборки.
q.exec("blob get"); // no any value was bound cout< < "Blob data length got by boundValue:"< < q.boundValue(1).toInt()
Имеются еще 2 параметра, которые также являются опциональными. Смещение получаемых BLOB-данных указывается в параметре номер 2: нулевое смещение соответствует началу BLOB-данных и подразумевается по умолчанию. Параметр номер 3 позволяет устанавливать номер столбца с BLOB-данными, так же, как это делает модификатор COLUMN
псевдозапроса.
Таким образом, команда blob get
может принимать до 4 параметров, каждый из которых является опциональным. Нулевой и первый параметры являются как входными, так и выходными и могут быть получены, даже если не были привязаны явно.
Получаемые BLOB-данные могут быть сохранены в заданный файл с помощью указания
опции FILE
. При сохранении в файл продолжают действовать ранее выполненные
привязки параметров, однако действуют они только на внутренний промежуточный
буфер хранения данных, который, в частном случае, может быть задан явно
привязкой нулевого параметра (с сохранением в нем данных).
q.exec("select * from test"); q.exec("blob get file=/home/user/blobfile.txt");