powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Exception на русском как сделать FB 3?
20 сообщений из 20, страница 1 из 1
Exception на русском как сделать FB 3?
    #39712303
RADSeatle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем
Подскажите как сделать Exception на русском FB 3?

База UTF8
Использую компонент Devart Unidac - UseUnicode = True

На русском не показывает текст ошибки

Заранее благодарен
...
Рейтинг: 0 / 0
Exception на русском как сделать FB 3?
    #39712312
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RADSeatle,

а как ты делаешь, и в чем не показывает?
...
Рейтинг: 0 / 0
Exception на русском как сделать FB 3?
    #39712313
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Exception на русском как сделать FB 3?
    #39712318
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RADSeatle,

а в IB Expert показывает?

Используешь EXCEPTION ... USING?
...
Рейтинг: 0 / 0
Exception на русском как сделать FB 3?
    #39712386
RADSeatle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов ДенисRADSeatle,

а в IB Expert показывает?

Используешь EXCEPTION ... USING?


Нет не показывает

Пример
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE EXCEPTION E_ERR 'Тест ошибка';


create or alter procedure RUN_EXCEPT
as
begin
  /* Procedure Text */
  EXCEPTION e_err  ;
end

execute procedure run_except


ответ Ibexpert  и в программе также отображается
E_ERR.
Тест ошибка.
At procedure 'RUN_EXCEPT' line: 5, col: 3.
...
Рейтинг: 0 / 0
Exception на русском как сделать FB 3?
    #39712390
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RADSeatle,

кодировка текста при наборе ddl, кодировка коннекта?
...
Рейтинг: 0 / 0
Exception на русском как сделать FB 3?
    #39712391
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RADSeatle,

"база utf8" - это ни о чем не говорит.
Надо - чарсет коннекта приложения и ибэксперта, и на чем написано приложение.
Собственно, "декодер" пишет, что сообщение перекодировано из win1251 в utf8.
...
Рейтинг: 0 / 0
Exception на русском как сделать FB 3?
    #39712407
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RADSeatleПодскажите как сделать Exception на русском FB 3?

Никак, обломись. На данный момент это не будет работать от слова "совсем".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Exception на русском как сделать FB 3?
    #39712460
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНикак, обломись. На данный момент это не будет работать от слова "совсем".


Ну почему... Надо просто создать исключение в коннекте с чарсетом 1251.
...
Рейтинг: 0 / 0
Exception на русском как сделать FB 3?
    #39712477
RADSeatle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
здесь на форуме нашел такой метод пока не пробовал
Код: 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.
CREATE PROCEDURE ERROR (
E VARCHAR(2000))
AS
DECLARE VARIABLE EE VARCHAR(78);
BEGIN
EE='';
EE=:E;
/*если входной параметр больше чем 78 то тут возникает ошибка
которая успешно обрабатывается ниже*/
UPDATE rdb$exceptions
SET rdb$message=:E
WHERE rdb$exception_name='ERR';
EXCEPTION ERR;
/*сюда попадаем только если входной параметр Е больше 78 символов*/
/*EE - содержит 78 символов в обрезанных от E*/
when any do
begin
UPDATE rdb$exceptions
SET rdb$message=:EE
WHERE rdb$exception_name='ERR';
EXCEPTION ERR;
end
END
2. Потом вызываешь ее в процедурах или тригерах!
if ((Current_DATE = NEW.tdata) AND (Current_TIME > GO_NEXT_DAY)) then
// Вот ее вызов
execute procedure error('Блин уже позно что то менять!'); 




А сейчас работает так через setcontext и getcontext насколько это правильно не знаю

Код: 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.
Procedure runtest

-- if --какие то действие
   RDB$SET_CONTEXT('USER_SESSION', 'EX_ERR', 'ТЕСТ ОШИБКА')
exception  e_err   







В клиенте  

try
  runProcedure;
  query.sql:= ' select RDB$SET_CONTEXT('USER_SESSION', 'EX_ERR', null) from dual' 
  query.execute;  

