函数返回一个数据集,用的是olavariant类型,怎么转成_recordset

解决方案 »

  1.   

    强制转换行不?
    xxx := _recoredset(xxx);
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      a:olevariant;
      b:_recordset;
    begin
      b := IUnKnown(a) as _recordset;
    end;
      

  3.   

    _recordset是你定义的数据类型吧,呵呵我在Delphi中找不到这个类型
    类型转换强行转换是可以的,或者用个指针传过去,
      

  4.   

    _recordset是ado一个接口类型,在interface uses adodb,就可以了,这是不能强制转换的。有谁知道呀,
      

  5.   

    试了好多方法转换不了,基础差底子薄,帮不了大忙了
    返回数据集怎么是OleVariant,具体情况说说看,也许能说上一二
      

  6.   

    OleVariant直接强制转换到_recordset是不行的.OleVariant和Variant里面引用一个COM对象时候,只是引用这个对象的IUnknown接口,
    你可以通过这个接口再对COM对象查询接口出你要的(当然,这需要这个对象确实实现有这个接口)IInterface(OleVariant) as _recordset
    或者
    IUnknown(OleVariant) as _recordset
      

  7.   

    I think you can do it like this:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      ClientDataSet1: TClientDataSet;
    begin
      ClientDataSet1.Close;
      ClientDataSet1.Data := ComObj.MethodName; // Return OleVariant;
    end;
      

  8.   

    好像不行,必须用ado下面的stream对象来读,不知怎么作建立对象
      

  9.   

    晕,楼主问题到底是什么?一个OleVariant能够转换为_recordset指针前提是,这个OleVariant型引用的对象支持这个接口.
    不可能胡乱转的.
      

  10.   

    唉…… 可能Value是OleVariant。又问错了
      

  11.   

    可能是我说的不明白,以xml形式存储的recordset对象,ado可以通过他的
    stream对象读取.我这个OleVariant,正是以xml形式存储的recordset对象,
    是不能直接转的
      

  12.   

    真不知楼主哪儿不明白。。再给楼主解释一下OLEVARIANT是怎么引用COM对象的吧。
    对于所有COM对象OLEVARIANT都只是引用一个IUNKNOWN接口。如果要OLEVARIANT对具体接口的转换,只能是强制转成IUNKNOWN,然后通过这个IUNKNOWN
    去QUERYINTERFACE, 不过函数不用写了。DELPHI的 AS运算符就是这含义。
    楼主仍是对你真正想要的说得不清不楚你是从SQL 2000数据库里面使用SELECT * FROM XXXX FOR XML 之类查询开访问XML文档吗?
    如果这用它,这跟ADO的版本有关系。。
    ADO 有些情况下会只返回ISTREAM,而非_RECORDSET...也就是,这时候的‘RECORDSET'并不是一个RECORDSET!!!!也许楼主的程序是其它情况,干嘛不具体说清楚呢?
      

  13.   

    是一个com对象返回来的
    VB 下的代码是Set oStream = New Stream
    oStream.Type = adTypeBinary
    oStream.Open
    oStream.Write vSource
    oStream.Position = 0
    mrstResult.Open oStream, , adOpenForwardOnly, adLockReadOnly
    其中:mrstResult 为 recordset; vSource 为 Variant
    既:ADO对象 通过 stream 读取 一个 OLeVaRiant对象
      

  14.   

    uses ComObj;function VariantToRecordset(vSource: OleVariant): _Recordset;
    var
      RS: OleVariant;
      Stream: TStringStream;
    begin
      Result := nil;
      Stream := TStringStream.Create(vSource);
      try
        Stream.Position := 0;
        RS := CreateOleObject('ADODB.Recordset');
        RS.Open(TStreamAdapter.Create(Stream) as IUnknown);
        Result := IUnknown(RS) as _Recordset;
      finally
        Stream.Free;
      end;
    end;
      

  15.   

    var
      so:TStringStream;
      streamintf:IStream;
    begin
      so:=TStringStream.Create('');
      streamintf:=TStreamAdapter.Create(so);//这是楼主需要的STREAM对象。
      

  16.   

    to  回复人:cronuz(cronus) ( ) 信誉:105 
    不能这么做的,程序报错
    Recordset cannot be created from the spcified source. The source file or stream must contain Recordset data in XML or ADTG format.
      

  17.   

    cronuz的程序是示意。。
    它没有去连接,也没有取到数据,所以会报这错的。
      

  18.   

    楼主那段vb代码对应的delphi可以这样写,
    不过delphi提供了很多很好用的vcl类,
    为何一定要用ms的ado组件呢?
    //-------------------------------------------------------------
    uses AdoDB_TLB; 
    // 偶用的AdoDB_TLB是通过ImportTypeLibrary(Adox2.5)生成的, 
    // 高版本delphi的AdoInt单元也许会内含了stream?
    //.............
    var
      s: _Stream;
      buf: Variant;
      rs: _Recordset;
    begin
      s := CoStream.Create;     // 创建一个ado.stream
      rs := CoRecordset.Create; // 创建一个记录集
      try
        s.Type_ := adTypeBinary;
        s.Open(EmptyParam, adModeUnknown, adOpenStreamUnspecified, '', '');
        // begin--------创建一个演示用的数组
        buf := VarArrayCreate([0,1], varByte);
        buf[0] := 4;
        buf[1] := 5;
        // end ---------创建演示用的数组
        s.Write(buf);
        s.Position := 0;
        //ShowMessage(Format('size=%d position=%d', [s.Size, s.Position]));
        rs.Open(Variant(s), EmptyParam, adOpenForwardOnly, adLockReadOnly, adCmdUnknown);
        rs.Close;
      finally
        s.Close;
      end;
    end;
      

  19.   

    谢谢 回复人:westfly(西翔) 了,他的方法是可以的 
    我再问一下,AdoDB_TLB和adoint是什么,有什么区别吗