powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / xIBEScript.dll 64-bit
69 сообщений из 69, показаны все 3 страниц
xIBEScript.dll 64-bit
    #39978756
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заинтересованные в 64-битной версии IBEScript.dll для своих приложений есть?
Имеется xIBEScript.dll 64-bit; движок абсолютно новый, с нуля; состояние - пре-альфа, я бы сказал :)
Некоторые сложные функции в IBEBlock типа ibec_CompareTables, ibec_CompareMetadata пока не реализованы.
Выполнение стандартных SQL скриптов должно работать - этот функционал хочется отладить в первую очередь.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #39978780
AltHasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert,

О! Конечно интересно. А по какому адресу сие чудо можно скачать себе. Выложите URL, хочется по-тестировать.
А какие версии ЖП она поддерживает (2,3,4) ? Спасибо. Будем пробовать!
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #39978792
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AltHasp
А по какому адресу сие чудо можно скачать себе.


Выложил сюда:
https://www.ibexpert.com/rus/xIBEScript.sfx.exe

AltHasp
А какие версии ЖП она поддерживает (2,3,4) ?


Снаружи там [почти] все так же, как и в актуальных IBEscript.exe/dll
Специально поддержка каких-то версий не резалась, если только случайно.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #39984570
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавил реализацию ibec_ExtractMetadata, ibec_ExecSQLScript, ibec_CompareTables, ibec_CompareMetadata.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #39991296
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert,
Да, заинтересованные есть. Пока интересует выполнение скрипта создания БД на родном SQL без IBEBlock. Также интересует работоспособность подобного скрипта
database_update.sql
Код: 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.
execute ibeblock as
begin
  clib = ibec_GetGlobalVar('ClientLib', 'gds32.dll');
  BaseName = ibec_GetGlobalVar('dbName', ibec_ExtractFileName(ibec_GetCurrentDir()));

  ConnectionString = 'dbname=' || BaseName || ';user=sysdba;password=masterkey;clientlib=' || clib;
  conn = ibec_CreateConnection(__ctFirebird, ConnectionString);

  ibec_UseConnection(conn);

  select max(generation) from version_info into :GenValue;
  if (GenValue is null) then GenValue = 0;

  while (True) do begin
    GenNext = GenValue + 1;
    FileName = 'update_' || GenValue || '_' || GenNext || '.sql';
    if (not ibec_FileExists(FileName)) then break;

    ibec_Progress('');
    ibec_Progress('Executing script ' || FileName);

    cbb = 'execute ibeblock (BlockData variant) as
           begin
             sMessage = BlockData;
             if (sMessage is not null) then
               ibec_Progress(ibec_StringReplace(sMessage, '' : '', '' : ['' || ibec_Now || ''] '', 0));
           end';

    StartTime = ibec_GetTickCount;
    Msg = ibec_ExecSQLScript(conn, FileName, 'StopOnError=True', cbb);
    if (Msg is null) then
    begin
      ibec_Progress('Script executed successfully.');
    end
    else
    begin
      ibec_Progress('');
      ibec_Progress('Script executed with errors.');
    end;

    ibec_Progress('Total execution time: ' || (ibec_GetTickCount - StartTime) || 'ms');
    ibec_Progress('==================================================');
    
    insert into version_info (generation) values (:GenNext);
    commit;

    GenValue = GenNext;
  end;

  ibec_CloseConnection(conn);
end

Пока к сожалению проверить не могу. Еще не все переведено на 64-бит.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #39991301
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik
Пока к сожалению проверить не могу. Еще не все переведено на 64-бит.


Там в архиве кроме dll еще и экзешник есть, просто подсунуть ему скрипт.
Пока нашел одну проблему с вызовом функций без параметров:
StartTime = ibec_GetTickCount;
Без скобок - ibec_GetTickCount() - работать не будет, но это сейчас поправим.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40014494
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert , какие-то изменения в 64-битной версии с момента последнего поста появились?
Сейчас при вызове ibec_ExecSQLScript получаю такое сообщение:
-------- ERROR ----------
Unknown server version: . Known versions are: IB5X, IB61, IB65, IB70, IB71, IB75, IB2007, FB10, FB15, FB20, FB21, FB25, FB30, FB40, YA10.
Хотя 32-битное приложение работает нормально.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40014698
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik
какие-то изменения в 64-битной версии с момента последнего поста появились?


Да, там много. На днях обновлю - дам знать в этой теме.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40015838
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обновил.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40016503
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, к сожалению в одном из скриптов та же ошибка, про неизвестную версию сервера, и дополнительно получил

-------- ERROR ----------
PSQL terminator (;) expected but 'into' found

в скрипте
Код: plsql
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.
execute ibeblock as

declare ibeblock cbb (BlockData variant) as
begin
  sMessage = BlockData;
  if (sMessage is not null) then
    ibec_Progress(ibec_StringReplace(sMessage, ' : ', ' : [' || ibec_Now() || '] ', 0));
end;

begin
  clib = '"' || ibec_GetGlobalVar('ClientLib', 'gds32.dll') || '"';
  BaseName = ibec_GetGlobalVar('dbName', ibec_ExtractFileName(ibec_GetCurrentDir()));

  ibec_Progress('');
  ibec_Progress('BaseName = ' || BaseName);

  ConnectionString = 'dbname="' || BaseName || '";user=sysdba;password=masterkey;SQLDialect=3;names=win1251;clientlib=' || clib;
  conn = ibec_CreateConnection(__ctFirebird, ConnectionString);
  try
    ibec_UseConnection(conn);

    select max(generation) from version_info into :GenValue;
    if (GenValue is null) then GenValue = 0;

    while (True) do 
    begin
      GenNext = GenValue + 1;
      FileName = 'update_' || GenValue || '_' || GenNext || '.sql';
      if (not ibec_FileExists(FileName)) then break;

      ibec_Progress('');
      ibec_Progress('Executing script ' || FileName);

      StartTime = ibec_GetTickCount();
      Msg = ibec_ExecSQLScript(conn, FileName, 'StopOnError=True', cbb);
      if (Msg is null) then
      begin
        ibec_Progress('Script executed successfully.');
      end
      else
      begin
        ibec_Progress('');
        ibec_Progress('Script executed with errors.');
      end;

      ibec_Progress('Total execution time: ' || (ibec_GetTickCount() - StartTime) || 'ms');
      ibec_Progress('==================================================');
      
      insert into version_info (generation) values (:GenNext);
      commit;

      GenValue = GenNext;
    end;
  finally
    ibec_CloseConnection(conn);
  end
