powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / EOF in string detected при попытке передать в BLOB тело файла полученное ibec_LoadFromFile
16 сообщений из 16, страница 1 из 1
EOF in string detected при попытке передать в BLOB тело файла полученное ibec_LoadFromFile
    #39967676
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе утро!
Хотел поинтересоваться удалось ли решить указанную в заголовке поста проблему?

На всякий случай уточню что имею ввиду.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
execute ibeblock
as
begin

   -- загружаем в переменную тело файла с ЛОКАЛЬНОЙ машины:
   BLOB_BODY = ibec_LoadFromFile('C:\test.pdf');

   INSERT INTO T_BLOBS (
      BLOB_BODY ) 
   VALUES (
   -- пытаемся сохранить тело файла в базу на сервере:
   :BLOB_BODY );

end



вылетает исключение:
SQL Parse Error:

EOF in string detected


Если делать средствами UDF, то исключения не будет:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
execute ibeblock
as
begin

   -- BLOB_BODY = ibec_LoadFromFile('C:\test.pdf');

   INSERT INTO T_BLOBS (
      BLOB_BODY ) 
   VALUES (
   -- но тут мы загружаем файл с диска на сервере (и его туда нужно предварительно переместить), где крутится база:
   LOADBLOBFROMFILE('C:\test.pdf') );

end



Нужно грузить файлы именно с клиентской машины, поэтому UDF-ка не годится.

P.S.: Понятно, что если вместо pdf-ки будет текстовый файл, то такой скрипт сработает, но нужно грузить именно pdf.
P.P.S.: Как это сделать в Delphi я знаю. Но хотел сделать через скрипт чтобы иметь более гибкий инструмент, настраиваемый под клиентов без перекомпиляции приложения (в приложении скрипт грузится в приложение и отрабатывается через IBEScript.dll).
P.P.P.S.: На всякий случай: сами файлы я в базе не храню. Я её использую для диспетчерезации файлов. База как шлюз перекладывает тела файлов в специальный каталог, защищенный от пользователей правами. И по запросу вытягивает и передает пользователям экземпляры файлов. Таким образом осуществляется отслеживание версий файлов и хранение дополнительной информации (ключи для связи с контекстом и пользовательские индексы содержимого).
...
Рейтинг: 0 / 0
EOF in string detected при попытке передать в BLOB тело файла полученное ibec_LoadFromFile
    #39967876
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
execute ibeblock
as
begin

  SET BLOBFILE 'C:\test.pdf';

   INSERT INTO T_BLOBS (
      BLOB_BODY ) 
   VALUES (
     :hXXX_YYY );
end

Где XXX - шестнадцатеричное смещение первого байта, который хотим загрузить, YYY - смещение первого байта, который не нужно загружать . Т.е. если у вас файл размером 1000 байт, то должно быть
Код: sql
1.
2.
3.
4.
   INSERT INTO T_BLOBS (
      BLOB_BODY ) 
   VALUES (
     :h0_3e8 );
...
Рейтинг: 0 / 0
EOF in string detected при попытке передать в BLOB тело файла полученное ibec_LoadFromFile
    #39967881
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
YYY - смещение первого байта, который не нужно загружать .
Бред написал. YYY - длина загружаемого блока
...
Рейтинг: 0 / 0
EOF in string detected при попытке передать в BLOB тело файла полученное ibec_LoadFromFile
    #39967903
AltHasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nofate2009,

А DDL таблицы (T_BLOBS) и версию FB можно узнать.
...
Рейтинг: 0 / 0
EOF in string detected при попытке передать в BLOB тело файла полученное ibec_LoadFromFile
    #39967921
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AltHasp,
Код: sql
1.
BLOB SUB_TYPE 0 SEGMENT SIZE 8192 -- хотя размер только для 1 типа нужно, для типа 0 сервер его игнорирует


FB Server *32 v.2.1.5 18496
...
Рейтинг: 0 / 0
EOF in string detected при попытке передать в BLOB тело файла полученное ibec_LoadFromFile
    #39967926
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
Код: sql
1.
2.
3.
4.
5.
...
   INSERT INTO T_BLOBS (
      BLOB_BODY ) 
   VALUES (
     :h0_3e8 ); -- вот в этом месте по-подробнее бы хотелось



