variant类型如何转化为record? ( 积分: 31 )

  • 主题发起人 主题发起人 hlfysj
  • 开始时间 开始时间
H

hlfysj

Unregistered / Unconfirmed
GUEST, unregistred user!
现在我要在Delphi里调用一个用.net写的函数,返回值是一个record,在Delphi里导入时变成了Variant类型,请问现在我要样才能把variant类型如何转化为record?我这里有一段代码,是处理这个的:
function TfrmMain.VariantToRecordset(const Value: OleVariant): _Recordset;
begin
With TVarData(Value) do
if VType = varDispatch then
Result := IDispatch(TVarData(Value).VDispatch) as _Recordset
else
Result := nil;
end;
1.但是转化成_Recordset,那要转化成record要怎样呢做?
2.我如果要返回数据集,调用上面的函数,结果返回interface not supported 是什么原因呢?
 
现在我要在Delphi里调用一个用.net写的函数,返回值是一个record,在Delphi里导入时变成了Variant类型,请问现在我要样才能把variant类型如何转化为record?我这里有一段代码,是处理这个的:
function TfrmMain.VariantToRecordset(const Value: OleVariant): _Recordset;
begin
With TVarData(Value) do
if VType = varDispatch then
Result := IDispatch(TVarData(Value).VDispatch) as _Recordset
else
Result := nil;
end;
1.但是转化成_Recordset,那要转化成record要怎样呢做?
2.我如果要返回数据集,调用上面的函数,结果返回interface not supported 是什么原因呢?
 
用tfield(fieldbyname['字段名']).value试试.
 
to gxcddnk:
这个好像是对数据库操作的吧,我传的是个record,就是不知道怎么把里面的内容给读出来,显示出来
 
其实你可以先把它赋值给clientdataset1.data,然后你试下看能不能读出数据来.
我在三层里就是这样做的.
 
直接 :=
 
clientdataset1.data 的类型也是olevariant, 我把值赋给它以后,怎么才能将里面的record读出来呢?还请指教。
 
_Recordset 怎么定义的?
 
下面是我客户端的record,和服务器端的是一样的。 delphi里有_recordset,但好像没有_record吧,郁闷。
tWebClientRec = record
sProjID: String;
sMostID: String;
idegree: integer;
sPassword: String;
end;
 
大概看了一下,_Recordset 是ADO数据集的接口,有了它你想干啥都行了,看看 ADOInt.pas 吧,delphi带的源码
 
to utop:
variant 转换到 reocrdset 的方法我知道,可是现在我是不知道怎么转换到record,还请指教
 
reocrdset有哪些字段你知道吧?
用 _RecordSet.Fields[Index].Value 得到各个字段的值,赋给你自己定义的tWebClientRec

我觉得这样应该可以
 
把 _Recordset 换成 ADODataSet1.Recordset(或 ADOQuery1.Recordset) 就行了。
 
还是不明白,我如果这样写:
 ADODataSet1.Recordset := IDispatch(TVarData(Value).VDispatch) as _Recordset
会提示interface not support, 好像不行,还请高手指教
 
procedure VariantToRecord(v: oleVariant
var ARec
Size: integer);
var
i: integer;
p: PByteArray;
prec: Pointer;
begin
prec:=@ARec;
p := VarArrayLock(v);
for i:=0 to Size-1 do
(PByteArray(prec))^ := p^;
VarArrayUnLock(v);
end;
 
VarArrayLock 我试过了,不行,因为这个是锁定一个variant类型的数组,返回的它的指针,但是我得到的variant中是个记录类型的,所以运行到这句的时候报错。
 
我好久没来这个论坛了! 看到的第一个问题就是这个。
===========================
这个问题, 我想这样说: 所有的变量都是一块内存,不管是RECORD,INT,WORD。。。。 任何类型变量(包括自定义的)都只是一个标记而已, 编译器会自动将根据变量的类型而确定其长度,以及存放格式。
所以,楼上的问题,7030已经写的非常清楚, 上面的代码是将Variant的数据,拷贝至aREC,我不知道还有什么问题。!!!
 
真的不行,我调用7030的函数的时候,报 invalid argument 的错误。我是这样调的,
cc: record
TempVariant: olevariant;
VariantToRecord(TempVariant, cc, sizeof(cc));
在这一句报的错:
p := VarArrayLock(v);
 
這樣不行的。
如果可以的話,我的程序架構將會更加完美。

因為record類型具有更多未知的數據類型(還有用戶自定義的數據類型),所以在類型處理上有點難做。
如果可以我向大家學習。
 
To 楼主:
1、下面这句本身没有问题,它与 Recordset 兼容:
ADODataSet1.Recordset := IDispatch(TVarData(Value).VDispatch) as _Recordset;
2、之所以报错,主要因为 ADO.net 中的 Record 与 ADO 的 Recordset 有着很大区别,两者根本是完全不同的类型,不能相互赋值。
3、楼主想用 ADO 的数据集来接收来自 .net 的数据集,恐怕不能实现。因为 Delphi 7 以前的版本没有引入 .net 框架,也无法引入 .net 的接口。
 
后退
顶部