打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
zeos sqlite xe 中文乱码
zeos7  xe  dbgrid  sqlite  中文
新输入中文widestring正常.
但原来输入的中文ansistring 显示乱码
原因在于ZCompatibility中的ZDbcString进行了不恰当的编码,暂时注释掉即可浏览原来输入的中文ansistring,
但可能造成新的问题.


function TZCachedResultSet.Fetch: Boolean;
L1837          stString: RowAccessor.SetString(I, ResultSet.GetString(I));


unit ZDbcResultSet;
function TZAbstractResultSet.GetString(ColumnIndex: Integer): String;
begin
  Result := ZDbcString(InternalGetString(ColumnIndex));L637
改为Result :=(InternalGetString(ColumnIndex));正常
end;

TZSQLiteResultSet.InternalGetString

unit ZCompatibility;
function TZCodePagedObject.ZDbcString(const Ansi: ZAnsiString;
  const Encoding: TZCharEncoding = ceDefault): String;
var
  TempEncoding, UseEncoding: TZCharEncoding;
begin
  if Encoding = ceDefault then
    if not Assigned(FConSettings.ClientCodePage) then
      raise Exception.Create('CodePage-Informations not Assigned!')
    else
      UseEncoding := FConSettings.ClientCodePage^.Encoding
  else
    UseEncoding := Encoding;

  {$IFNDEF UNICODE}
  if not FConSettings.AutoEncode and ( FConSettings.ClientCodePage^.Encoding = UseEncoding ) then
    Result := Ansi
  else
  {$ENDIF}
  begin
    TempEncoding := FConSettings.ClientCodePage^.Encoding;
    FConSettings.ClientCodePage^.Encoding := UseEncoding;
    Result := ZDbcString(Ansi, FConSettings);///////!!!!!!!!!!!!!!  L534 修改了字符串
    FConSettings.ClientCodePage^.Encoding := TempEncoding;
  end;
end;




function TZAbstractDatabaseMetadata.GetTypeInfo: IZResultSet;
var
  Key: string;
begin
  if not GetConnection.UseMetadata then
  begin
    Result := ConstructVirtualResultSet(TypeInfoColumnsDynArray);
    exit;
  end;

  Key := GetTypeInfoCacheKey;
  Result := GetResultSetFromCache(Key);
  if Result = nil then
  begin
    Result := UncachedGetTypeInfo;
    AddResultSetToCache(Key, Result);
  end;
end;