Я не уверен что такой синтаксис уместен в SQL-диалекте: :h0_3e8
И в диалекте IBEScript что-то не помню чтоб такой был.
Либо я не понял что имелось ввиду.
...
Рейтинг: 0 / 0
EOF in string detected при попытке передать в BLOB тело файла полученное ibec_LoadFromFile
    #39968266
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nofate2009
И в диалекте IBEScript что-то не помню чтоб такой был.
Тем не менее.

Сделайте экспорт таблицы с блобами в SQL скрипт, укажите сохранение в файл и изучайте
...
Рейтинг: 0 / 0
EOF in string detected при попытке передать в BLOB тело файла полученное ibec_LoadFromFile
    #39968446
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
nofate2009
И в диалекте IBEScript что-то не помню чтоб такой был.
Тем не менее.

Сделайте экспорт таблицы с блобами в SQL скрипт, укажите сохранение в файл и изучайте


Изучил.

Спасибо!!!

Не знал.
...
Рейтинг: 0 / 0
EOF in string detected при попытке передать в BLOB тело файла полученное ibec_LoadFromFile
    #39968449
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если кому-то потребуется, вот готовый скрипт IBE-блока, который грузит все файлы из заданного каталога в тестовую таблицу:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
/*
     IBE блок который загружает в тестовую таблицу TEST_BLOB_TABLE
     все файлы из каталога указанного в переменной DIR

     при возникновении ошибки в ходе загрузки
     выводится сообщение с соответствующим текстом
*/

/*
-- DDL-скрипт создания тестовой таблицы:
CREATE TABLE TEST_BLOB_TABLE (
    ID         INTEGER DEFAULT 0 NOT NULL,
    FILE_BODY  BLOB SUB_TYPE 0 SEGMENT SIZE 8192,
    FILE_NAME  VARCHAR(255) CHARACTER SET WIN1251
);

ALTER TABLE TEST_BLOB_TABLE ADD CONSTRAINT PK_TEST_BLOB_TABLE PRIMARY KEY (ID);
*/

execute ibeblock
as
 declare variable NEW_ID integer;
begin

    -- создаем блок для отработки сообщений при выполнении скрипта (можно и без него)
    CBB = 'execute ibeblock (BlockData variant)
             as
             begin
               sMessage = BlockData;
               if (sMessage is not null) then
                begin
                    ibec_Progress('  || ibec_Chr(39) || 'SQL Script: ' || ibec_Chr(39) || ' + sMessage );
                end;
             end';

    -- каталог с файлами для загрузки
    DIR = 'C:\pdf_test\';

    -- создаем массив с файлами из заданного каталога
    ibec_GetFiles(FILE_LIST, DIR, '*.*', __faReadOnly + __gfFullName );

    cnt      = ibec_High( FILE_LIST );

    -- получаем значение последнего ключа
    select first 1 t.id from test_blob_table t order by t.id desc into :NEW_ID;

    for indx = 0 to cnt do
    begin

        FILE_NAME = FILE_LIST[indx];

        FSIZE     = ibec_FileSize(FILE_NAME);
        -- создаем HEX-маску для загрузчика тела файла h[начальная позиция для чтения]_[длина загружаемого набора байт или просто размер файла]
        LOAD_HEX = ibec_Format('h0_%s', ibec_IntToHex(FSIZE, 0));
    
        -- увеличиваем значени для первичного ключа таблицы (так как в тестовой таблице у нас для этого нет генератора и тригера)
        NEW_ID = coalesce(NEW_ID,0) + 1;

        NEW_FILE_NAME = ibec_ExtractFileName(FILE_NAME);

        -- сам скрипт который будет грузить тело бинарного файла в блоб
        IBE_SCRIPT=     ibec_Format(
            '    SET BLOBFILE %s%s%s; '                                                             ||ibec_chr(13) ||
            '     insert into test_blob_table (ID, FILE_BODY, FILE_NAME) values (%d, :%s, %s%s%s);' ||ibec_chr(13) ||
            '     commit work;   ',
                        ibec_Chr(39), FILE_NAME,     ibec_Chr(39),
                        NEW_ID,
                        LOAD_HEX,
                        ibec_Chr(39), NEW_FILE_NAME, ibec_Chr(39)
                   );

            -- выполняем его и сохраням результат в переменную. если CBB не создавали - указываем вместо последнего параметра null
            EXECUTE_RESULT = ibec_ExecSQLScript( ibec_GetDefaultConnection, IBE_SCRIPT, 'ServerVersion=FB21; StopOnError=True', CBB);

            -- если в ходе выполнения скрипта возникла ошибка - выводим сообщение с текстом
            if (ibec_Pos('Error',EXECUTE_RESULT) > 0)
                then ibec_MessageDlg(EXECUTE_RESULT, __mtError, __mbOK);
    end;
