powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Непонятное поведение ibec_CreateDatabase
13 сообщений из 13, страница 1 из 1
Непонятное поведение ibec_CreateDatabase
    #39991295
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Пытаюсь вызвать скрипт наполнения созданной БД из другого скрипта через ibec_ExecSQLScript. Если использовать скрипт test1.sql в том виде, в котором он выложен, то получаем ошибку
Ошибка выполнения IBEScriptIBEScript Version 2020.8.11.1 Copyright (c) 2002-2020 IBExpert Ltd (www.ibexpert.com)

Executing script: test1.sql
(Line: 24) : Executing IBEBlock...
(Line: 4) : Creating domain DMN_BOOL... Successful
Error occurred while executing following statement (line 9):
-------- STATEMENT ----------
DESCRIBE DOMAIN DMN_BOOL
'Домен для хранения булевского типа
0 - ложь
!0 - истина'
-------- ERROR ----------
Incompatible column/host variable data type.
Dynamic SQL Error.
SQL error code = -303.
Malformed string.


(Line: 9) : Setting description for DMN_BOOL... FAILED!

Script executed successfully.
Total execution time: 109ms
Как я только не пытался менять параметры подключения - ничего не помогло. Единственный способ, которым я победил эту ошибку - это закрыть соединение с БД после её создания и заново открыть БД. Если в test1.sql убрать комментарий, то скрипт в результате выполняется без ошибок.
Выполнение без ошибокIBEScript Version 2020.8.11.1 Copyright (c) 2002-2020 IBExpert Ltd (www.ibexpert.com)

Executing script: test1.sql
(Line: 24) : Executing IBEBlock...
(Line: 4) : Creating domain DMN_BOOL... Successful
(Line: 9) : Setting description for DMN_BOOL... Successful

Script executed successfully.
Total execution time: 188ms
Ниже выкладываю тексты скриптов. Оба файла на диске в ansi-кодировке
test1.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.
execute ibeblock as
begin
  ConnectionString = 'dbname=test.fdb;user=sysdba;password=masterkey;SQLDialect=3;names=win1251';

  conn = ibec_CreateDatabase(__ctFirebird, ConnectionString);
/*
  ibec_CloseConnection(conn);
  conn = ibec_CreateConnection(__ctFirebird, ConnectionString);
*/
  try                     
    ibec_UseConnection(conn);

    cbb = 'execute ibeblock (BlockData variant) as
           begin
             sMessage = BlockData;
             if (sMessage is not null) then
               ibec_Progress(sMessage);
           end';

    Msg = ibec_ExecSQLScript(conn, 'test2.sql', 'StopOnError=True', cbb);
  finally
    ibec_CloseConnection(conn);
  end
end

test2.sql
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SET SQL DIALECT 3;
SET NAMES WIN1251;

CREATE DOMAIN DMN_BOOL AS SMALLINT DEFAULT 0 NOT NULL;

DESCRIBE DOMAIN DMN_BOOL
'Домен для хранения булевского типа
0 - ложь
!0 - истина';

...
Рейтинг: 0 / 0
Непонятное поведение ibec_CreateDatabase
    #39991297
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А сервер какой?
Я пока навскидку вижу проблему в строке коннекта: names=win1251 - это эквивалент SET NAMES WIN1251, а при создании БД синтаксис другой - DEFAULT CHARACTER SET WIN1251 - и в строке опций он должен быть указан как DefaultCharset=win1251.
Т.е., база у тебя создалась без указания дефолтового чарсета, как минимум.
...
Рейтинг: 0 / 0
Непонятное поведение ibec_CreateDatabase
    #39991299
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, FB версии 2.5.9.
Добавление DefaultCharset в ConnectionString
Код: sql
1.
ConnectionString = 'dbname=test.fdb;user=sysdba;password=masterkey;SQLDialect=3;DefaultCharset=win1251;names=win1251';

ситуации не изменило. Я же написал, что пробовал разные способы. Все, что описано в документации к ibec_CreateDatabase и к ConnectionString на сайте IBExpert.
...
Рейтинг: 0 / 0
Непонятное поведение ibec_CreateDatabase
    #39991323
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел... В общем, сейчас таки надо переконнекчиваться (что у тебя и делается в закомментированной части), потому что при создании БД получается коннект без указания чарсета - names=win1251 при создании просто игнорируется.
Поправим.
...
Рейтинг: 0 / 0
Непонятное поведение ibec_CreateDatabase
    #39991603
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй свежую версию.
Кое-что изменил: если DefaultCharset в строке коннекта отсутствует, то ibec_CreateDatabase возьмет его из names (если оно есть), т.е. DefaultCharset можно не прописывать дополнительно.

