Можно ли написать большие строки в BLOB-объекте Firebird? - PullRequest
2 голосов
/ 18 декабря 2011

Документация для Firebird подразумевает, что вы можете записать большие (> 60 КБ) строки в значение BLOB-объекта в таблице.Итак, если у вас есть это:

CREATE TABLE MyBlobTable (
theId int PRIMARY KEY NOT NULL,
theBlob BLOB SUB_TYPE 1
)

Тогда это должно работать:

insert into MyBlobTable (theId, theBlob) values (1, '[60K characters in a string]')

(пример, вдохновленный http://web.firebirdsql.org/dotnetfirebird/blob-sub_type-1-reading-example-csharp.html)

Но я обнаружил, что ни C #драйверы и FlameRobin не могут записать это значение. Вы получаете «Неожиданный конец команды» (указывающий на точку около 32 КБ в строке, что немного подозрительно)

Я полагаю, что существует особый способ процитировать или экранироватьзначения данных, или, возможно, эквивалент C # этого Java-кода (http://www.firebirdfaq.org/faq372/), где двоичный файл считывается непосредственно в оператор. Я не делаю ничего сложного с текстовыми данными, поэтому я открыт для хранения его в виде двоичного файлаblob, если необходимо.

Спасибо!

Обновление: "параметризованные запросы" - это фраза, которую я искал. Что я делаю:

FbParameter param = new FbParameter("@blobVal", FbDbType.Text);
param.Value = myLargeString;
String query = "insert into MyBlobTable (theId, theBlob) values (1, @blobVal)";
using (FbConnection conn = [something from my pool]) {
    using (FbCommand cmd = new FbCommand(query, conn)) {
        cmd.Parameters.Add(param);
        cmd.ExecuteNonQuery();
    }
}

Ответы [ 3 ]

3 голосов
/ 19 декабря 2011

Вы добавляете текст, встроенный в запрос.Затем существуют ограничения: первый текст запроса в Firebird ограничен 64 КБ, также существует ограничение на размер varchar.

Если вы хотите добавить дополнительные данные в большой двоичный объект, вам необходимо передать егоBLOB-объектов с использованием параметризованных запросов.Смотрите пример: http://www.firebirdsql.org/en/net-examples-of-use/#update_text_blob_field

1 голос
/ 19 декабря 2011

Я думаю, что вы достигаете максимальной длины типа varchar(n) type limit - 32767 байт.Несмотря на то, что поле назначения - BLOB, API будет обрабатывать значение как varchar, так как вы предоставляете его как строковый литерал.Поэтому решение должно заключаться в использовании параметризованного запроса (извините, я сам не использую C # и, следовательно, не могу привести пример).

0 голосов
/ 18 декабря 2011

Возможно, эта большая строка слишком для оператора SQL.Я также прочитал здесь , что BLOB-объекты в Firebird не доступны через SQL для записи (но я не уверен, верна ли эта информация).

В любом случае, вы можете использовать потоки для записи /чтение блобов.Например, из SO: c # - чтение / запись большого двоичного объекта из firebird с использованием байтового массива для хранения, но он также должен работать со строками.

...