【问题标题】:Delphi Clientdataset conversion?Delphi客户端数据集转换?
【发布时间】:2014-09-09 04:23:31
【问题描述】:

我已经被这个问题困扰了几天,我有两个包含数据的客户端数据集,我想使用我在 Stack Overflow 中找到的两个函数将 olevariant 数据转换为字符串。

转换为字符串的目的是为了能够将字符串传输到另一个位置并再次转换回 olevariant 并将其分配给另一个客户端数据集。

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

代码执行正确,但我的问题是当我将 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;

【问题讨论】:

    标签: delphi


    【解决方案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 字符集的问题。

    【讨论】:

    • 最好从 “您可以使用 SaveToStream/LoadFromStream 将一个客户端数据集传输到另一个”...字符串应该在您的帖子中省略,因为 OP 确实没有他们的任务不需要它。
    • 谢谢,数据的保存工作正常。但现在我有一个附带问题。我应该把它作为另一个问题来问吗?
    猜你喜欢
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    相关资源
    最近更新 更多