end
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40016597
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik
IBExpert, к сожалению в одном из скриптов та же ошибка, про неизвестную версию сервера


Исправил. Но версию сервера таки стоит указывать для пущей определенности: ServerVersion=FB25 или какая она там у тебя.

oleg_oleinik
и дополнительно получил

-------- ERROR ----------
PSQL terminator (;) expected but 'into' found


Тоже исправил.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40017226
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, версию сервера в общем случае я не знаю, он на стороне заказчика и 32-битная версия как-то нормально отрабатывала такое. Переданный мной скрипт так и не работает

-------- ERROR ----------
''='' expected but ';' found

Разный вывод результатов у 32/64 версий для одного и того же скрипта
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
execute ibeblock as
begin
  if (not exists (select id from mlist)) then 
  begin
    mark_name = ibec_GetGlobalVar('user_name', 'Тестовый маркшейдер');
    insert into mlist (name) values (:mark_name);
    commit;
  end;
end

32-битная версияD:\LGGT\Projects\Bases\Scripts\journals>..\..\..\FBLocal\IBEScript -GClientLib=fbembed.dll setup.sql
IBEScript Version 2020.11.9.1 Copyright (c) 2002-2020 IBExpert Ltd (www.ibexpert.com)
Executing script: setup.sql
(Line: 10) : Executing IBEBlock...


Error in script: setup.sql
Error occurred while executing following statement (line 10):
-------- STATEMENT ----------
IF not exists (select id from mlist)

-------- ERROR ----------
Cannot perform operation -- DB is not open.


Script executed with errors.
Total execution time: 0ms
64-битная версияD:\LGGT\Projects\Bases\Scripts\journals>..\..\..\FBLocal64\IBEScript -GClientLib=fbembed.dll setup.sql
xIBEScript Version 2020.11.9.1 (very Alpha) Copyright (c) 2002-2020 IBExpert KG (www.ibexpert.net)
Executing script: D:\LGGT\Projects\Bases\Scripts\journals\setup.sql
(Line: 1): Executing IBEBlock... FAILED!

Error occurred while executing following statement:
-------- STATEMENT ----------
execute ibeblock as
begin
if (not exists (select id from mlist)) then
begin
mark_name = ibec_GetGlobalVar('user_name', '???????? ??????????');
insert into mlist (name) values (:mark_name);
commit;
end;
end



-------- ERROR ----------
Cannot perform operation -- DB is not open.

Successful Time spent: 00:00.000
И непонятная кодировка результата второго скрипта. При перехвате вывода выяснилось, что это utf-8. Такое ощущение, что 64-битная версия и загружает скрипт в другой кодировке.

PS: Наша компания при переводе дельфийского приложения на 64 бита сначала убрала асмовские вставки, потом приведение типов pointer/integer заменили на pointer/int_ptr, ну и по мелочи. Я думал у вас также. А тут такое ощущение, что полностью новое приложение пишется.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40017412
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik
А тут такое ощущение, что полностью новое приложение пишется.


Об этом было сказано в самом первом сообщении темы: да, полностью новое.

Ну и на твоем блоке я могу только проверить работу парсера, а как блок выполняется - не могу.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40017589
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, так у меня скрипт видимо проверку синтаксиса не проходит.

-------- ERROR ----------
''='' expected but ';' found


для проверки скрипта в БД нужна таблица

Код: plsql
1.
2.
3.
CREATE TABLE VERSION_INFO (
    GENERATION  INTEGER
);



Запускаю на выполнение командой
xIBEScript -GClientLib=fbembed.dll -GdbName=[алиас БД] database_update.sql

во время работы скрипт ищет в текущей папке файлы с именами
update_0_1.sql
update_1_2.sql
...
и пытается выполнить все необходимые для обновления структуры БД
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40017608
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik
IBExpert, так у меня скрипт видимо проверку синтаксиса не проходит.

-------- ERROR ----------
''='' expected but ';' found


Да нет, твой блок у меня парсится без ошибок сейчас. А в этих update_0_1.sql что? Может, там парсер ошибки находит?
Он вообще доходит до выполнения этих скриптов или сразу ошибку выше выплевывает?

Завтра еще посмотрю, что там может быть.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40017702
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, update_0_1.sql это предполагается скрипт, сгенерированный через инструмент сравнения БД за минусом строки коннекта.
Но сейчас в папке нет ни одного такого файла.
Полный результат выполненияxIBEScript Version 2020.11.12.1 (very Alpha) Copyright (c) 2002-2020 IBExpert KG (www.ibexpert.net)

Executing script: D:\LGGT\Projects\Bases\Scripts\database_update.sql
(Line: 1): Executing IBEBlock... FAILED!

Error occurred while executing following statement:
-------- STATEMENT ----------
execute ibeblock as

declare ibeblock cbb (BlockData variant) as
begin
sMessage = BlockData;
if (sMessage is not null) then
ibec_Progress(ibec_StringReplace(sMessage, ' : ', ' : [' || ibec_Now() || '] ', 0));
end;

begin
clib = '"' || ibec_GetGlobalVar('ClientLib', 'gds32.dll') || '"';
BaseName = ibec_GetGlobalVar('dbName', ibec_ExtractFileName(ibec_GetCurrentDir()));

ibec_Progress('');
ibec_Progress('BaseName = ' || BaseName);

ConnectionString = 'dbname="' || BaseName || '";user=sysdba;password=masterkey;SQLDialect=3;names=win1251;clientlib=' || clib;
conn = ibec_CreateConnection(__ctFirebird, ConnectionString);
try
ibec_UseConnection(conn);

select max(generation) from version_info into :GenValue;
if (GenValue is null) then GenValue = 0;

