--- ibx/trunk/fbintf/client/3.0/FB30Array.pas 2016/12/06 10:33:46 46 +++ ibx/trunk/fbintf/client/3.0/FB30Array.pas 2017/01/09 15:31:51 47 @@ -69,7 +69,6 @@ type TFB30ArrayMetaData = class(TFBArrayMetaData,IArrayMetaData) private - FCharSetID: integer; FCodePage: TSystemCodePage; protected procedure LoadMetaData(aAttachment: IAttachment; aTransaction: ITransaction; @@ -106,7 +105,7 @@ type implementation -uses FB30ClientAPI, FB30Statement; +uses FBAttachment, FB30ClientAPI, FB30Statement; const sGetArrayMetaData = 'Select F.RDB$FIELD_LENGTH, F.RDB$FIELD_SCALE, F.RDB$FIELD_TYPE, '+ @@ -125,6 +124,7 @@ const procedure TFB30ArrayMetaData.LoadMetaData(aAttachment: IAttachment; aTransaction: ITransaction; relationName, columnName: string); var stmt: IStatement; + CharWidth: integer; begin RelationName := AnsiUpperCase(RelationName); ColumnName := AnsiUpperCase(ColumnName); @@ -138,7 +138,7 @@ begin if FetchNext then begin FillChar(FArrayDesc.array_desc_field_name,sizeof(FArrayDesc.array_desc_field_name),' '); - FillChar(FArrayDesc.array_desc_relation_name,sizeof(FArrayDesc.array_desc_field_name),' '); + FillChar(FArrayDesc.array_desc_relation_name,sizeof(FArrayDesc.array_desc_relation_name),' '); Move(columnName[1],FArrayDesc.array_desc_field_name,Length(columnName)); Move(relationName[1],FArrayDesc.array_desc_relation_name,length(relationName)); FArrayDesc.array_desc_length := Data[0].AsInteger; @@ -151,6 +151,13 @@ begin FCharSetID := (aAttachment as TFB30Attachment).CharSetID; FCodePage := CP_NONE; FirebirdClientAPI.CharSetID2CodePage(FCharSetID,FCodePage); + if (FArrayDesc.array_desc_dtype in [blr_text,blr_cstring, blr_varying]) and + (FCharSetID = 0) then {This really shouldn't be necessary - but it is :(} + with aAttachment as TFBAttachment do + begin + if HasDefaultCharSet and FirebirdClientAPI.CharSetWidth(CharSetID,CharWidth) then + FArrayDesc.array_desc_length *= CharWidth; + end; repeat with FArrayDesc.array_desc_bounds[Data[4].AsInteger] do begin @@ -209,8 +216,8 @@ begin SDLItem.addShortInteger(array_desc_length); end; - FSDL.Add(isc_sdl_relation).SetAsString(GetTableName); - FSDL.Add(isc_sdl_field).SetAsString(GetColumnName); + FSDL.Add(isc_sdl_relation).SetAsString(array_desc_relation_name); + FSDL.Add(isc_sdl_field).SetAsString(array_desc_field_name); for i := 0 to array_desc_dimensions - 1 do begin