Кое-какие замечания безотносительно сабжа:
1. Вместо DESCRIBE надо использовать COMMENT ON.
2. Вместо
Код: plsql
1.
2.
3.
4.
5.
6.
cbb = 'execute ibeblock (BlockData variant) as
begin
  sMessage = BlockData;
  if (sMessage is not null) then
    ibec_Progress(sMessage);
end';


сейчас можно определять блок в секции деклараций:
Код: plsql
1.
2.
3.
4.
5.
6.
declare ibeblock cbb (BlockData variant) as
begin
  sMessage = BlockData;
  if (sMessage is not null) then
    ibec_Progress(sMessage);
end;
...
Рейтинг: 0 / 0
Непонятное поведение ibec_CreateDatabase
    #39991895
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, пробую, не получается, ничего не изменилось. Не вижу обновления.
Я качаю обновления с адреса, предназначенного для русской локали.
Возможно скачать ibescript где-то еще?
...
Рейтинг: 0 / 0
Непонятное поведение ibec_CreateDatabase
    #39991911
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik

Возможно скачать ibescript где-то еще?


Качай с тех же адресов. Я IBEScript просто не выкладывал - думал, ты сначала в эксперте проверишь.
Ну вот теперь выложил.
...
Рейтинг: 0 / 0
Непонятное поведение ibec_CreateDatabase
    #39991945
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, скачал обновление, проверил, есть замечание.
Если в строке коннекта есть names, но отсутствует DefaultCharset, ibec_CreateDatabase работает, как вы и написали.
А если присутствует DefaultCharset, но отсутствует names, то результат прежний. Такое ощущение, что значение DefaultCharset вообще не учитывается.
...
Рейтинг: 0 / 0
Непонятное поведение ibec_CreateDatabase
    #39991952
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert

сейчас можно определять блок в секции деклараций:
Не совсем понятно где эта секция должна находится?
Я вызываю скрипт из bat-файла через IBEScript.exe
Если я заменю test1.sql на следующий текст, то получаю ошибку:

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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
declare ibeblock cbb (BlockData variant) as
begin
  sMessage = BlockData;
  if (sMessage is not null) then
    ibec_Progress(ibec_StringReplace(sMessage, ' : ', ' : [' || ibec_Now || '] ', 0));
end;

execute ibeblock as
begin
  ConnectionString = 'dbname=test.fdb;user=sysdba;password=masterkey;sql_dialect=3;names=win1251';
  conn = ibec_CreateDatabase(__ctFirebird, ConnectionString);

  try                     
    ibec_UseConnection(conn);
    Msg = ibec_ExecSQLScript(conn, 'test2.sql', 'StopOnError=True', cbb);
  finally
   ibec_CloseConnection(conn);
  end
end;
...
Рейтинг: 0 / 0
Непонятное поведение ibec_CreateDatabase
    #39991981
AltHasp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik,

Запустил ваш пример, вот так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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
  ConnectionString = 'dbname=d:\test22.fdb;user=sysdba;password=masterkey;sql_dialect=3;names=win1251;clientlib=c:\123\fbclient.dll';
  conn = ibec_CreateDatabase(__ctFirebird, ConnectionString);

  try                     
    ibec_UseConnection(conn);
    Msg = ibec_ExecSQLScript(conn, 'd:\test2.sql', 'StopOnError=True', cbb);
  finally
   ibec_CloseConnection(conn);
  end
end;
...
Рейтинг: 0 / 0
Непонятное поведение ibec_CreateDatabase
    #39992019
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik
IBExpert, скачал обновление, проверил, есть замечание.
Если в строке коннекта есть names, но отсутствует DefaultCharset, ibec_CreateDatabase работает, как вы и написали.
А если присутствует DefaultCharset, но отсутствует names, то результат прежний. Такое ощущение, что значение DefaultCharset вообще не учитывается.


DefaultCharset - это дефолтовый чарсет базы, который указывается при ее создании.
Names - чарсет коннекта. Это разные вещи, и если тебе нужен коннект с чарсетом WIN1251, то names должно присутствовать в строке коннекта.
Так что все правильно работает.
...
Рейтинг: 0 / 0
Непонятное поведение ibec_CreateDatabase
    #39992020
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik
IBExpert

сейчас можно определять блок в секции деклараций:
Не совсем понятно где эта секция должна находится?


В секции деклараций: между AS и первым BEGIN, там же где и декларации переменных.
...
Рейтинг: 0 / 0
Непонятное поведение ibec_CreateDatabase
    #39992074
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AltHasp, Спасибо за рабочий пример. Просто документация на сайте отстает от реализации и не всегда достаточная.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Непонятное поведение ibec_CreateDatabase
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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