end

...
Рейтинг: 0 / 0
EOF in string detected при попытке передать в BLOB тело файла полученное ibec_LoadFromFile
    #39968522
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nofate2009
Код: sql
1.
ibec_chr(13)

заменяется на ibec_CrLf()
nofate2009
Код: sql
1.
ibec_Chr(39)

заменяется на двойной апостроф

Итого
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
        IBE_SCRIPT=     ibec_Format(
            '    SET BLOBFILE ''%s''; '                                                             ||ibec_crlf() ||
            '     insert into test_blob_table (ID, FILE_BODY, FILE_NAME) values (%d, :%s, ''%s'');' ||ibec_crlf() ||
            '     commit work;   ',
                        FILE_NAME,
                        NEW_ID,
                        LOAD_HEX,
                        NEW_FILE_NAME
                   );
...
Рейтинг: 0 / 0
EOF in string detected при попытке передать в BLOB тело файла полученное ibec_LoadFromFile
    #39969101
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,
спасибо!

Поправил:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
/*
     IBE блок который загружает в тестовую таблицу TEST_BLOB_TABLE
     все файлы из каталога указанного в переменной DIR

     при возникновении ошибки в ходе загрузки
     выводится сообщение с соответствующим текстом
*/

/*
-- DDL-скрипт создания тестовой таблицы:
CREATE TABLE TEST_BLOB_TABLE (
    ID         INTEGER DEFAULT 0 NOT NULL,
    FILE_BODY  BLOB SUB_TYPE 0 SEGMENT SIZE 8192,
    FILE_NAME  VARCHAR(255) CHARACTER SET WIN1251
);

ALTER TABLE TEST_BLOB_TABLE ADD CONSTRAINT PK_TEST_BLOB_TABLE PRIMARY KEY (ID);
*/

execute ibeblock
as
 declare variable NEW_ID integer;
begin

    -- создаем блок для отработки сообщений при выполнении скрипта (можно и без него)
    CBB = 'execute ibeblock (BlockData variant)
             as
             begin
               sMessage = BlockData;
               if (sMessage is not null) then
                begin
                    ibec_Progress(''SQL Script: '' + sMessage );
                end;
             end';

    -- каталог с файлами для загрузки
    DIR = 'C:\pdf_test\';

    -- создаем массив с файлами из заданного каталога
    ibec_GetFiles(FILE_LIST, DIR, '*.*', __faReadOnly + __gfFullName );

    cnt      = ibec_High( FILE_LIST );

    -- получаем значение последнего ключа
    select first 1 t.id from test_blob_table t order by t.id desc into :NEW_ID;

    for indx = 0 to cnt do
    begin

        FILE_NAME = FILE_LIST[indx];

        FSIZE     = ibec_FileSize(FILE_NAME);
        -- создаем HEX-маску для загрузчика тела файла h[начальная позиция для чтения]_[длина загружаемого набора байт или просто размер файла]
        LOAD_HEX = ibec_Format('h0_%s', ibec_IntToHex(FSIZE, 0));
    
        -- увеличиваем значение для первичного ключа таблицы (так как в тестовой таблице у нас для этого нет генератора и триггера)
        NEW_ID = coalesce(NEW_ID,0) + 1;

        NEW_FILE_NAME = ibec_ExtractFileName(FILE_NAME);

        -- сам скрипт который будет грузить тело бинарного файла в блоб
        IBE_SCRIPT=     ibec_Format(
            '    SET BLOBFILE ''%s''; '                                                             ||ibec_crlf ||
            '     insert into test_blob_table (ID, FILE_BODY, FILE_NAME) values (%d, :%s, ''%s'');' ||ibec_crlf ||
            '     commit work;   ',
                        FILE_NAME,
                        NEW_ID,
                        LOAD_HEX,
                        NEW_FILE_NAME
                   );

            -- выполняем его и сохраняем результат в переменную. если CBB не создавали - указываем вместо последнего параметра null
            EXECUTE_RESULT = ibec_ExecSQLScript( ibec_GetDefaultConnection, IBE_SCRIPT, 'ServerVersion=FB21; StopOnError=True', CBB);

            -- если в ходе выполнения скрипта возникла ошибка - выводим сообщение с текстом
            if (ibec_Pos('Error',EXECUTE_RESULT) > 0)
                then ibec_MessageDlg(EXECUTE_RESULT, __mtError, __mbOK);
    end;
