P := VarArrayLock(Result); //Data: TDataType为你要传的记录类型
Move(Data, P^, SizeOf(TDataType)); // 把Data的值传给P指向的变体类型
finally
VarArrayUnLock(Result);
end;
end;
3>、客户端:
procedure GetFile(const FileName: string);
var
P: Pointer;
V: OleVariant;
Data: TDataType;
begin
FillChar(Data, SizeOf(Data), 0);
V := SocketConnection1.AppServer.GetData;
try
P := VarArrayLock(V);
Move(P^, Data, SizeOf(Data));
finally
VarArrayUnLock(V);
end;
end;
9、Com+中传递记录集
服务器端:
Uses ADOInt;
你可以将ADO的数据作为一个Variant类型的变量进行传送:adodataset1.RecordSet这是原生的ado数据
这是服务端的一个方法的代码:把CodeSet的类型改为Variant*[in,out]
function TADORec.getData: OleVariant;
begin
AdoDataSet1.Open;
result := adodataset1.RecordSet;
end;
//可以将ADO的数据作为一个Variant类型的变量进行传送:adodataset1.RecordSet这是原生的ado数据
客户端
uses adoint;
var
MyRecordset :_recordset;
begin
MyRecordset := IUnknown(CodeSet) as _recordset
End;
10、Com有需要研究和有疑问的地方:
1、Com+的模式:
2、到Com+的资源Pooling机制
3、用delphi6 开发Com+,用Neutral模式,尽量用Object Pooling,当然就是要无状态了,事务要尽量短,避免死锁,用ADO不要用BDE.Dbexpress等.
4、我的做法是,按功能划分组件,把查询和更新分为两个功能组件,因为查询不需要事务,所以只要支持事务就行了。更新一般需要事务。
5、COM+的事务属性 COM+的事务默认级别是序列 Read,而不是我们认为的commit Read,而且我们设置AdoConnection的隔离级是不管用的,只能强制用显式的SQL才能起效果。例如: 一个中间层COM :select * from a where py_code like 'S%' 继续下面有很多代码;另一个中间层COM: update a set py_code=py_code where py_code like 'B%'; 这时这个COM将会死锁等待,虽然改动的不是一个数据也会死锁 用Commit Read 或UnCommit Read不会建议: 所以被多个子系统更新或读的表,要在最后打开和更新,不要早。另外可以强制改变ADOCONNECTION的隔离级
6、Com+中如何进行事务处理? 在COM+中,如何使用SetComplete和SetAbort进行事务管理?SetComplete和SetAbort怎么能在客户端调用呢?这样肯定是不行的。要保证事务,就在服务器端声明一个专门保存的接口方法,例如:
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-46133-6.html
台湾如果敢宣布独立
你也看球
养兵千日用兵一时