Получение с помощью псевдозапроса
Синтаксические правила
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");