while (True) do
begin
GenNext = GenValue + 1;
FileName = 'update_' || GenValue || '_' || GenNext || '.sql';
if (not ibec_FileExists(FileName)) then break;

ibec_Progress('');
ibec_Progress('Executing script ' || FileName);

StartTime = ibec_GetTickCount();
Msg = ibec_ExecSQLScript(conn, FileName, 'StopOnError=True', cbb);
if (Msg is null) then
begin
ibec_Progress('Script executed successfully.');
end
else
begin
ibec_Progress('');
ibec_Progress('Script executed with errors.');
end;

ibec_Progress('Total execution time: ' || (ibec_GetTickCount() - StartTime) || 'ms');
ibec_Progress('==================================================');

insert into version_info (generation) values (:GenNext);
commit;

GenValue = GenNext;
end;
finally
ibec_CloseConnection(conn);
end
end


-------- ERROR ----------
''='' expected but ';' found


Time spent: 00:00.000
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40018474
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik,

Исправил кое-что, и вывод об ошибке сделал более детальным.
Пробуй.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40018707
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, основной скрипт, вызываемый через IBEScript сейчас выполняется нормально.
Но есть еще замечания:
1. При отсутствии файла скрипта получаем циклическую ошибку
xIBEScript Version 2020.11.15.1 (very Alpha) Copyright (c) 2002-2020 IBExpert KG (www.ibexpert.net)

Executing script: D:\LGGT\Projects\Bases\Scripts\journals\test.sql
Exception at 000000010001C089: EFOpenError:
Unable to open file "test.sql".
xIBEScript Version 2020.11.15.1 (very Alpha) Copyright (c) 2002-2020 IBExpert KG (www.ibexpert.net)

Executing script: D:\LGGT\Projects\Bases\Scripts\journals\test.sql
Exception at 000000010001C089: EFOpenError:
Unable to open file "test.sql".
xIBEScript Version 2020.11.15.1 (very Alpha) Copyright (c) 2002-2020 IBExpert KG (www.ibexpert.net)

2. При вызове подчиненного скрипта через ibec_ExecSQLScript что-то неправильно с кодировкой.
Очень похоже на то, что описано здесь: https://www.sql.ru/forum/1328448/neponyatnoe-povedenie-ibec-createdatabase
Только закрытие БД и окрытие её заново в текущей ситуации не помогают.
Для тестов можно взять скрипты из той темы.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40023838
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обновил.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40027116
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, ошибка при отсутствии файла скрипта починилась, нашел новые

1. Если в скрипте последний "end" не заканчивается переводом строки или ";" - скрипт не парсится
Код: plaintext
xIBEScript Version 2020.12.2.1 (very Alpha) Copyright (c) 2002-2020 IBExpert KG (www.ibexpert.net)

Executing script: D:\LGGT\Projects\Bases\Scripts\test.sql
(Line: 1): Executing IBEBlock... FAILED! Error occured while parsing IBEBlock (line 1):
-------- STATEMENT (line 7/7) ----------
e

-------- ERROR ----------
''='' expected but '' found

Time spent: 00:00.000
2. Следующий скрипт не выполняется, даже если добавить в конце пустую строку
Код: plaintext
test.sqlexecute ibeblock as
begin
clib = '"' || ibec_GetGlobalVar('ClientLib', 'gds32.dll') || '"';
ConnectionString = 'dbname=test.fdb;user=sysdba;password=masterkey;SQLDialect=3;names=win1251;clientlib=' || clib;
conn = ibec_CreateDatabase(__ctFirebird, ConnectionString);
ibec_CloseConnection(conn);
end

Получаем ошибку
Код: plaintext
xIBEScript Version 2020.12.2.1 (very Alpha) Copyright (c) 2002-2020 IBExpert KG (www.ibexpert.net)

Executing script: D:\LGGT\Projects\Bases\Scripts\test.sql
(Line: 1): Executing IBEBlock... FAILED!

Error occured while executing IBEBlock (line 1):
-------- STATEMENT (line 5/5) ----------
conn = ibec_CreateDatabase(__ctFirebird, ConnectionString)

-------- ERROR ----------
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, column 28.
user_name.
----------------------------------
SQLCODE: -104
SQLSTATE: 42000
GDSCODE: 335544569

Successful

Time spent: 00:00.078
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40029422
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik,

Исправил обе проблемы.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40031386
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert,

Теперь в этом же скрипте ругается на sysdba
xIBEScript Version 2020.12.20.1 (very Alpha) Copyright (c) 2002-2020 IBExpert KG (www.ibexpert.net)
Executing script: D:\LGGT\Projects\Bases\Scripts\test.sql
(Line: 1): Executing IBEBlock... FAILED!

Error occured while executing IBEBlock (line 1):
-------- STATEMENT (line 5/5) ----------
conn = ibec_CreateDatabase(__ctFirebird, ConnectionString)

-------- ERROR ----------
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, column 33.
"sysdba".
----------------------------------
SQLCODE: -104
SQLSTATE: 42000
GDSCODE: 335544569

Successful
Time spent: 00:00.063
Если из строки коннекта убрать user=sysdba, то скрипт отрабатывает нормально.

В скрипте, вызванном через ibec_ExecSQLScript не отрабатывает DESCRIBE.
Error occurred while executing following statement (line 506):
-------- STATEMENT ----------
DESCRIBE DOMAIN DOM_BOOLEAN
'??? BOOLEAN ? ??????????? ?? ????'
-------- ERROR ----------
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, column 1.
DESCRIBE.
---------------------------------
SQLCODE: -104
SQLSTATE: 42000
GDSCODE: 335544569
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40034826
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обновил.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40035087
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert,
при выполнении
Код: plsql
1.
Msg = ibec_ExecSQLScript(conn, FileName, 'StopOnError=True', cbb);

происходит или порча значения conn или закрытие connection. После этой строчки получаем разные ошибки, в зависимости от того, что дальше происходит.
Error occured while executing IBEBlock (line 1):
-------- STATEMENT (line 55/55) ----------
ibec_CloseConnection(conn)

-------- ERROR ----------
Cannot perform operation -- DB is not open.
-------- ERROR ----------
There is no active connection.

