象ADOQuery.SaveToFile那样SaveToStream的功能

解决方案 »

  1.   

    function RecordsetToMS(const Recordset: _Recordset; Stream: TMemoryStream): boolean;
    var
      RS: Variant;
    begin
      Result := false;
      if Recordset = nil then Exit;  try
        RS := CreateOleObject('ADODB.Recordset');
        RS := Recordset;
        RS.Save(TStreamAdapter.Create(stream) as IUnknown, adPersistADTG);
        Stream.Position := 0;
        Result := true;
      finally
        ;
      end;
    end;
    function RecordsetFromMS(Stream: TMemoryStream): _Recordset;
    var
      RS: Variant;
    begin
      Result := nil;
      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;
      

  2.   

    我自己 修改过adodb
    使 以前的 两层的 程序 不改 代码的 情况下
    升级 为
     客户端exe > http > IIS >自己写的 dll > sql server
    的模式 在 web上运行 核心就是
    procedure makeUpstream(s: TMemoryStream; action, sql, memo1, memo2: string);
    procedure getRS_stream(ms_Down: TMemoryStream; var errmsg: string; ms_rs: TMemoryStream);
    function HttpPutStram(url: string; s_up, s_down: TMemoryStream): Boolean;
    function RecordsetFromMS(Stream: TMemoryStream): _Recordset;
    function RecordsetFromHttp(Host, sql: string): _Recordset;
    function ExecFromHttp(Host, sql: string; NoRecords: boolean; var c: integer): _Recordset;
    function HttpConnect(host: string): boolean;
      

  3.   

    扩展ADODataSet,增加方法LoadFromStream/SaveToStream/LoadFromString/SaveToString:
    unit MyADODataSet;interfaceuses
      Classes, ADODB, ADOInt, Variants;type
      TMyADODataSet = class(TADODataSet)
      public
        function LoadFromStream(Stream: TStream): Boolean;
        function SaveToStream(Stream: TStream): Boolean;
        function LoadFromString(const Value: string): Boolean;
        function SaveToString(var Value: string): Boolean;
      end;procedure Register;implementationtype
      Recordset25 = interface(_Recordset)
        ['{00000556-0000-0010-8000-00AA006D2EA4}']
        procedure Save(Destination: OleVariant; PersistFormat: PersistFormatEnum); safecall;
      end;function TMyADODataSet.LoadFromStream(Stream: TStream): Boolean;
    var
      mRecordSet: _Recordset;
    begin
      Result := False;
      Close;
      DestroyFields;
      mRecordSet := CoRecordset.Create;
      try
        if mRecordSet.State = adStateOpen then mRecordset.Close;
        Stream.Position := 0;
        mRecordset.Open(TStreamAdapter.Create(Stream) as IUnknown, EmptyParam, adOpenStatic, adLockBatchOptimistic, adAsyncExecute);
        Stream.Position := 0;
        if not mRecordSet.BOF then mRecordset.MoveFirst;
        RecordSet := mRecordSet;
        inherited OpenCursor(False);
        Resync([]);
        Result := True;
      except
        //
      end;
    end;function TMyADODataSet.SaveToStream(Stream: TStream): Boolean;
    var
      mRecordSet: Recordset25;
    begin
      Result := False;
      if Recordset = nil then Exit;
      if Recordset.QueryInterface(Recordset25, mRecordSet) = 0 then
      try
        Stream.Position := 0;
        mRecordSet.Save(TStreamAdapter.Create(Stream) as IUnknown, adPersistXML);
        Stream.Position := 0;
        Result := True;
      except
        //
      end;
    end;function TMyADODataSet.LoadFromString(const Value: string): Boolean;
    var
      mStream: TStringStream;
    begin
      Result := False;
      if Value = '' then Exit;
      mStream := TStringStream.Create(UTF8Encode(Value));
      try
        LoadFromStream(mStream);
        Result := True;
      finally
        mStream.Free;
      end;
    end;function TMyADODataSet.SaveToString(var Value: string): Boolean;
    var
      mStream: TStringStream;
    begin
      Result := False;
      mStream := TStringStream.Create('');
      try
        SaveToStream(mStream);
        mStream.Position := 0;
        Value := Utf8ToAnsi(mStream.ReadString(mStream.Size));
        Result := True;
      finally
        mStream.Free;
      end;
    end;procedure Register;
    begin
      RegisterComponents('Standard', [TMyADODataSet]);
    end;end.