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

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

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

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

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

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

Используешь EXCEPTION ... USING?
...
Рейтинг: 0 / 0
03.10.2018, 13:08
    #39712386
RADSeatle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exception на русском как сделать FB 3?
Симонов Денис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
03.10.2018, 13:16
    #39712390
Котовасия
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exception на русском как сделать FB 3?
RADSeatle,

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

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

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


Ну почему... Надо просто создать исключение в коннекте с чарсетом 1251.
...
Рейтинг: 0 / 0
03.10.2018, 14:48
    #39712477
RADSeatle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exception на русском как сделать FB 3?
здесь на форуме нашел такой метод пока не пробовал
Код: 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
03.10.2018, 14:54
    #39712483
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exception на русском как сделать FB 3?
03.10.2018 14:48, RADSeatle пишет:
> здесь на форуме нашел такой метод...

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


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

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

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

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

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

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

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


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

процедура не менялась, кроме трех строк, где происходит перекодировка, все остальное что называется из коробки
Код: 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
08.10.2018, 15:35
    #39714483
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Exception на русском как сделать FB 3?
aleksandr-pro,

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

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


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