FAILED!
Это происходит даже если вызываемый скрипт будет пустой.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40035481
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik

происходит или порча значения conn или закрытие connection.


Исправил.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40036085
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, почти все в моих скриптах выполнилось нормально.
Не отработали конструкции
Код: plsql
1.
2.
DESCRIBE FIELD HANGLE TABLE ST_RES
'Измеренный горизонтальный левый угол';


Error occurred while executing following statement (line 13):
-------- STATEMENT ----------
DESCRIBE
-------- ERROR ----------
Empty query.

(Line: 13) : [15.01.2021 13:39:33] Setting description for (something unknown: 900) ... FAILED!
и в другом скрипте аналогичная конструкция
Код: plsql
1.
2.
DESCRIBE FIELD HANGLETYPE TABLE ST_RES
'Тип измеряемого угла (0-левый, 1-правый)';


Error occurred while executing following statement (line 36):
-------- STATEMENT ----------
FIELD HANGLETYPE TABLE ST_RES
'??? ??????????? ???? (0-?????, 1-??????)'
-------- ERROR ----------
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, column 1.
FIELD.
---------------------------------
SQLCODE: -104
SQLSTATE: 42000
GDSCODE: 335544569

Оба скрипта вызываются через ibec_ExecSQLScript
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40036326
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik

Не отработали конструкции


Исправил.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40036573
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, спасибо.
Думал все заработало. Но нет, остался непонятный глюк.
При вызове следующего скрипта через ibec_ExecSQLScript появляется ошибка
test.sql
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
execute ibeblock as
begin
  if (not exists (select id from mlist)) then 
  begin
    mark_name = ibec_GetGlobalVar('user_name', 'Тестовый маркшейдер');
    insert into mlist (name) values (:mark_name);
    commit;
  end;
end;
Executing script setup.sql
(Line: 1) : [17.01.2021 16:20:55] Executing IBEBlock...
Error occurred while executing following statement (line 1):
-------- STATEMENT ----------
execute ibeblock as
begin
if (not exists (select id from mlist)) then
begin
mark_name = ibec_GetGlobalVar('user_name', '???????? ??????????');
insert into mlist (name) values (:mark_name);
commit;
end;
end
-------- ERROR ----------
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 2, column 13.
).
----------------------------------
SQLCODE: -104
SQLSTATE: 42000
GDSCODE: 335544569


Script executed with errors.
Total execution time: 0ms
==================================================

Time spent: 00:00.094
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40037171
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik

Думал все заработало. Но нет, остался непонятный глюк.
При вызове следующего скрипта через ibec_ExecSQLScript появляется ошибка


Исправил.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40037637
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, спасибо !!!
Мои скрипты все отработали без ошибок. Пора выпускать в более широкое Beta-тестирование ).
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40088979
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Столкнулся еще с одной ошибкой. Если в строке коннекта путь к clientlib будет содержат русские буквы, то получаем ошибку.
авторC:\Program Files (x86)\РУССКИЙ ПУТЬ\Bases\Scripts\journals>"C:\Program Files (x86)\РУССКИЙ ПУТЬ\FBLocal64\xIBEScript.exe" ..\database_update.sql -l"C:\Program Files (x86)\РУССКИЙ ПУТЬ\FBLocal64\fbembed.dll" -G"dbName=journals" -G"ClientLib=C:\Program Files (x86)\РУССКИЙ ПУТЬ\FBLocal64\fbembed.dll" -T -VIBEScript.log
xIBEScript Version (very Alpha) Copyright (c) 2002-2021 IBExpert KG (www.ibexpert.net)

Executing script: C:\Program Files (x86)\РУССКИЙ ПУТЬ\Bases\Scripts\database_update.sql
[05.08.2021 17:35:36] (Line: 1): Executing IBEBlock...

BaseName = journals
FAILED!

Error occured while executing IBEBlock (line 1):
-------- STATEMENT (line 18/18) ----------
conn = ibec_CreateConnection(__ctFirebird, ConnectionString)

-------- ERROR ----------
Client Library is missing or invalid: C:\Program Files (x86)\РУССКИЙ ПУТЬ\FBLocal64\fbembed.dll

Notice, that you have to use 32-bit client library even if you connect to 64-bit version of Firebird/InterBase
because IBExpert is a 32-bit application.
In case you specify a 64-bit version of client library dll instead of 32-bit one you can get this error.


Time spent: 00:00.000
Хотя файл fbembed.dll в папке присутствует и для нормальной работы достаточно переименовать папку, чтобы в пути к fbembed.dll не было русских букв.
database_drop.sqlexecute ibeblock as
begin
clib = '"' || ibec_GetGlobalVar('ClientLib', 'gds32.dll') || '"';
BaseName = ibec_GetGlobalVar('dbName', ibec_ExtractFileName(ibec_GetCurrentDir()));

ibec_Progress('');
ibec_Progress('BaseName = ' || BaseName);

ConnectionString = 'dbname="' || BaseName || '";user=sysdba;password=masterkey;clientlib=' || clib;
ibec_DropDatabase(__ctFirebird, ConnectionString);
end
database_drop.sql сохранен в кодировке windows-1251, вызов производится из командной строки.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40089124
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дополнительно: в следующем фрагменте вставка записи через параметр (оба варианта присвоения в test_var) происходит в неправильной кодировке. Второй insert выполняется нормально.
create.sql
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SET SQL DIALECT 3;
SET NAMES WIN1251;

create table test ( test varchar (60) );
commit;

execute ibeblock as
begin
/*  test_var = ibec_GetGlobalVar('test_var', 'Тестовая строка'); */
  test_var = 'Тестовая строка';
  insert into test (test) values (:test_var);
  commit;
  insert into test (test) values ('Тестовая строка');
  commit;
end;
Также прикладываю результат вызова этого скрипта из другого через ibec_ExecSQLScript.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40089129
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже, что ошибки в двух последних сообщениях связаны друг с другом. Видимо строковые переменные хранятся в кодировке UTF-8 и не преобразуются в кодировку скрипта при передаче в процедуры и функции и при использовании в качестве параметров.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40089610
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik
Похоже, что ошибки в двух последних сообщениях связаны друг с другом. Видимо строковые переменные хранятся в кодировке UTF-8 и не преобразуются в кодировку скрипта при передаче в процедуры и функции и при использовании в качестве параметров.


