zoukankan      html  css  js  c++  java
  • Delphi OleVariant与 String 、TMemoryStream、Recordset 的相互转换

    Delphi OleVariant与 String 、TMemoryStream、Recordset 的相互转换

    1、OleVariant与 String

    //OLEVARIANT转STRING
    function OleDataToText(const AData: OleVariant): string;
    var
      nSize: Integer;
      pData: Pointer;
    begin
      if AData = Null then
        Result := ''
      else
      begin
        nSize := VarArrayHighBound(AData, 1) - VarArrayLowBound(AData, 1) + 1;
        SetLength(Result, nSize);
        pData := VarArrayLock(AData);
        try
          Move(pData^, Pchar(Result)^, nSize);
        finally
          VarArrayUnlock(AData);
        end;
      end;
    end;
    //string 与 OleVariant
    function TextToOleData(const AText: string): OleVariant;
    var
      nSize: Integer;
      pData: Pointer;
    begin
      nSize := Length(AText);
      if nSize = 0 then
        Result := Null
      else
      begin
        Result := VarArrayCreate([0, nSize - 1], varByte);
        pData := VarArrayLock(Result);
        try
          Move(Pchar(AText)^, pData^, nSize);
        finally
          VarArrayUnlock(Result);
        end;
      end;
    end;
    

    2、OleVariant与 TMemoryStream 

    //OLEVariant转TMemoryStream:
    function MemoryStreamToOleVariant(Strm: TMemoryStream): OleVariant;
    var
      Data: PByteArray;
    begin
      Result := VarArrayCreate([0, Strm.Size - 1], varByte);
      Data := VarArrayLock(Result);
      try
        Strm.Position := 0;
        Strm.ReadBuffer(Data^, Strm.Size);
      finally
        VarArrayUnlock(Result);
      end;
    end;
    // function OleVariantToMemoryStream(OV: OleVariant): TMemoryStream; var Data: PByteArray; Size: integer; begin Result := TMemoryStream.Create; try Size := VarArrayHighBound(OV, 1) - VarArrayLowBound(OV, 1) + 1; Data := VarArrayLock(OV); try Result.Position := 0; Result.WriteBuffer(Data^, Size); finally VarArrayUnlock(OV); end; except Result.Free; Result := nil; end; end;

    3、OleVariant与 Recordset

    function RecordsetToVariant(const Recordset: _Recordset; var Stream: OleVariant): boolean;
    var
      RS: OleVariant;
      vData: TMemoryStream;
    begin
      Result := false;
      if Recordset = nil then
        Exit;
      vData := TMemoryStream.Create;
      try
        RS := CreateOleObject('ADODB.Recordset');
        RS := Recordset;
        RS.Save(TStreamAdapter.Create(vData) as IUnknown, adPersistADTG);
        vData.Position := 0;
        Result := true;
        Stream := MemoryStreamToOleVariant(vData);
      except
        on E: Exception do
        begin
          RS := E.Message;
          Stream := RS;
          Result := False;
        end;
      end;
    end;
    // function RecordsetFromVariant(vdata: OleVariant): _Recordset; var RS: OleVariant; Stream: TMemoryStream; begin Result := nil; Stream := TMemoryStream.Create; Stream := OleVariantToMemoryStream(vdata); if Stream.Size < 1 then Exit; try Stream.Position := 0; RS := CreateOleObject('ADODB.Recordset'); RS.Open(TStreamAdapter.Create(Stream) as IUnknown); Result := IUnknown(RS) as _Recordset; finally // end; end;

      

      

     

    创建时间:2021.02.05  更新时间:

    博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你所有帮助,谢谢!
  • 相关阅读:
    SQL Server索引进阶:第九级,读懂执行计划
    SQL Server索引进阶:第八级,唯一索引
    SQL Server索引进阶:第七级,过滤的索引
    SQL Server索引进阶:第六级,标签
    SQL Server索引进阶:第五级,包含列
    SQL Server索引进阶:第四级,页和区
    SQL Server索引进阶:第三级,聚集索引
    SQL Server索引进阶:第二级,深入非聚集索引
    SQL Server索引进阶:第一级,索引简介
    2018 – 2019 年前端 JavaScript 面试题
  • 原文地址:https://www.cnblogs.com/guorongtao/p/14378872.html
Copyright © 2011-2022 走看看