帮帮忙,B/S的数据提交问题!(50分)

  • 主题发起人 主题发起人 Dephic
  • 开始时间 开始时间
D

Dephic

Unregistered / Unconfirmed
GUEST, unregistred user!
基本情况是这样的:
数据库是SQLSERVER2000,WIN2000操作系统,DELPHI5,
基本模型:COM+结合ASP
包括三层,第一层是底层数据库模块,用ADOConnection,ADOStoredproc调用存储过程,
datasetprovider提供数据。
第二层是:DCOMConnection,XMLBroker和MidasPageProducer生成动态网页!
第三层是ASP调用第二层的接口,得到动态页面,以及传送数据回数据库!
现在显示动态页面已经可以了,但数据没法更新回数据库,我做的存储过程是对多表查询
的,数据结构如下(我只写关联部分):
表一:   TeacherNo, Name,.....
数据类型: Char(12),char(10)
表二:   ClassNo,Name..........
类型: 同上
表三:   SubjectNo,Name....
类型: 同上
表四:   SubjectNo,TeacherNo,ClassNo,Week,iSection....
通过存储过程,我得到的表是:(在浏览器上查询到的表)
  表一的name,表二的Name,表三的Name,Week,iSection....
但我修改之后,执行提交,调用中间层的接口,在中间层的接口部分运行:
XLBroker.ApplyXMLUpdates操作出现错误:数据正在被另一用户修改,不知是何原因。
还有,如果我要修改表二的Name(实际上是要修改表四的TeacherNo,而不是修改到表一的
Name,这种情况又如何解决?
 
只要问题解决,加分没问题!
 
在执行到XLBroker.ApplyXMLUpdates(Delta,ErrorCount)
出现错误(设中断,用单步跟踪才能得到错误):Record changed by another user!
天啊,就没人知道是什么回事吗?
 
我把部分代码贴出来,大家帮我看看错哪了:
底层数据模块:
procedure TTempLessonDM.MtsDataModuleActivate(Sender: TObject);
begin
TempLessonADO.Connected := true;//TempLessonADO:TADOConnection
GetTempLessonByClassNo.Active := true;//GetTempLessonByClassNo: TADOStoredProc;
end;

procedure TTempLessonDM.MtsDataModuleDeactivate(Sender: TObject);
begin
TempLessonADO.Connected := false;
GetTempLessonByClassNo.Active := false;
end;

中间层:
procedure TTempLessonMTS.GetTempLessonPage(const Number, StarTerm,
EndTerm: WideString;
isLike, iType: SYSINT;
var ReturnPage: WideString);
begin
if iType=0 then
begin
TempLessonDM.GetTempLessonBroker.ProviderName := 'GetTempLessonByClassNoDP';
  //TempLessonDM:TDataModel,GetTempLessonBroker:TXMLBroker,根据不同的入口参数,
  //给GetTempLessonBroker连接不同的datasetprovider,
TempLessonDM.GetTempLessonBroker.FetchParams ;//刷新存储过程所带的参数,在这我发现刷新 时自动激活MIDASConnection,所以我就不再激活它!
TempLessonDM.GetTempLessonBroker.Params.ParamByName('@ClassNo').asstring:= Number;
end
else
if iType=1 then
begin
TempLessonDM.GetTempLessonBroker.ProviderName := 'GetTempLessonBySubjectNoDP';
TempLessonDM.GetTempLessonBroker.FetchParams ;
TempLessonDM.GetTempLessonBroker.Params.ParamByName('@SubjectNo').asstring:= Number;
end
else
if iType=2 then
begin
TempLessonDM.GetTempLessonBroker.ProviderName := 'GetTempLessonByTeacherNoDP';
TempLessonDM.GetTempLessonBroker.FetchParams ;
TempLessonDM.GetTempLessonBroker.Params.ParamByName('@TeacherNo').asstring:= Number;
end;
TempLessonDM.GetTempLessonBroker.Params.ParamByName('@StarTerm').asstring:= StarTerm;
TempLessonDM.GetTempLessonBroker.Params.ParamByName('@EndTerm').asstring:= EndTerm;
TempLessonDM.GetTempLessonBroker.Params.ParamByName('@isLike').asinteger:= islike;
TempLessonDM.GetTempLessonBroker.Connected := true;
ReturnPage := TempLessonDM.GetTempLessonPage.Content;
// TempLessonDM.TempLessonDCOM.Connected := false;
end;

procedure TTempLessonMTS.ApplyUpdateTempLesson(const Delta: WideString;
var iErrorCount: Integer);//中间层提交数据接口过程
begin
TempLessonDM.GetTempLessonBroker.ApplyXMLUpdates(Delta,iErrorCount);
end;

第一层:
function TTempLessonAsp.GetDeltaPacket: String;//取得数据封包
begin
Result := Request.Form.Item['postdelta'];
end;

procedure TTempLessonAsp.GetTempLessonPage(const Number, StarTerm,
EndTerm: WideString;
isLike, iType: SYSINT);
var
Obj : variant;
TempLessonPage : WideString;
begin
Obj := Server.CreateObject('TempLessonMTS_Dpr.TempLessonMTS');//TempLessonMTS_Dpr是中间层的工程名
                                //TempLessonMTS是它的接口名称  
Obj.GetTempLessonPage(Number, StarTerm, EndTerm, isLike, iType, TempLessonPage);
Response.Write(TempLessonPage);
end;

function TTempLessonAsp.ApplyTempLesson: Integer;
var
Obj : variant;
ErrorCount : integer;
begin
Obj := Server.CreateObject('TempLessonMTS_Dpr.TempLessonMTS');
Obj.ApplyUpdateTempLesson(GetDeltaPacket, ErrorCount);//调用中间层的接口过程!
Result := ErrorCount;
end;

第一层生成的ASP文件:
<%@Language = javascript %>
<HTML>
<BODY>
<TITLE> Testing Delphi ASP </TITLE>
<CENTER>
<H3> You should see the results of your Delphi Active Server method below </H3>
</CENTER>
<HR>
<%
function isapplyupdatesuequest() //判断是否有Delta数据封包
{
return (Request.Form("postdelta").count>0);
};
var TempLessonASPObj,Number = '%', StarTerm = '000000000', EndTerm = '999999999', isLike = 1, iType = 0;
function CreateASPObj() //建立TempLessonAsp对象
{
if (this.TempLessonAspObj == null)
TempLessonAspObj = Server.CreateObject("TempLessonAsp_D.TempLessonAsp");
return TempLessonAspObj;
};
// TempLessonAspObj = Server.CreateObject("TempLessonAsp_D.TempLessonAsp");
CreateASPObj().GetTempLessonPage(Number,StarTerm,EndTerm,isLike,iType);
if (Request.Form("postdelta").count>0)
{
CreateASPObj().ApplyTempLesson();
}
%>
<HR>
</BODY>
 
我也需要
 
有几个可能性:
1 你的数据库定义了有默认值的字段.
如果是这样,在Applyupdates后加上refresh属性就行了.
2 你定义了自加域.
去掉就行了.
3 目前我也碰到了类似的问题,如果有什么更好的办法通知一声.
chencwsh@yeah.net
 
同意Dephic
 
真的就没有人知道吗?
我急啊。。。。。。。。。。。。
 
9861兄:
1。 我的数据库没有定义默认值的字段,所以可以排除,
2。 我是定义自加字段,但我的存储过程里并没有查询到这个字段!不知这样是否也会影响?
3。 我现在打算每个模块在MTS层作两个COM+,一个专作查询用,一个专作修改数据库用!不知这样可不可行?
希望以后多多交流,我的OICQ是:40989768,
 
问题已经解决一部分,现在发现是事务的控制上出问题:
如果MTS数据模块或MTS模块中只要其一个模块设成需要事务都提交失败,在提交时我的实现代码:
我的设置是:MTS数据模块为支持事务,MTS模块为需要事务
function TtestMTS.SetData(const Delta: WideString): Integer;
var
iErrorCount,a : integer;
begin
try
testDM.XMLBroker1.ApplyXMLUpdates(Delta,iErrorCount);//调用跟踪,发现执行完这句出现
                            // 错误:根事务要提交数据,但事务已被终止!   
setcomplete;
except
setabort;
end;
result := iErrorCount;
end;
 
我估计是ado的事务level的问题
 
总算又有一个人开口了,谢谢gutian兄,
可是我只设MTS层为需要事务,MTS数据模块只为支持事务,这应该就只会有一个事务产生啊!
这又怎么解释呢?
 
哥们,我今天才上网,看到你给我的留言,然后到大富翁上来看看你的贴子,不过,
不好意思的是,我的水平远远不如你,你的东东,我根本看不懂,真是羞愧难当啊!!!
不过我鼓励你一下,继续努力啊!
 
先谢谢bobzane兄的鼓励,看来我这个问题也没人答了!如果大家是因为分少,我可以另开
个题送分的!如果说真的没人能答那么我过几天就将问题结束了,也只好暂时不用事务来
管理了!以后只时间再慢慢研究。。。。。。。。。
 
哎~~~这么久都没有答案!
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部