except
   when
    e_err 
     query.sql:= ' select RDB$GET_CONTEXT('USER_SESSION', 'EX_ERR') errtx from dual' 
     query.open
     showmessage (query.fieldbyname(errtx).asstring)
     query.close
end 
...
Рейтинг: 0 / 0
Exception на русском как сделать FB 3?
    #39712483
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
03.10.2018 14:48, RADSeatle пишет:
> здесь на форуме нашел такой метод...

аффтара! аффтара!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Exception на русском как сделать FB 3?
    #39712486
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RADSeatleздесь на форуме нашел такой метод пока не пробовал


Пипец... Ты определись, что тебе нужно. То, что тебе эксперт показывает, это тоже "на русском", только в UTF8.
Сервер не перекодирует сообщения исключений в чарсет коннекта, а отдает их как есть.
Поэтому ты либо сам должен определить, что тебе там прилетело в сообщении, и при необходимости перекодировать на клиенте.
Либо создавай исключения в той кодировке, которую твое приложение нормально отобразит без перекодирования.
...
Рейтинг: 0 / 0
Exception на русском как сделать FB 3?
    #39712487
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RADSeatle,

все эти мутные схемы всё равно плохо работают. До тех пор пока Exception будет хранится с кодировкой NONE никаких гарантий не будет
...
Рейтинг: 0 / 0
Exception на русском как сделать FB 3?
    #39712489
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
03.10.2018 14:59, Симонов Денис пишет:
> До тех пор пока Exception будет хранится с кодировкой NONE никаких гарантий не будет

пока оно с NONE, совершенно пофиг что там сидит.
всё на откуп программастам.

зы: максимальную длину увеличили с 77, и слава Аллаху!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Exception на русском как сделать FB 3?
    #39712512
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

Когда-то давно некий Дед приводил пример исключения "Милый пользователь, пишет тебе ...." - в 77 символов вложился
...
Рейтинг: 0 / 0
Exception на русском как сделать FB 3?
    #39712519
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помнится, в ФИБах в ErrorHandlerFIBErrorEvent можно было на клиенте отловить GDSCode в виде EFIBError.IBErrorCode. ЕМНИП, пользовательские исключения всегда возвращали 335544517, а уже по порядковому номеру исключений в списке в базе (ErrorHandler.ExceptionNumber) легко можно было написать какой угодно текст на клиенте. Не знаю, есть ли такой функционал в унидаке.
...
Рейтинг: 0 / 0
Exception на русском как сделать FB 3?
    #39713814
Фотография aleksandr-pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RADSeatle,

Кстати да вот буквально на днях в очередной раз бились с этой проблемой как раз FibPlus . . удалось исправить ситуацию поправив
одну строчку в Fib.pas а именно добавили конвертирование сообщение из UTF8 в процедуру
Код: pascal
1.
procedure IBError(ClientLibrary:IIbClientLibrary;Sender:TObject);

решение конечно костыльное так как внутри процедуры не удалось проверить charset базы, но меня устраивает. Да может и допилим в дальнейшем

полная процедура может кому сгодится

Код: 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.
84.
85.
86.
87.
88.
89.
90.
91.
procedure IBError(ClientLibrary:IIbClientLibrary;Sender:TObject);
var
  sqlcode: Long;
  local_buffer: array[0..FIBHugeLocalBufferLength - 1] of AnsiChar;
  vIBMessage:string;
  vSQLMessage:string;
  status_vector: PISC_STATUS;
  IBErrorMessages: TIBErrorMessages;

  vEFIBInterBaseError                   : EFIBInterBaseError  ;
  vRaiseExcept :boolean;
  tmpStr  :Ansistring;
  L:integer;