А сам скрипт в какой кодировке? Он в файле лежит или откуда ты его выполнял?
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40089727
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все скрипты у меня в кодировке Windows-1251. Все лежат отдельными файлами.
create.sql вызывается из другого скрипта, который тоже сохранен файлом на диске в папке на уровень выше текущей, вызывается через xIBEScript.exe. Архив со структурой скриптов прикладываю. Для теста распаковать в папку "C:\РУССКИЙ ПУТЬ\Bases\Scripts\". FireBird embedded вместе с xIBEScript.exe лежит в папке "C:\РУССКИЙ ПУТЬ\FBLocal64\"
Вызывать из текущей папки test. Образец вызова:
C:\РУССКИЙ ПУТЬ\Bases\Scripts\test>"C:\РУССКИЙ ПУТЬ\FBLocal64\xIBEScript.exe" ..\database_create.sql -l"C:\РУССКИЙ ПУТЬ\FBLocal64\fbembed.dll" -G"dbName=test" -G"ClientLib=C:\РУССКИЙ ПУТЬ\FBLocal64\fbembed.dll" -T -VIBEScript.log
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40090182
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik,

Исправил, но, возможно, где-то еще вылезет.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40091508
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, к сожалению вылезло
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
C:\РУССКИЙ ПУТЬ\Bases\Scripts\test>"C:\РУССКИЙ ПУТЬ\FBLocal64\xIBEScript.exe" ..\database_create.sql -l"C:\РУССКИЙ ПУТЬ\FBLocal64\fbembed.dll" -G"dbName=test.fdb" -G"ClientLib=C:\РУССКИЙ ПУТЬ\FBLocal64\fbembed.dll" -T -VIBEScript.log
xIBEScript Version  (very Alpha) Copyright (c) 2002-2021 IBExpert KG (www.ibexpert.net)

Executing script: C:\РУССКИЙ ПУТЬ\Bases\Scripts\database_create.sql
[18.08.2021 14:18:39] (Line: 1): Executing IBEBlock...

BaseName = test.fdb
 FAILED!

Error occured while executing IBEBlock (line 1):
--------  STATEMENT (line 18/18) ----------
conn = ibec_CreateDatabase(__ctFirebird, ConnectionString)

--------  ERROR ----------
Client Library is missing or invalid: C:\Р Р?РЎРЎР?Р?РT Р?Р?РўР┐\FBLocal64\fbembed.dll

Notice, that you have to use 32-bit client library even if you connect to 64-bit version of Firebird/InterBase
because IBExpert is a 32-bit application.
In case you specify a 64-bit version of client library dll instead of 32-bit one you can get this error.


Time spent: 00:00.000

Вставка записей теперь происходит в правильной кодировке, но путь к ClientLibrary все еще портится.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40092164
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik
к сожалению вылезло


Исправил.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40092190
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, сработало.
Спасибо !!!
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40100529
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, при использовании совместно с xIBEScript.exe опции -V выходные данные выводятся в файл в разных кодировках.
Сама первая строка "Executing script...." выводится в файл в кодировке UTF-8, а например сообщение об ошибке от сервера выводится в кодировке windows-1251. При чтении таких файлов возникает неудобство. Если ключ -V не использовать и выводить информацию на экран, то возникает обратная ситуация - первая строка читается нормально, а сообщение об ошибке отображается знаками вопроса. Текст использованного скрипта во вложении.
Вот пример выходных данных
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Executing script: C:\Program Files (x86)\ГИС ГЕОМИКС\Bases\Scripts\database_drop.sql
[28.09.2021 18:19:31] (Line: 1): Executing IBEBlock...

BaseName = journals
 FAILED!

Error occured while executing IBEBlock (line 1):
--------  STATEMENT (line 10/10) ----------
ibec_DropDatabase(__ctFirebird, ConnectionString)

--------  ERROR ----------
Unsuccessful execution caused by a system error that precludes successful execution of subsequent statements.
I/O error during "CreateFile (open)" operation for file "journals".
Error while trying to open file.
Не удается найти указанный файл. .
-------------------------------------------------------------------------------------------------------------
SQLCODE: -902
SQLSTATE: 08001
GDSCODE: 335544344


Time spent: 00:00.266
================================================================================
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40102218
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik,

Посмотри в свежей версии.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40114440
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, скачал очередное обновление и обнаружил в архиве дополнительно и 32-битную версию тоже. Я так понимаю она скомпилирована на тех же исходниках, что и 64-битная и в дальнейшем развитие IBEScript предполагается на их базе? Имеет смысл тестировать эту версию отдельно?
Попробовал запустить её - сразу получил сообщение об ошибке. При этом дальнейшая работа программы (вывод инструкции по использованию) выполнилась нормально. Если эта или другие библиотеки загружаются динамически, то может стоит их загружать несколько позже, на том этапе, где будет происходить действительная работа с БД ?
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40114948
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, тестировать отдельно 32-битную версию смысла нет.
Время будет, посмотрю что там с dll-ками, это в сторонних компонентах.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40134096
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert,
Подскажите, как можно создать глобальные переменные при использовании xIBEScript.dll ?
В ibesScriptExecuteFile передается только имя файла скрипта, а дополнительные параметры, которые в xIBEScript.exe передавались через глобальные переменные как передать ?
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40134116
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert,
Пытаюсь заменить вызов xIBEScript.exe на соответствующие вызовы xIBEcript.dll. В общем разобрался, в том числе и с глобальными переменными. Споткнулся на операторе reconnect. Из своей программы основной скрипт я вызываю либо через ibesScriptExecuteFile, либо через xIBEScript.exe, который внутри в свою очередь вызывает ibec_ExecSQLScript для другого файла скрипта.
Второй скрипт вылетает на операторе reconnect , если выполнение происходит через ibesScriptExecuteFile. Ну и соответственно дальше уже начинает вылетать основной скрипт, потому что слетел Connection.
Результат вызова через xIBEScript.exeExecuting script: D:\LGGT\Projects\Bases\Scripts\database_update.sql
[15.02.2022 0:27:18] (Line: 1): Executing IBEBlock...

