函数返回一个数据集,用的是olavariant类型,怎么转成_recordset
解决方案 »
- 文件关联的问题
- 如何得到一个字符串中的字符数?
- 如何将word文件存入数据库中并在客户端读取出来,请高手帮帮忙
- 急!!!对TclientSocket ,TserverSocker的代替品 indy ,ids 的疑惑
- 请教:如何把图片换成ico格式导入到form的Icon属性里面?
- =====================> ListView.Scroll <========================
- 太慢了,各位有没有快一点的办法? 100分
- 问几个关于fastreport的问题
- 串口侦听,帮帮忙,一定给分
- 文件操作问题
- 怎样建立在delphi 下建立 ado的stream对象
- 关于文件传输。
xxx := _recoredset(xxx);
var
a:olevariant;
b:_recordset;
begin
b := IUnKnown(a) as _recordset;
end;
类型转换强行转换是可以的,或者用个指针传过去,
返回数据集怎么是OleVariant,具体情况说说看,也许能说上一二
你可以通过这个接口再对COM对象查询接口出你要的(当然,这需要这个对象确实实现有这个接口)IInterface(OleVariant) as _recordset
或者
IUnknown(OleVariant) as _recordset
procedure TForm1.Button1Click(Sender: TObject);
var
ClientDataSet1: TClientDataSet;
begin
ClientDataSet1.Close;
ClientDataSet1.Data := ComObj.MethodName; // Return OleVariant;
end;
不可能胡乱转的.
stream对象读取.我这个OleVariant,正是以xml形式存储的recordset对象,
是不能直接转的
对于所有COM对象OLEVARIANT都只是引用一个IUNKNOWN接口。如果要OLEVARIANT对具体接口的转换,只能是强制转成IUNKNOWN,然后通过这个IUNKNOWN
去QUERYINTERFACE, 不过函数不用写了。DELPHI的 AS运算符就是这含义。
楼主仍是对你真正想要的说得不清不楚你是从SQL 2000数据库里面使用SELECT * FROM XXXX FOR XML 之类查询开访问XML文档吗?
如果这用它,这跟ADO的版本有关系。。
ADO 有些情况下会只返回ISTREAM,而非_RECORDSET...也就是,这时候的‘RECORDSET'并不是一个RECORDSET!!!!也许楼主的程序是其它情况,干嘛不具体说清楚呢?
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对象
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;
so:TStringStream;
streamintf:IStream;
begin
so:=TStringStream.Create('');
streamintf:=TStreamAdapter.Create(so);//这是楼主需要的STREAM对象。
不能这么做的,程序报错
Recordset cannot be created from the spcified source. The source file or stream must contain Recordset data in XML or ADTG format.
它没有去连接,也没有取到数据,所以会报这错的。
不过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;
我再问一下,AdoDB_TLB和adoint是什么,有什么区别吗