powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Непонятки с IBEScript.dll
14 сообщений из 14, страница 1 из 1
Непонятки с IBEScript.dll
    #39538649
aidynchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго дня! Перешел с Delphi 7 на Delphi XE, не нужно спрашивать почему сразу не на XE10 :)
На 7ке код был рабочий, на XE же поломался.
Пытаюсь создать скрипт на отключение констрайнтов путем подключения к базе через IBEScript.dll.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
try
     Hndl := LoadLibrary(PChar('IBEScript.dll'));
     if (Hndl > HINSTANCE_ERROR) then
     begin
       ESP := GetProcAddress(Hndl, 'ExecScriptText');
       CP := GetProcAddress(Hndl, 'Connect');
       if (@ESP <> nil) and (@CP <> nil) then
       begin
         Res := CP(PChar('db_name=localhost:c:\ETALON.GDB; password=masterkey; user_name=SYSDBA;'
 +
                         'lc_ctype=win1251; sql_role_name=ADMIN; sql_dialect=3;' +
                         'clientlib="C:\Program Files\Firebird\Firebird_2_5\bin\fbclient.dll"'), @CEH);
         if Res = 0 then
           ESP(PChar(SCRIPT), @HandleError, @BeforeExec, @AfterExec);
         end;
       end;
   finally
     if Hndl > HINSTANCE_ERROR then
       FreeLibrary(Hndl);
   end;