BaseName = D:\LGGT\Projects\Bases\journals.fdb

Executing script update_1_2.sql
(Line: 1) : [15.02.2022 0:27:18] Reconnecting to 'D:\LGGT\Projects\Bases\journals.fdb'... Successful
Script executed successfully.
Total execution time: 94ms
==================================================

Time spent: 00:00.250
Результат вызова через ibesScriptExecuteFileExecuting script: D:\LGGT\Projects\Bases\Scripts\database_update.sql
[15.02.2022 00:08:30] Executing IBEBlock...
BaseName = D:\LGGT\Projects\Bases\journals.fdb

Executing script update_1_2.sql
Error occurred while executing following statement (line 1):
-------- STATEMENT ----------
reconnect
-------- ERROR ----------
Unsuccessful execution caused by a system error that precludes successful execution of subsequent statements.
connection shutdown.
-------------------------------------------------------------------------------------------------------------
SQLCODE: -902
SQLSTATE: 08003
GDSCODE: 335544856

(Line: 1) : [15.02.2022 0:08:31] Reconnecting to 'D:\LGGT\Projects\Bases\journals.fdb'... FAILED!

Script executed with errors.
Total execution time: 218ms
==================================================
There is no active connection.
Cannot perform operation -- DB is not open.
Второй скрипт состоит из одного оператора reconnect
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40134125
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik,

А как ты через xIBEScript.exe выполняешь скрипты сначала из одного файла, а потом на том же самом коннекте из другого файла??
Это возможно только через оператор INPUT в первом файле, в противном случае по завершении выполнения скрипта из первого файла коннект будет закрыт, и для второго скрипта его нужно создавать заново.

С ibesScriptExecuteFile точно так же должно быть, если коннект создается в самом скрипте. Или ты его извне создаешь через ibesConnectionInit?
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40134137
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, да все нормально работает. я же написал, что второй скрипт из первого вызывается через ibec_ExecSQLScript. Там и передается созданный Connection. Почищенные исходники во вложении. Через командную строку работает, через dll - вылет.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40134142
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, и еще на мой взгляд в файле интерфейса xIBEScriptIntf.pas присутствуют ошибки в определении типа строковых параметров. В том виде, в котором он присутствует в архиве использовать dll не получается - появляются ошибки. Пришлось взять за образец файл IBEScriptIntf.pas и заменить в xIBEScriptIntf.pas все типы PChar на PAnsiChar. Только тогда я смог выполнить скрипт из-под Delphi.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40134425
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik
IBExpert, да все нормально работает. я же написал, что второй скрипт из первого вызывается через ibec_ExecSQLScript. Там и передается созданный Connection. Почищенные исходники во вложении. Через командную строку работает, через dll - вылет.


У меня в тестовой демке все ОК. Меня смущает сообщение "connection shutdown." Т.е., попытка коннекта происходит, но сервер почему-то ругается вот такими словами. В dll и exe один и тот же код, так что и выполняться он должен абсолютно одинаково. Значит, дело в каких-то внешних по отношению к твоим скриптам данных.
Ты уверен, что у тебя там одна и та же клиентская либа используется в обоих случаях??
А вот еще: dbname=test.fdb. Ты embedded используешь что-ли?
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40134426
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik
IBExpert, и еще на мой взгляд в файле интерфейса xIBEScriptIntf.pas присутствуют ошибки в определении типа строковых параметров. В том виде, в котором он присутствует в архиве использовать dll не получается - появляются ошибки. Пришлось взять за образец файл IBEScriptIntf.pas и заменить в xIBEScriptIntf.pas все типы PChar на PAnsiChar. Только тогда я смог выполнить скрипт из-под Delphi.


Ну это в твоей дельфи PChar = PWideChar или что у тебя там. А в моей дельфи и в лазарусе PChar = PAnsiChar.
Но для ясности надо бы там на PAnsiChar заменить, да.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40134570
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert
Ты уверен, что у тебя там одна и та же клиентская либа используется в обоих случаях??
А вот еще: dbname=test.fdb. Ты embedded используешь что-ли?
Да, я использую embedded в качестве клиентской либы, это дает возможность работать при отсутствии сервера. В xIBEScript.exe путь к либе я передаю через параметр -l и дополнительно через глобальную переменную, для создания connection, это видно из первого скрипта. При работе с DLL глобальную переменную для либы для скрипта я установил (имя базы передается также и оно читается нормально, connection же создается).
Исходя из вопроса я провел исследование.
Ситуация 1: Для скрипта не устанавливаем путь к либе через глобальную переменную. Скрипт автоматом подставляет имя "gds32.dll" с кавычками. В программе на Delphi я перехватываю LoadLibraryExW и уже там меняю путь к либе и имя файла на fbembed.dll. LoadLibraryExW с именем gds32.dll за время работы скрипта вызывается 4 раза. В результате скрипт отрабатывает без ошибок.
Ситуация 2:
Устанавливаем в глобальную переменную путь к файлу fbembed.dll. LoadLibraryExW при этом вызывается 2 раза, после чего получаем ошибку на RECONNECT.
Исходя из исследований ошибка где-то внутри xIBEScript.dll, т.к. результат LoadLibraryExW в обоих случаях возвращается для одной и той же либы. Но в первом случае имя либы внутри скрипта = "gds32.dll", а во втором случае это полностью сформированный путь к fbembed.dll.
Т.е. чисто теоретически пользоваться DLL можно, но с костылями.

PS: Есть ошибка в ibesScriptFinalize. По документации функция должна возвращать 0, но она возвращает мусор.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40134696
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik,

1. Сервер какой версии ты используешь?
2. Как устанавливаешь глобальную переменную при использовании xIBEScript.dll?
3. Что происходит, если прописать полный путь к fbembed.dll прямо в строку коннекта?

Вот это у меня работает без проблем:
Код: plsql
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.
execute ibeblock
as

