mts问题,李维第三本书中的例子(100分)

  • 主题发起人 主题发起人 luaijun
  • 开始时间 开始时间
L

luaijun

Unregistered / Unconfirmed
GUEST, unregistred user!
一.在mts对象调用另一个mts对象不成功
procedure TmtsSecurityObj.GetBooks(vCookie: OleVariant;
var vDatas: OleVariant);
var bookObj:ImtsBookObj;
aps:IAppServer;
Options:TGetRecordOptions;
iRecOut:Integer;
OwnerData:OleVariant;
Params:OleVariant;
begin
if VerifyCookie(vCookie)then
begin
try
OleCheck(ObjectContext.CreateInstance(CLASS_mtsBookObj,IID_ImtsBookObj,bookObj));
aps:=bookObj as IAppServer;
Options:=[grMetaData,grReset];
vDatas:=aps.AS_GetRecords('DataSetProvider',-1,iRecOut,Byte(Options),'',Params,OwnerData);
SetComplete;
except
SetAbort;
end;
end;
end;
以下为调用源码
LoginObj:ImtsSecurityObj;
procedure TForm1.Button3Click(Sender: TObject);
var vDatas:OleVariant;
begin
LoginObj:=ComtsSecurityObj.CreateRemote('Chinatec-laj');
LoginObj.GetBooks(Edit3.Text,vDatas);
ClientDataSet1.Data:=vDatas;
end;
调试时在OleCheck中停下来不继续执行,按F7会执行SetAbort;
客户端出错信息为"invlid data Packet"
按李维的说法,在mts中调用mts 组件效率比直接在客户端中调要高,但是这样为什么不行呢?调试他给的
源码也不行
二.另一个例子,ClientDataSet的PacketRecords不起作用,无论高为多少,都把mts DataModule
中取得的数据一次全取过来,这个程序本意是分次取所需的数据
procedure TForm1.ClientDataSet1BeforeGetRecords(Sender: TObject;
var OwnerData: OleVariant);
begin
if not first then
begin
try
vOwnerData := GetKeyFieldValue(Sender);
OwnerData := vOwnerData;
except
on exceptiondo
end;
end;
end;

function TForm1.GetKeyFieldValue(Sender: TObject): OleVariant;
var
aCDS : TClientDataSet;
begin
try
try
aCDS := TClientDataSet.Create(Self);
aCDS.Data := ClientDataSet1.Data;
aCDS.Last;
Result := aCDS.FieldByName('emp_id').Value;
finally // wrap up
aCDS.Free;
end;
// try/finally
except
on e: Exceptiondo
raise;
end;

end;

procedure TForm1.btnMoreClick(Sender: TObject);
var
CurRecord : TBookMark;
begin
first:=false;
try
if (not bTrueEOF) then
begin
try
CurRecord := ClientDataSet1.GetBookmark;
if (ClientDataSet1.GetNextPacket < ClientDataSet1.PacketRecords) then
bTrueEOF := True;
finally
ClientDataSet1.FreeBookmark(CurRecord);
end;
end;
except
on Exceptiondo
;
end;
DBGrid1.Refresh;
edtRecordCount.Text := IntTostr(ClientDataSet1.RecordCount);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
first:=true;
DCOMConnection1.Connected := True;
ClientDataSet1.Open;
Button2.Enabled:=false;
end;

调试时,if (ClientDataSet1.GetNextPacket < ClientDataSet1.PacketRecords) then
中ClientDataSet1.GetNextPacket的值是inaccessible
mts 要求之一就是大量数据分次取,这个例子怎么通不过
本人初涉mts三层编程,请各们大侠指正
 
你是否将fetchondemond属性设为false,再用李维第一本书中的例子程序去手工维护游标
信息?
 
zyloveyj,谢谢你的回答,我想你的回答是针对我的第二个问题的,我把改成fetchondemond改为
false确实可分段取数据,不过和预想的不一样,原计划是一次取五条记录,下一次再取另五条,
在mts数据模块中若sql 语句为Select * from employee 则可实现分次取,但这样效率不高,
故李唯改为如下语句select top 5 * from employee where emp_id > :id order by emp_id
这样比上次emp_id大的另五条语句可取出,可是取出来的还是第一次取的五条
mts数据模块中相关语名如下:
procedure TmtsFetchOnDemandObj.dspEmployeeBeforeGetRecords(Sender: TObject;
var OwnerData: OleVariant);
var
bResult : Boolean;
begin
if not ( (VarIsEmpty(OwnerData)) or (VarIsNull(OwnerData)) ) then
begin
adoqEmployee.Parameters.ParamByName('id').Value := OwnerData;
end
else
adoqEmployee.Parameters.ParamByName('id').Value := '';
end;
该数据模块中,adoQuery的sql语句为select top 5 * from employee where emp_id > :id order by emp_id
我在调试时,adoqEmployee.Parameters.ParamByName('id').Value := OwnerData;已执行
在客户端if (ClientDataSet1.GetNextPacket < ClientDataSet1.PacketRecords) then
判断值为真.
我不知这是为什么,是不是李唯本身的例子不问题?
若分次取数据,是不是sql语句必须全部取出数据,然后由客户端调用,这样做确实效率不高,难
道没有改进的方法,象李唯这样,可惜我调不通


 
这个问题是不是很难,怎么没有人回答呀,是不是嫌分少啊???真是的话,我可以再加的
 
我把mtsBookObj的ADO存取改成BDE方式就没问题了可能是ADO没配好。
 
不能回答你的问题,但, 请问,哪儿有李维的第三本书卖?
说不定,kan了书后能回答。
谢谢!
 
to zhiming822
按李维的说法,mts和ado是极好的组合,mts和bde配合不好,我想若改成bde的话,就没什么
意义了,您说的ado的配置问题指什么,我觉得它的配置比bde要简单,我的配置应该没问题
to hisoft
你是什么地方人啊,我在北京海淀图书城买的
 
要实现数据分段存取,必须在clientdataset.aftergetrecords事件中将最后一条记录的
主键值保存下来,下次取数时在clientdataset.beforegetrecords事件将它赋给ownerdata
而且SQL语句中不需要top 5 ,select * from employee where emp_id > :id
order by emp_id就可以。
 
请问版主,第二个问题已解决,可第一个问题还没解决,怎么给分
 
luaijun:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
 
第一个问题是因为Delphi中的Ado组件有问题,我在开始用的时候也出现过与你一样的
的问题,升级ADO后问题解决。
我用的升级包是别人写的程序,你如果需要,我可以发一个给你。
 
TYZhang,谢谢你的回答,我手上有一个delphi5的升级包,和一个AdoExpress的补丁包,
可是在win2000 server下两个都安装不了,也不知为什么?在进度条到99%时会停滞不前
等好长时间会说XXXXXXXXXXXXXXX内存能只读,不能写什么的,不知为什么?
你发一个过来吧,或告诉我一个下载地址,不胜感激!!!
luaijun@fm365.com
luaijun0608@sina.com
 
TYZhang,谢谢你发来的升级包
再次感谢各位的回答
 
后退
顶部