end

...
Рейтинг: 0 / 0
EOF in string detected при попытке передать в BLOB тело файла полученное ibec_LoadFromFile
    #39969189
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nofate2009

Хотел поинтересоваться удалось ли решить указанную в заголовке поста проблему?
На всякий случай уточню что имею ввиду.


Проблему решить не удалось, потому что такая проблема мне неизвестна. Сегодня узнал о ней впервые.
Будет воспроизводимый пример - будем решать. А теоретически блок в начальном сообщении должен работать без проблем.
...
Рейтинг: 0 / 0
EOF in string detected при попытке передать в BLOB тело файла полученное ibec_LoadFromFile
    #39969195
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Бред написал. YYY - длина загружаемого блока


SET BLOBFILE только в sql-скриптах работает, IBEBlock ничего про нее не знает. И про кодирование смещения/длины блоба в имени параметра - тоже.
Так что да, бред :)
...
Рейтинг: 0 / 0
EOF in string detected при попытке передать в BLOB тело файла полученное ibec_LoadFromFile
    #39969969
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert,
Вы абсолютно правы!

Разобрался с причинами ошибки озвученной в названии ветки.

Оказалось дело было в другом, а метод ibec_LoadFromFile работает нормально и штатно пишет тело файла в переменную, которая потом успешно передается как параметр INSERT-запроса.

Проблема была вот в чём.

У меня в целевой таблице было такое поле
Код: sql
1.
2.
3.
...
    USER_TYPE_ID      INTEGER,
...


и когда в скрипте я пытался определить что передавать в качестве переменной число или null таким образом:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
    insert into t_crm_archive_files
    (
        id,
        cid,
        context_id,
        user_type_id,
        file_body,
        file_name,
        file_ext,
        note,
        create$user
    )
    values
    (
      :FLID,
      :CID,
      :CONTEXT_ID,
      -- вот тут была ошибка: --------------
      IIF(:USER_TYPE = 0, null, :USER_TYPE),
      --------------------------------------
      :FILE_BODY,
      :FILENAME,
      :EXT,
      :NOTE,
      :USER_NAME
    );


- ловил эту ошибку: EOF in string detected .

лечилось это просто:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
    
    -- заранее готовим переменную 
USER_TYPE = ibec_IIF(USER_TYPE = 0, null, USER_TYPE);

    try
        insert into t_crm_archive_files
        (
            id,
            cid,
            context_id,
            user_type_id,
            file_body,
            file_name,
            file_ext,
            note,
            create$user
        )
        values
        (
          :FLID,
          :CID,
          :CONTEXT_ID,
          -- теперь запрос успешно переваривает и NULL и целое число:
          :USER_TYPE,
          -----------------------------------------------------------
          :FILE_BODY,
          :FILENAME,
          :EXT,
          :NOTE,
          :USER_NAME
        );



Прошу прощения что написал тестовый пример (который как-бы, как я полагал должен демонстрировать ошибку без прогона у себя). Был уверен что проблема с символом конца строки в теле читаемого файла, который воспринимается как EOF! <рукалицо>

Зато узнал про костыль, как еще можно грузить блобы по HEX-маске))
...
Рейтинг: 0 / 0
EOF in string detected при попытке передать в BLOB тело файла полученное ibec_LoadFromFile
    #39970014
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nofate2009

- ловил эту ошибку: EOF in string detected .


Это потому, что препарирование твоего INSERT'а дает ошибку, и приходится подставлять значения параметров прямо в текст запроса.
Что в случае блоба его - текст запроса - запросто может испортить.

Ну и по соседнему твоему топику жду ответа. Есть кое-какие идеи, но я не совсем понял проблему.
...
Рейтинг: 0 / 0
EOF in string detected при попытке передать в BLOB тело файла полученное ibec_LoadFromFile
    #39970571
nofate2009
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert,

Да, я понял. Большое спасибо!)

Я и сам тоже так подумал, когда нашел причину ))

P.S.: По другой ветке - отписался там максимально подробно.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / EOF in string detected при попытке передать в BLOB тело файла полученное ibec_LoadFromFile
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]