Delphi Clientdataset转换?

时间:2014-07-18 05:52:52

标签: delphi

我已经在这个问题上遇到了几天,我有两个包含数据的cliendatasets,我想使用Stack Overflow中的两个函数将olevariant数据转换为字符串。

转换为字符串的目的是能够将字符串传输到另一个位置并将其再次转换回olevariant并将其分配给另一个clientdataset。

为了模拟它,我创建了一个带有以下部分代码的示例应用程序(参见下面的框)。

代码执行正常但我的问题是当我将windows语言环境转换为日语(这是要求)时,我在第二个数据集的数据分配中遇到数据包不匹配。但如果我在日本语中这样做:

clientdataset2.data := clientdataset1.data

它工作正常。英语语言环境,代码工作正常。

字符串转换有问题吗?或者我能做什么?我真的很感激这方面的帮助。

//to simulate the conversion
TempData := ClientDataSet1.Data;
TempString := OleVariantToString(ClientDataset1.Data);
TempData2 := StringToOleVariant(TempString);
ClientDataSet2.Data := TempData2; //mismatch in data packet happens here in japanese locale

//conversion functions
function TForm1.OleVariantToString(const Value: OleVariant): string;
var
  ss: TStringStream;
  Size: integer;
  Data: PByteArray;

begin
  Result := '';
  if Length(Value) = 0 then
    Exit;
  ss := TStringStream.Create;
  try
    Size := VarArrayHighBound(Value, 1) - VarArrayLowBound(Value, 1) + 1;
    Data := VarArrayLock(Value);
    try
      ss.Position := 0;
      ss.WriteBuffer(Data^, Size);
      ss.Position := 0;
      Result := ss.DataString;
    finally
      VarArrayUnlock(Value);
    end;
  finally
    ss.Free;
  end;
end;

function TForm1.StringToOleVariant(const Value: string): OleVariant;
var

  ss: TStringStream;
   MyBuffer: Pointer;

begin
  Result := null;
  if Value = '' then
    Exit;

  ss := TStringStream.Create(Value);
  try
    Result := VarArrayCreate([0, ss.Size - 1], varByte);
    MyBuffer := VarArrayLock(Result);
    try
      ss.Position := 0;
      ss.ReadBuffer(MyBuffer^, ss.Size);
    finally
      VarArrayUnlock(Result);
    end;
  finally
    ss.Free;
  end;
end;

1 个答案:

答案 0 :(得分:1)

已经实现了流式传输到字符串,您可以使用

写作:TClientDataSet.SaveToFile或TClientDataSet.SaveToStream

阅读:TClientDataSet.LoadFromFile或TClientDataSet.LoadFromStream

procedure SaveToStream(Stream: TStream; Format: TDataPacketFormat = dfBinary);
procedure SaveToFile(const FileName: string = ''; Format: TDataPacketFormat = fBinary);

procedure LoadFromStream(Stream: TStream);
procedure LoadFromFile(const FileName: string = '');

TDataPacketFormat选项是:

dfBinary :信息以二进制格式编码 dfXML :信息以XML格式编码,扩展字符使用转义序列编码 dfXMLUTF8 :信息以XML格式编码,扩展字符使用UTF8表示。

使用dfXMLUTF8,非/ ansi字符集应该没有问题。