где SCRIPT это

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
execute ibeblock
as
begin
  for select LIST('ALTER TABLE ' ||TRIM (rdb$relation_name) || ' DROP CONSTRAINT ' || TRIM(rdb$constraint_name) || ';', '
')
       from rdb$relation_constraints r
      where rdb$constraint_type = 'FOREIGN KEY'
      into :str
  do begin
    ibec_SaveToFile('C:\1.sql', str, __stfAppend);
  end
end;



уже само подключение почему-то дает ошибку и ошибка эта иреглифами идет, совершенно нечитабельно, во вложении
...
Рейтинг: 0 / 0
Непонятки с IBEScript.dll
    #39538650
aidynchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Непонятки с IBEScript.dll
    #39538654
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aidynchik,

а в этих ваших юникодах ничего не понимаю, конечно, но в
Код: pascal
1.
CP(PChar('d


попробуй заменить PChar на pAnsiChar
...
Рейтинг: 0 / 0
Непонятки с IBEScript.dll
    #39538674
aidynchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,

я поменял в месте обработки ошибки, обернул текст ошибки в PAnsiChar, спасибо за наводку.
Текст оказца такой "Database name is missing.", хотя я его же указал.
пробовал
Код: plsql
1.
Res := CP(PChar('DBname=c:\ETALON.GDB;


результата не дало
...
Рейтинг: 0 / 0
Непонятки с IBEScript.dll
    #39538679
aidynchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,

все, спасибо огромное, оказывается везде нужно было поменять на PAnsi, спасибо!
...
Рейтинг: 0 / 0
Непонятки с IBEScript.dll
    #39539452
Vladimir779
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aidynchik... оказывается везде нужно было поменять на PAnsi, спасибо!

с такой же задачей столкнулся, тоже поменял везде pChar на pAnsiChar но теперь пишет

IBEScript.dll
------- STATEMENT --------
A
------- ERROR --------
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, column 1.
A.



вместо

IBEScript.dllALTER TABLE RN0010 ADD CONSTRAINT FK_RN0010_01 FOREIGN KEY (ORGANIZATIONID) REFERENCES MK0010(ITEMID);

Берет только первую букву "А", может еще где-то нужно исправить ?
...
Рейтинг: 0 / 0
Непонятки с IBEScript.dll
    #39539458
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir779,

1. А у тебя скрипт - в какой кодировке?
2. А ты перед строкой коннекта указал SET NAMES? А ты его правильно задал?

Пример моего скрипта:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
set sql dialect 3;

SET NAMES UTF8;

set clientlib 'fbembed.dll';

connect database 'localhost/3100:D:\PROGRAM DESIGN\Delphi2007\BCustom_2_0\Data\DataNew2.fdb'
  user 'SYSDBA'
  password 'masterkey';


CREATE DOMAIN T_ACCESS_SQL AS 
VARCHAR(512) CHARACTER SET WIN1251
COLLATE WIN1251;
-- ...  и т.д.



Если лень разбираться - попробуй методом тыка:
Код: sql
1.
set names win_1251;

или
Код: sql
1.
SET NAMES UTF8;


и т.д.
...
Рейтинг: 0 / 0
Непонятки с IBEScript.dll
    #39539470
Vladimir779
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,

скрипт у меня находится в Memo - на форме,
вот полный текст скрипта

авторALTER TABLE RN0010 ADD CONSTRAINT FK_RN0010_01 FOREIGN KEY (ORGANIZATIONID) REFERENCES MK0010(ITEMID);

там до "SET NAMES UTF8;" - просто не доходит, оно цеплятет только первую букву "А"

вот что выдает в результате

автор------- STATEMENT --------
A
------- ERROR --------
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, column 1.
A.

при нажатии на кнопку выполняется код

Код: pascal
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.
procedure TForm1.Button1Click(Sender: TObject);
var
  Hndl : THandle;
  ESP : TExecuteScriptProc;
  CP :TConnectDBProc;
  s : string;
  Res : integer;
begin

  ErrCount := 0;
  StmtCount := 0;
  mLog.Lines.Clear;
  s := mScript.Text;

  if Trim(s) = '' then
  begin
    ShowMessage('Nothing to do!');
    Exit;
  end;

  try
    Hndl := LoadLibrary(pChar('IBEScript.dll'));
    if (Hndl > HINSTANCE_ERROR) then
    begin
      ESP := GetProcAddress(Hndl, 'ExecScriptText');
      CP  := GetProcAddress(Hndl, 'Connect');
      if (@ESP <> nil) and (@CP <> nil) then
      begin

        Res := CP(pAnsiChar('db_name=localhost:C:\777\DATA.FDB; password=masterkey; user_name=SYSDBA;' +
                            'lc_ctype=UTF8; sql_role_name=ADMIN; sql_dialect=3;' +
                            'clientlib="C:\Projects\IBEScriptDll\Win32\Debug\BIN\fbclient_32.dll"'), @CEH);
        if Res = 0 then begin
          Pages.ActivePage := tsOutput;
          ESP(pAnsiChar(s), @HandleError, @BeforeExec, @AfterExec);
        end;
      end;
    end;
  finally
    if Hndl > HINSTANCE_ERROR then
      FreeLibrary(Hndl);
  end;

end;



используется "Delphi 10 Seattle"

заметил особенность, что в процедуру

Код: pascal
1.
ESP(pAnsiChar(s), @HandleError, @BeforeExec, @AfterExec);



передается через pAnsiChar(s) - а это и есть как раз буква "А"
хотя если использовать pChar(s) - передается весь текст скрипта
...
Рейтинг: 0 / 0
Непонятки с IBEScript.dll
    #39539494
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vladimir779, внимательно смотри в каких кодировках (ansi, utf и т.п.) что находится:
s: string;
mScript.Text
ESP( параметр , ...
Возможно будет достаточно ESP(@s[1],
...
Рейтинг: 0 / 0
Непонятки с IBEScript.dll
    #39539539
Vladimir779
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freedoom...внимательно смотри в каких кодировках (ansi, utf и т.п.) что находится:...запустил в следующем виде
Код: pascal
1.
ESP(pAnsiChar('ALTER TABLE RN0010 ADD CONSTRAINT FK_RN0010_01 FOREIGN KEY (ORGANIZATIONID) REFERENCES MK0010(ITEMID);'), @HandleError, @BeforeExec, @AfterExec);


Скрипт замечательно отработался!!!
т.е. работает на прямую без присвоения переменной "s"
а скрипт

Код: pascal
1.
ESP(pAnsiChar(s), @HandleError, @BeforeExec, @AfterExec);


передает к выполнению только первую букву "А"

каким образом можно проверить, в какой кодировке хранятся данные в строковой переменной "s" - ?
...
Рейтинг: 0 / 0
Непонятки с IBEScript.dll
    #39539546
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir779Freedoom...внимательно смотри в каких кодировках (ansi, utf и т.п.) что находится:...запустил в следующем виде
Код: pascal
1.
ESP(pAnsiChar('ALTER TABLE RN0010 ADD CONSTRAINT FK_RN0010_01 FOREIGN KEY (ORGANIZATIONID) REFERENCES MK0010(ITEMID);'), @HandleError, @BeforeExec, @AfterExec);


Скрипт замечательно отработался!!!
т.е. работает на прямую без присвоения переменной "s"
а скрипт

Код: pascal
1.
ESP(pAnsiChar(s), @HandleError, @BeforeExec, @AfterExec);


передает к выполнению только первую букву "А"

каким образом можно проверить, в какой кодировке хранятся данные в строковой переменной "s" - ?

pAnsiChar(строковый литерал) - волшебным образом литерал переводится в ANSI, стало быть, передается указатель на строку в ANSI.

А pAnsiChar(строковая переменная) - тут ты как бы говоришь "я и сам не дурак, знаю, что в строке, давай мне адрес строки без разговоров". Компилятор просто возвращает указатель на начало цепочки символов строки.
Если у тебя в переменной юникод (а ты должен знать, что там у тебя - тыж программист или где?) - конвертируй сперва в (например) ANSI. Или сообщай приеёмнику (IBEScript.dll), что будем работать с юникодом.
...
Рейтинг: 0 / 0
Непонятки с IBEScript.dll
    #39539550
aidynchik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir779,

похоже я опоздал, но тоже была точно такая же ошибка, после того как подправил на ANSI. Поковырял и в общем вот так у меня счс работает
Код: pascal
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.
80.
81.
82.
83.
TConnectErrorCallbackFunc = function (AErrorMessage : AnsiString) : integer;  stdcall;
  TScriptErrorCallbackFunc = function (AStmtText, AErrMessage : AnsiString) : integer; stdcall;
  TScriptBeforeExecStatementFunc = function (AStmtText, AText : AnsiString) : integer; stdcall;
  TScriptAfterExecStatementFunc = function (AStmtText : AnsiString; Success : integer) : integer; stdcall;
  TScriptIBEBlockProgressFunc = function (AProgressMessage : AnsiString) : integer; stdcall;

  TExecuteScriptProc = procedure (AScriptFile : AnsiString;
                                  AErrorCallbackFunc : TScriptErrorCallbackFunc;
                                  ABeforeCallbackFunc : TScriptBeforeExecStatementFunc;
                                  AAfterCallbackFunc : TScriptAfterExecStatementFunc); stdcall;

  TExecuteScriptProc2 = procedure (AScriptFile : AnsiString;
                                  AErrorCallbackFunc : TScriptErrorCallbackFunc;
                                  ABeforeCallbackFunc : TScriptBeforeExecStatementFunc;
                                  AAfterCallbackFunc : TScriptAfterExecStatementFunc;
                                  AIBEBlockProgressFunc : TScriptIBEBlockProgressFunc); stdcall;

  TConnectDBProc = function (AConnectParams : AnsiString;
                             AConnectErrorCallbacFunc : TConnectErrorCallbackFunc) : integer; stdcall;

  function HandleError(AStmtText, AErrMessage : AnsiString) : integer; stdcall;
  function BeforeExec(AStmtText, AText : AnsiString) : integer; stdcall;
  function AfterExec(AStmtText : AnsiString; Success : integer) : integer; stdcall;
  function CEH(AErrorMessage : AnsiString) : integer;  stdcall;
*******

function HandleError(AStmtText, AErrMessage : AnsiString) : integer; stdcall;
begin
  Result := 0;
  UpgradeDBForm1.mLog.Lines.Add('------- STATEMENT --------');
  UpgradeDBForm1.mLog.Lines.Add(PAnsiChar(AStmtText));
  UpgradeDBForm1.mLog.Lines.Add('-------   ERROR   --------');
  UpgradeDBForm1.mLog.Lines.Add(PAnsiChar(AErrMessage));
end;

function BeforeExec(AStmtText, AText : AnsiString) : integer; stdcall;
begin
  Result := 0;
  if UpgradeDBForm1.FGlobalUpd then
    UpgradeDBForm1.ProgressBar.Position := UpgradeDBForm1.ProgressBar.Position + 1;
end;

function AfterExec(AStmtText : AnsiString; Success : integer) : integer; stdcall;
begin
  Result := 0;
  if Success = 1 then begin
    UpgradeDBForm1.SuccessUpd := True;
    if UpgradeDBForm1.FGlobalUpd then
      UpgradeDBForm1.ProgressBar.Position := UpgradeDBForm1.ProgressBar.Position + 1
    else
      UpgradeDBForm1.mLog.Lines.Add('Altering successfull...');
  end else begin
    Result := 1; // Abort script execution
    UpgradeDBForm1.SuccessUpd := False;
  end;
end;

function CEH(AErrorMessage : AnsiString) : integer;  stdcall;
begin
  UpgradeDBForm1.mLog.Lines.Add(AErrorMessage);
  UpgradeDBForm1.SuccessUpd := False;
end;

****
try
    Hndl := LoadLibrary(PChar('IBEScript.dll'));
    if (Hndl > HINSTANCE_ERROR) then
    begin
      ESP := GetProcAddress(Hndl, 'ExecScriptText');
      CP := GetProcAddress(Hndl, 'Connect');
      if (@ESP <> nil) and (@CP <> nil) then
      begin
       Res := CP(AnsiString('db_name='+ FFileNameEtalon + '; password=masterkey; user_name=sysdba;'+
                       'lc_ctype=win1251; sql_role_name=RDB$ADMIN; sql_dialect=3;' +
                       'clientlib="fbclient.dll"'), @CEH);
       if Res = 0 then
         ESP(AnsiString(s), @HandleError, @BeforeExec, @AfterExec);
      end;
    end;
  finally
    if Hndl > HINSTANCE_ERROR then
      FreeLibrary(Hndl);
  end;
...
Рейтинг: 0 / 0
Непонятки с IBEScript.dll
    #39539553
Vladimir779
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,

Благодарю за наводку, исправил
Код: pascal
1.
2.
var
  s : String;



на

Код: pascal
1.
2.
var
  s : AnsiString;



Спасибо!
...
Рейтинг: 0 / 0
Непонятки с IBEScript.dll
    #39539561
jmp_original
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vladimir779, даю рыбу:
Код: pascal
1.
ESP(pAnsiChar(AnsiString(s)), @HandleError, @BeforeExec, @AfterExec);


Удочку давать не буду.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Непонятки с IBEScript.dll
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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