begin
  (*
   * Initialize the working user message.
   * Get a local reference to the status vector.
   * Get a local copy of the IBErrorMessages options.
   * Get the SQL error code.
   *)
  status_vector := StatusVector;
  IBErrorMessages := GetIBErrorMessages;
  sqlcode := ClientLibrary.isc_sqlcode(status_vector);
  vIBMessage:='';
  vSQLMessage:='';
  (*
   * Maybe show the SQL Code
   *)
  (*
   * Maybe show the SQL Error message
   *)
  if (ShowSQLMessage in IBErrorMessages) then
  begin
    ClientLibrary.isc_sql_interprete(sqlcode, local_buffer, FIBBigLocalBufferLength);

    vSQLMessage:=string(local_buffer);
    vSQLMessage := ReplaceStr(vSQLMessage, '\n', '');
    if Length(vSQLMessage)>0 then
    begin
     if (vSQLMessage[1] >= 'a') and (vSQLMessage[1] <= 'z') then Dec(vSQLMessage[1], 32);
     if (vSQLMessage[Length(vSQLMessage)] <> '.') then vSQLMessage:=vSQLMessage+'.'+CLRF;
    end;
  end;
  (*
   * Maybe show the interbase error messages
   *)
  if (ShowIBMessage in IBErrorMessages) then
  begin
    vIBMessage:='';
    L:= ClientLibrary.fb_Interpret(local_buffer, FIBHugeLocalBufferLength,@status_vector);
    while  (L> 0) do
    begin
      SetLength(tmpStr,L);
      Move(local_buffer[0],tmpStr[1],L);


      if Length(tmpStr)>0 then
      begin
        if (tmpStr[1] >= 'a') and (tmpStr[1] <= 'z') then
         Dec(tmpStr[1],32);
        vIBMessage:=vIBMessage+tmpStr;
        if (vIBMessage[Length(vIBMessage)] <> '.') then
          vIBMessage := vIBMessage + '.';
        vIBMessage := vIBMessage + CRLF;
      end;
      L:= ClientLibrary.fb_Interpret(local_buffer, FIBHugeLocalBufferLength,@status_vector);
    end;
  end;
  (*
   * Finally raise the exception
   *)
  vRaiseExcept:=true;

  //костыль для вывода Exceptions в UTF8 для FB 3
  if (ClientLibrary.ClientMinorVersion=3) then
   vEFIBInterBaseError:=EFIBInterBaseError.CreateEx(sqlcode,UTF8toWideString(vIBMessage),UTF8toWideString(vSQLMessage),'',Sender)
  else
   vEFIBInterBaseError:=EFIBInterBaseError.CreateEx(sqlcode,vIBMessage,vSQLMessage,'',Sender); // '' by IMS

  try
    if ErrorHandlerRegistered   then
     IBErrorHandler.DoOnErrorEvent(Sender,vEFIBInterBaseError,vRaiseExcept);
  except
   vEFIBInterBaseError.Free;
   raise;
  end;
  if vRaiseExcept then
   raise vEFIBInterBaseError
  else
   vEFIBInterBaseError.Free;
end; 


...
Рейтинг: 0 / 0
Exception на русском как сделать FB 3?
    #39713818
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksandr-pro,

это точно паскалевский код:

Код: pascal
1.
    vSQLMessage := ReplaceStr(vSQLMessage, '\n', '');


?
...
Рейтинг: 0 / 0
Exception на русском как сделать FB 3?
    #39713820
Фотография aleksandr-pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Котовасия,

процедура не менялась, кроме трех строк, где происходит перекодировка, все остальное что называется из коробки
Код: pascal
1.
2.
3.
4.
5.
//костыль для вывода Exceptions в UTF8 для FB 3
  if (ClientLibrary.ClientMinorVersion=3) then
   vEFIBInterBaseError:=EFIBInterBaseError.CreateEx(sqlcode,UTF8toWideString(vIBMessage),UTF8toWideString(vSQLMessage),'',Sender)
  else
   vEFIBInterBaseError:=EFIBInterBaseError.CreateEx(sqlcode,vIBMessage,vSQLMessage,'',Sender); // '' by IMS
...
Рейтинг: 0 / 0
Exception на русском как сделать FB 3?
    #39714483
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksandr-pro,

я бы тогда просто любой текст бы пытался конвертировать из UTF-8, а вот если бы не получалось - тогда уже брал бы как обычный текст, перед тем переведя vXXXMessage в AnsiString

Тут весьма забавный дизайн TEncoding даже помог бы
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Exception на русском как сделать FB 3?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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