MySql: битый текст исключения при отсутствии соединения

Обсуждение возникших проблем, предложений и ошибок UniDAC компонентов
Ответить
LabutinPA
Сообщения: 3
Зарегистрирован: Чт 03 сен 2015 00:50

MySql: битый текст исключения при отсутствии соединения

Сообщение LabutinPA » Ср 25 май 2016 05:22

При потере соединения MySQL выбрасывается исключение с крякозябрами - результатом ошибочного преобразования системного Unicode-текста ошибки из UTF-8.
Для воспроизведения нужно:
UniConnection.SpecificOptions.Values['UseUnicode'] := 'True';
UniConnection.SpecificOptions.Values['Direct'] := 'True';
Соединение разрывать не обязательно, можно сэмулировать ошибку исправлением TCRVioTcp.ReadNoWait - закомментировать проверку результата и указать код ошибки, например, 10060:

Код: Выделить всё

  function InernalReceive(Loop: integer): integer;
  begin
    Result := recv(FSd, buffer[offset], count, 0);
//    if Result = SOCKET_ERROR then begin
//    {$IFDEF UNIX}
//      if (GetSocketError = ESysEINTR) and (Loop > 0) then begin
//        sleep(50);
//        Result := InernalReceive(Loop - 1);
//      end
//      else
//    {$ENDIF}
      begin
//        FLastErrorCode := GetSocketError;
        FLastErrorCode := 10060;
        FLastError := Format(SErrorOnDataReading, [SysErrorMessage(FLastErrorCode), FLastErrorCode, FLastErrorCode]);
        Result := 0; // silent error handling
      end;
//    end;
  end;
В результате будет получена строка ошибки, которая в конце концов передается в метод TMySQLConnection.MySQLError, где и происходит ошибочное преобразование из UTF8

Код: Выделить всё

if FUseUnicode then
    Msg := string(CRFunctions.UTF8Decode(MsgBuf))
, но этого не нужно, т.к. текст ошибки был получен с помощью метода SysErrorMessage.

ViktorV
Devart Team
Сообщения: 206
Зарегистрирован: Чт 31 июл 2014 09:52

Re: MySql: битый текст исключения при отсутствии соединения

Сообщение ViktorV » Ср 25 май 2016 11:09

Спасибо за информацию. Мы исследуем данное поведение MyDAC при использовании Unicode и сообщим Вам результат.

Ответить