declare ibeblock cbb (BlockData variant) as
begin
  sMessage = BlockData;
  if (sMessage is not null) then
    ibec_Progress(ibec_StringReplace(sMessage, ' : ', ' : [' || ibec_Now() || '] ', 0));
end;

begin
  ibec_SetGlobalVar('ClientLib', 'D:\Projects_5\IBExpert\ClientLibs\x64\FB_40\fbclient.dll');
  clib = '"' || ibec_GetGlobalVar('ClientLib', 'gds32.dll') || '"';

  try
    DB = ibec_CreateConnection(__ctInterBase,
                               'DBName="avx-dell/3044:D:\Data\FB40_DATA\TIME_ZONES.FDB";
                               ClientLib=' || :clib || ';
                               User=SYSDBA; Password=masterkey; Names=UTF8; SqlDialect=3;');
    Msg = ibec_ExecSQLScript(DB, 'reconnect;', 'StopOnError=True', cbb);
    ibec_ShowMessage(Msg);

  finally
    ibec_CloseConnection(DB);
  end;
end;
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40134723
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, оказывается можно еще много чего поисследовать)).
Однако ваш скрипт с учетом моих изменений путей к либе и к базе тоже вылетает.
Вылетает во всех вариациях - устанавливаю ли я путь к либе через глобальную переменную именно в этом скрипте, присваиваю ли я этот путь напрямую в переменную или даже если я указываю его напрямую в строке коннекта.
Это ответ на 3-й вопрос. Теперь на первые:
1. Использую Firebird-2.5.9.27139-0_x64_embed.zip . С другими версиями сервера 3.x, 4.x мое приложение не тестировалось и скорее всего переход на них будет не скоро.
2. Для установки глобальной переменной использую следующую функцию
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure SetGlobalVar(Script: THandle; const VarName, Value: string);
var
  ScriptText: AnsiString;
begin
  ScriptText := Format('execute ibeblock as begin ibec_SetGlobalVar(%s, %s); end;',
    [AnsiQuotedStr(VarName, ''''), AnsiQuotedStr(Value, '''')]);
  CheckIBEResult(ibesScriptExecuteText(Script, PAnsiChar(ScriptText)));
end;
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40134741
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik,

Скачал клиента по твоей ссылке, упростил блок до предела, выполняю прямо в тестовой демке xIBEScript.dll:
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40134820
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, а у меня тогда что не так? )
Единственно, что приходит на ум - разница между Delphi и FreePascal, но это же все обвязка вокруг DLL.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40134851
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, так как у вас заработало только после того, как я установил правильные параметры connection и дополнительно к connection, который создается в скрите вызвал SetConnection перед вызовом ExecuteScriptText
Код: pascal
1.
2.
3.
4.
5.
6.
7.
  InitConnection;
  IBES.SetConnection(hConnection);
  try
    IBES.ExecuteScriptText(Memo1.Lines.Text);
  finally
    IBES.SetConnection(0);
  end;


Если же InitConnection убрать, то получаем ошибку как у меня. Но это не совсем правильно. Насколько я понимаю, вызов ibec_SetConnection должен выполнять те же действия, что и SetConnection в Delphi.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135022
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik
IBExpert, а у меня тогда что не так? )
Единственно, что приходит на ум - разница между Delphi и FreePascal, но это же все обвязка вокруг DLL.


Ну, есть еще вариант, что мы разные версии xIBEScript мучаем. Собственно, так оно и есть, просто я не помню, чтобы что-то правил по обсуждаемой теме. Но я выложил актуальную (свою) версию, так что попробуй ее.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135023
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik

Если же InitConnection убрать, то получаем ошибку как у меня. Но это не совсем правильно.


InitConnection - это для скриптов/блоков, в которых не создается собственный коннект. В данном случае он не нужен.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135038
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, попробовал - чуда не произошло.
Запускаю последний тестовый скрипт в DemoApp.
Если connection создается и устанавливается в Delphi - то скрипт отрабатывает без ошибок.
Если connection с теми же параметрами создается внутри скрипта - Cannot perform operation -- DB is not open.

С 32-битной версией xIBEScript те же ошибки, и дополнительно ошибка на скриншоте.

PS: Я попробую выполнить тестовый пример на другой машине на windows 10, может что-то в моей windows 11 накрутили.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135046
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну я бы еще для полноты картины сделал следующее:
1. Проверил скрипт на нормальном коннекте по TCP, чтобы удостовериться, что дело не в embedded.
2. В скрипте, который с reconnect, выполнил что-то, что не закрывает коннект. Чтобы убедиться, что коннект там рабочий.

А пока других идей у меня нет.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135055
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, при входе в скрипт коннект рабочий, с этим проблем нет.
Лог реального скриптаExecuting script update_1_2.sql
(Line: 1) : [17.02.2022 10:11:19] Setting connection charset (WIN1251)... Successful
(Line: 3) : [17.02.2022 10:11:19] Setting connection sql dialect (3)... Successful
(Line: 5) : [17.02.2022 10:11:19] SET... Successful
(Line: 10) : [17.02.2022 10:11:19] Altering procedure CHECK_POINT_NAME... Successful
(Line: 18) : [17.02.2022 10:11:19] Altering trigger POINTS_BI0... Successful
(Line: 23) : [17.02.2022 10:11:19] Altering trigger POINTS_BU0... Successful
(Line: 30) : [17.02.2022 10:11:19] Dropping procedure CHECK_POINT_NAME... Successful
(Line: 34) : [17.02.2022 10:11:19] Dropping trigger POINTS_BI0... Successful
(Line: 35) : [17.02.2022 10:11:19] Dropping trigger POINTS_BU0... Successful
Error occurred while executing following statement (line 39):
-------- STATEMENT ----------
RECONNECT
-------- ERROR ----------
Unsuccessful execution caused by a system error that precludes successful execution of subsequent statements.
connection shutdown.
-------------------------------------------------------------------------------------------------------------
SQLCODE: -902
SQLSTATE: 08003
GDSCODE: 335544856

(Line: 39) : [17.02.2022 10:11:20] Reconnecting to 'D:\LGGT\Projects\Bases\journals.fdb'... FAILED!

Script executed with errors.
Total execution time: 1719ms
==================================================

А вот куда он дальше девается - непонятно.
И да, с моей точки зрения embedded все-таки не виноват ) по двум причинам.
1. я пробовал подключаться этим же скриптом к базе на сервере, через fbclient.dll из дистрибутива сервера - результат тот же.
2. почему-то connection, созданный и установленный из Delphi отрабатывает reconnect нормально, независимо от пути к базе и к либе.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135060
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik,