function TZSQLiteDatabaseMetadata.UncachedGetTypeInfo: IZResultSet;
const
  MaxTypeCount = 22;
  TypeNames: array[1..MaxTypeCount] of string = (
    'BOOLEAN', 'TINYINT', 'SMALLINT', 'MEDIUMINT', 'INTEGER',
    'BIGINT', 'REAL', 'FLOAT', 'NUMERIC', 'DECIMAL', 'NUMBER',
    'DOUBLE', 'CHAR', 'VARCHAR', 'BINARY', 'VARBINARY', 'DATE',
    'TIME', 'DATETIME', 'TIMESTAMP', 'BLOB', 'TEXT');
  TypeCodes: array[1..MaxTypeCount] of TZSQLType = (
    stBoolean, stByte, stShort, stInteger, stInteger, stLong,
    stFloat, stFloat, stDouble, stDouble, stDouble, stDouble,
    stString, {$IFDEF UNICODE}stUnicodeString{$ELSE}stString{$ENDIF},
    stBytes, stBytes, stDate, stTime, stTimestamp,
    stTimestamp, stBinaryStream, {$IFDEF UNICODE}stUnicodeStream{$ELSE}stAsciiStream{$ENDIF});
  TypePrecision: array[1..MaxTypeCount] of Integer = (
    -1, 2, 4, 9, 9, 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,


function TZAbstractRODataset.GetFieldData(Field: TField;
  {$IFDEF WITH_VAR_TVALUEBUFFER}var{$ENDIF}Buffer:
  {$IFDEF WITH_TVALUEBUFFER}TValueBuffer{$ELSE}Pointer{$ENDIF};
  NativeFormat: Boolean): Boolean;
begin
  if Field.DataType in [ftWideString] then
    NativeFormat := True;
  Result := inherited GetFieldData(Field, Buffer, NativeFormat);
end;

{**
  Retrieves the column value and stores it into the field buffer.
  @param Field an field object to be retrieved.
  @param Buffer a field value buffer.
  @return <code>True</code> if non-null value was retrieved.
}
function TZAbstractRODataset.GetFieldData(Field: TField;
  {$IFDEF WITH_VAR_TVALUEBUFFER}var{$ENDIF}Buffer:
    {$IFDEF WITH_TVALUEBUFFER}TValueBuffer{$ELSE}Pointer{$ENDIF}): Boolean;
var
  ColumnIndex: Integer;
  RowBuffer: PZRowBuffer;
  ACurrency: Currency;
  {$IFNDEF WITH_WIDESTRUTILS}
  WS: WideString;
  {$ENDIF}
begin
  if GetActiveBuffer(RowBuffer) then
  begin
    ColumnIndex := DefineFieldIndex(FieldsLookupTable, Field);
    RowAccessor.RowBuffer := RowBuffer;
    if Buffer <> nil then
    begin
      case Field.DataType of
        { Processes DateTime fields. }
        ftDate, ftTime, ftDateTime:
          begin
            if Field.DataType <> ftTime then
            begin
              DateTimeToNative(Field.DataType,
                RowAccessor.GetTimestamp(ColumnIndex, Result), Buffer);
              Result := not Result;
            end
            else
            begin
              DateTimeToNative(Field.DataType,
                RowAccessor.GetTime(ColumnIndex, Result), Buffer);
              Result := not Result;
            end;
          end;
        { Processes binary array fields. }
        ftBytes:
          begin
            System.Move((PAnsiChar(RowAccessor.GetColumnData(ColumnIndex, Result)) + 2)^, PAnsiChar(Buffer)^,
              RowAccessor.GetColumnDataSize(ColumnIndex)-2);
            Result := not Result;
          end;
        { Processes blob fields. }
        ftBlob, ftMemo, ftGraphic, ftFmtMemo {$IFDEF WITH_WIDEMEMO},ftWideMemo{$ENDIF} :
          Result := not RowAccessor.GetBlob(ColumnIndex, Result).IsEmpty;
        ftWideString:
          begin
            {$IFDEF WITH_WIDESTRUTILS}
            WStrCopy(PWideChar(Buffer), PWideChar(RowAccessor.GetUnicodeString(ColumnIndex, Result)));
            {$ELSE}
            //FPC: WideStrings are COM managed fields
            WS:=RowAccessor.GetUnicodeString(ColumnIndex, Result);
            //include null terminator in copy
            System.Move(PWideChar(WS)^,buffer^,(length(WS)+1)*sizeof(WideChar));
            {$ENDIF}
            Result := not Result;
          end;
        {$IFDEF DELPHI12_UP}
        ftString:
          begin
            StrCopy(PAnsiChar(Buffer), PAnsiChar(AnsiString(RowAccessor.GetString(ColumnIndex, Result))));
            Result := not Result;
          end;
        {$ENDIF}
        { Processes all other fields. }
        ftCurrency:
          begin
            {SizeOf(curreny) = 8Byte but SizeOf(Extented) = 10 Byte, so i need to convert the value}
            ACurrency := RowAccessor.GetBigDecimal(ColumnIndex, Result);
            System.Move(Pointer(@ACurrency)^, Pointer(Buffer)^, SizeOf(Currency));
            Result := not Result;
          end;
        else
          begin
            System.Move(RowAccessor.GetColumnData(ColumnIndex, Result)^,
              Pointer(Buffer)^, RowAccessor.GetColumnDataSize(ColumnIndex));
            Result := not Result;
          end;
      end;
    end
    else
    begin
      if Field.DataType in [ftBlob, ftMemo, ftGraphic, ftFmtMemo {$IFDEF WITH_WIDEMEMO},ftWideMemo{$ENDIF}] then
        Result := not RowAccessor.GetBlob(ColumnIndex, Result).IsEmpty
      else
        Result := not RowAccessor.IsNull(ColumnIndex);
    end;
  end
  else
    Result := False;
end;
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
CEF4Delphi 常用设置 CefSettings设置
XE10开发的APP对于苹果IPV6上架要求的处理(DelphiTeacher)
矩阵相乘函数 c++
一个队列类的实现(比delphi自带的速度快70倍)
sk_buff完全注释(skbuff.c)
Android 屏幕重力感应
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服