{ 在作兩層結构MIS遇到問題,很急(50分)

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

hurryman

Unregistered / Unconfirmed
GUEST, unregistred user!
{ 在作兩層結构MIS遇到問題,很急
用ADO連接后台SQL SERVER逕行數据庫操作,當前台有數据要提交時,我使用存儲過程來作
,當某個時候我要取消前面的添,刪,改的操作,我應該如何來作.
//********前台*******//
procedure TForm5.SpeedButton3Click(Sender: TObject); //update
begin
if (edit1.Text<>'') and (edit2.Text<>'') then
begin
with dataunit.DataModule1.spadddept do
begin
Parameters.paramByname('@tage').Value :=2;
Parameters.paramByname('@code').Value :=edit1.text ;
Parameters.paramByname('@names').Value :=edit2.text ;
ExecProc ;
if Parameters.parambyname('@rmessage').Value<> '數据修改成功!' then
begin
showmessage(Parameters.parambyname('@rmessage').Value) ;
edit1.SetFocus;
end
.......................
end;


procedure TForm5.SpeedButton5Click(Sender: TObject); //cancel
begin
with dataunit.DataModule1 do
begin
if (ADOConnection1.InTransaction) and
(messagedlg('確定要逕行取消操作嗎?',mtConfirmation, [mbYes, mbNo],0)= mrYes) then
begin
ADOConnection1.RollbackTrans ;
ADOConnection1.BeginTrans ;
end
else
MessageDlg('不能逕行取消操作', mtError, [mbOk], 0);
end;
end;
//********后台*********//
IF @tage=2 /*update*/
BEGIN
BEGIN TRAN
UPDATE dept SET dept=@code, deptname=@names WHERE dept=@code
UPDATE dept SET deptname=@names WHERE dept=@code
IF @@error<>0 GOTO error
COMMIT TRAN
SELECT @rmessage='數据修改成功!'
RETURN 0
END
//********遇到問題********//
當我"改" 的操作(update)完成后,我要取消 "改" 操作(cancel),卻提示'不能逕行取消操作',我
不太明白問題出在哪里,向大家請教 ,
}
 
是不是InTransaction已经完成了
 
原因:你的修改已经提交了.
另:你的程序不符合事务管理原则.应当使用ADO缓存功能实现.
 
i don't know how to do now
help me every dfw
 
关于用BDE和ADO 做为数据引擎开发两层或多层数据库管理系统时候对事务的控制。
现在在用ADO 和SQL SERVER 开发一个两层的MIS .
由于ADO 可以对事务控制:
adoconnection1.BeginTrans ;
adoconnection1.CommitTrans ;
adoconnection1.RollbackTrans ;
在后台SQL SERVER 也可以对事务控制。现在由于我这里的大概有10个客户端,所以,
我采用的方法是在后台处理所有对资料的操作,前台只在需要是提取就可以。并且DELPHI里还有:
AfterPost(DataSet: TDataSet);
AfterDelete(DataSet: TDataSet);
BeforeDelete(DataSet: TDataSet); 等操作.
我现在遇到的问题,也是我现在对事务模糊不清的地方。就是我到底是在前台用ADO控制事务好,还是在后台用SQL SERVER 控制事务好。或者说的是个错的。
用代码来说话吧:
后台SQL SERVER :
IF @type in (SELECT type FROM type ) or @descs in (SELECT descs FROM type )
BEGIN
SELECT @rmessage='数据出现重复!'
RETURN 0
END
ELSE
BEGIN
BEGIN TRAN
INSERT type (type,descs) VALUES (@type ,@descs)
IF @@error<>0 GOTO error
COMMIT TRAN
SELECT @rmessage='数据添加成功!'
RETURN 0
END
前台 DELPHI :
procedure TForm5.SpeedButton2Click(Sender: TObject);
begin
if (edit1.Text<>'') and (edit2.Text<>'') then
begin
with dataunit.DataModule1.spadddept do
begin
Parameters.paramByname('@tage').Value :=1;
Parameters.paramByname('@code').Value :=edit1.text ;
Parameters.paramByname('@names').Value :=edit2.text ;
ExecProc ;
if Parameters.parambyname('@rmessage').Value<> '数据添加成功!' then
begin
showmessage(Parameters.parambyname('@rmessage').Value) ;
edit1.SetFocus;
end
else
begin
edit1.Clear ;
edit2.Clear ;
edit1.SetFocus ;
showmessage('!') ;
dataunit.DataModule1.adodept.Active :=false;
dataunit.DataModule1.adodept.Active :=true;
end;
end;
end
else
begin
showmessage('!');
edit1.SetFocus ;
end;
现在假如我要取消这个添加数据操作(RollbackTrans)怎么处理呢?
上面是个我遇到的问题,也暴露我对这个知识不熟悉,我想象您请教。
1, 在使用ADO 和SQL SERVER 开发时,ADO的事务我该如何控制,SQL SERVER 如何控制,
请您针对我上面遇到的问题,给我讲解一下。
2, 如果我用的数据引擎是BDE 同样使用SQL SERVER 对事物的控制又是如何。也可以针对上面我遇到的问题。













 
事务提交后是不能回滚的。
BEGIN TRAN
INSERT type (type,descs) VALUES (@type ,@descs)
IF @@error<>0 GOTO error
COMMIT TRAN --如果没有错误,你的事务将提交成功,也就不能回滚了。

不应和用户交互的,应只把提交结果返回给用户,
而不是由用户决定是否提交或回滚.
你想要的功能实际上要用缓存来实现.
ADO和TClientDataset都有此功能.


 
后退
顶部