Зачем ты все время дельфи какую-то упоминаешь и логи выполнения каких-то других скриптов выдаешь?
Это процесс никак не упрощает, только запутывает. Есть вон простейший блок, на котором твоя проблема у тебя воспроизводится, а у меня - нет. Вот этот блок и надо мучать в тестовой демке.
А твоих скриптов у меня нет, и дельфи твоей нет, и что ты там в своем приложении делаешь - я тоже не знаю и воспроизвести не могу.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135068
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня продолжают терзать смутные сомнения, что xIBEScript.dll у тебя старая. Тестовая демка ищет ее уровнем выше, ты в курсе?
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135262
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, кокретно язык Delphi тут не при чем, я проверил на fpc/Lazarus - тоже самое. Я имел ввиду, что connection должен быть установлен одним из способов либо в скрипте через ibec_UseConnection, либо в вызывающей программе через ibesSetConnection. Одного вызова ibec_CreateConnection в скрипте недостаточно, после этого не работают sql-запросы именно в этом скрипте. Хотя будут работать в том, который вызвать из него если при этом передать созданный connection.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135263
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, я смог локализовать проблему с reconnect, правда теперь не знаю, что с этим делать. Если я вызываю выполнение скрипта через dll сразу после старта моей программы - все работает нормально. Но если к базе, с которой работает скрипт предварительно создать connection средствами вызывающей программы (на Delphi я использую TIBDatabase), то все нормально работает до вызова reconnect. Причём не работает, даже если я перед вызовом скрипта разорву connection в программе. Т.е. сам connection в скрипте создаётся, остальные операторы ddl отрабатывают, а reconnect - не хочет.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135296
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, да, конечно я в курсе, где демка ищет xIBEScript.dll.
Концепция поменялась, я нашел другую, более простую причину, приводяющую к неработоспособности xIBEScript.dll.
Достаточно в программе вызывающей выполнение скрипта через dll предварительно сделать вызов:
LoadLibraryExW('ПУТЬ_К_КЛИЕНТСКОЙ_БИБЛИОТЕКЕ', 0, LOAD_WITH_ALTERED_SEARCH_PATH);
т.е. ровно то же самое, что делает xIBEScript.dll при создании connection - и все.
Изменения в uTestDLL.pas из DemoApp
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  // InitConnection;
  IBES.SetConnection(hConnection);
  try
    // Добавить следующую строку
    LoadLibraryExW('C:\Program Files\FireBird\FireBird_2_5\bin\fbclient.dll', 0, LOAD_WITH_ALTERED_SEARCH_PATH);
    IBES.ExecuteScriptText(Memo1.Lines.Text);
  finally
    IBES.SetConnection(0);
  end;


Текст скрипта для теста
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
execute ibeblock as
begin
  dbName = ibec_GetCurrentDir() || '\test.fdb';
  clib = 'C:\Program Files\FireBird\FireBird_2_5\bin\fbclient.dll';
  ConnString = 'dbName="localhost:' || dbName || '";clientlib="' || clib || '";user=sysdba;password=masterkey;names=utf8;SQLDialect=3';
  if (ibec_FileExists(dbName)) then
    conn = ibec_CreateConnection(__ctFirebird, ConnString);
  else
    conn = ibec_CreateDatabase(__ctFirebird, ConnString);
  try
    ibec_UseConnection(conn);
    select 'bla-bla' from rdb$database into :Msg;
    ibec_ShowMessage(Msg);
    Msg = ibec_ExecSQLScript(conn, 'reconnect;', 'StopOnError=True', null);
    if (Msg is null) then
      select 'bla-bla-bla' from rdb$database into :Msg;
    ibec_ShowMessage(Msg);
  finally
    ibec_CloseConnection(conn);
  end;
end;

Скрипт использует установленный локальный сервер и подключается к существующей или создает новую базу в текущей папке. Если в демке добавить вызов LoadLibraryExW - то reconnect не работает. Но от этого никуда не деться - загрузка клиентской либы выполняется любыми компонентами для работы с Firebird.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135365
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik

Достаточно в программе вызывающей выполнение скрипта через dll предварительно сделать вызов:
LoadLibraryExW('ПУТЬ_К_КЛИЕНТСКОЙ_БИБЛИОТЕКЕ', 0, LOAD_WITH_ALTERED_SEARCH_PATH);
т.е. ровно то же самое, что делает xIBEScript.dll при создании connection - и все.


Вооот... Теперь все понятно.

1. Сначала ты у себя в приложении грузишь клиентскую либу, потом то же самое делает xIBEScript.
2. RECONNECT сначала закрывает коннект и выгружает fbemded.dll.
3. Перед выгрузкой fbemded.dll от FB 2.5 выполняется fb_shutdown.
4. После вызова fb_shutdown использовать загруженную в адресное пространство приложения dll
(если она там осталась, а это так раз твой случай) уже нельзя, ее нужно выгрузить полностью и
загрузить снова.

Запретить скриптеру выполнять fb_shutdown можно установкой переменной окружения
IBECallFBShutdown в FALSE/0. Но тогда только ты отвечаешь за корректную выгрузку fbemded.dll.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135377
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, все сказанное относится и к не embedded версии, если это FB 2.5.
fb_shutdown в движке эксперта выполняется только для этой версии, проверка делается по версии клиентской библиотеки.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135680
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, спасибо.
Установка переменной окружения помогла, все заработало.
...
Рейтинг: 0 / 0
69 сообщений из 69, показаны все 3 страниц
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / xIBEScript.dll 64-bit
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (7): Анонимы (6), Yandex Bot 1 мин.
x
x
Закрыть


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