Страница 1 из 1

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

Добавлено: Ср 25 май 2016 05:22
LabutinPA
При потере соединения 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.

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

Добавлено: Ср 25 май 2016 11:09
ViktorV
Спасибо за информацию. Мы исследуем данное поведение MyDAC при использовании Unicode и сообщим Вам результат.