里面的這段代碼讓我暈了N天了,不知錯在哪個地方.(100分)

  • 主题发起人 主题发起人 jeary
  • 开始时间 开始时间
J

jeary

Unregistered / Unconfirmed
GUEST, unregistred user!
客戶端;
try
SocketConnection.AppServer.wz_begin
Trans();
with ntstock_dDataSetdo
begin
DisableControls;
First;
for i:=1 to RecordCountdo
begin
Edit;
_str1:=FieldByName('cpnumber').Value;
_str2:=FieldByName('number').Value;
if varisnull(FieldByName('memo').Value)then
_str3:=''
else
_str3:=FieldByName('memo').Value;
{***********調用中間層方法,并返回狀態值*************}
SocketConnection.AppServer.SetStockSumnt(1,_str1,_str2,dbedit1.Text,_str3,_resultvalue);
//遍歷每一筆明細資料,并且調用appserver接口存檔.
if not(_resultvalue='') then
//showmessage(_resultvalue);
_resultvalue2:=_resultvalue2+_resultvalue;
Next;
end;
end;
if _resultvalue2='' then
SocketConnection.AppServer.wz_CommitTrans()
else
begin
messagedlg('中間層存檔時發生錯誤,具体原因是:'+_resultvalue2+',按确定開始事務回混',mtinformation,[mbok],0);
SocketConnection.AppServer.wz_RollbackTrans();
end;

except
messagedlg('寫入資料庫發生錯誤.',mtinformation,[mbok],0);
SocketConnection.AppServer.wz_RollbackTrans();
exit;
end;

中間層
procedure Tstockdata.SetStockSumNT(PA1: Smallint;
const PA2, PA3, PA4,
PA5: WideString;
out PA6: WideString);
..............
.....省略.....
..............
with TmpDataSetdo
begin
try
[red]Connection.begin
Trans;[/red]
//循環第一次時此語句有錯誤.直接跳到了except后 //第二次后沒有錯誤.郁悶ing.
Edit;
UpdateBatch();
Connection.CommitTrans;
pa6:='存檔成功.';
except
Connection.RollbackTrans;

pa6:='存檔失敗.';
end;
end;
 
可是别人也不知道错在哪儿啊?
你这么懒,就连出现的问题都不详细描述一下,别人怎么会知道呢?
你以为这是考试啊?叫别人做题目啊?
 
对,看病的时候,症状总该描述一下吧。
 
不知大家有沒看清楚
明明 Connection.begin
Trans 這句加了注解并顯示為紅色.[:(!]
 
在错误语句前加refresh试试
 
>>wfzha
加了refresh還是一樣.[:(][:(]
 
你去掉事务代码试试,也许错误在别的地方?
再说好像updatebatch会自动加事务控制
 
前面加一句
if not Connected then
Connected:=True;

先把 TmpDataSet 的 Connected(Active) 属性 置为TRUE(激活状态);
 
原因好象找到了:
客戶端:
try
SocketConnection.AppServer.wz_begin
Trans();
//開啟中間層異動
SocketConnection.AppServer.SetStockSumnt(1,_str1,_str2,dbedit1.Text,_str3,_resultvalue);
//呼叫中間層方法
{ 中間層:
.......
sefl.Connection.begin
Trans
..............
已經連續begin
Trans兩次了,是不是這里有誤?
}


SocketConnection.AppServer.wz_CommitTrans()
SocketConnection.AppServer.wz_RollbackTrans();
 
多几次事务按理不会有错,你去掉试试
 
{ 中間層:
.......
sefl.Connection.begin
Trans
..............
已經連續begin
Trans兩次了,是不是這里有誤?
}
應該是多了一個事務,
因為如果照上面的流程,第一次sefl.Connection.begin
Trans會錯,第二次以后就不會了,
如果把sefl.Connection.begin
Trans //掉,第一次不會錯,第二次就會報"沒有作用的異動"
我認為是多了一次begin
trans.
 
更正一下,
>>如果把sefl.Connection.begin
Trans //掉,第一次不會錯,第二次就會報"沒有作用的異動"
不是第二次,是在客戶端循環完后執行
SocketConnection.AppServer.wz_CommitTrans() or SocketConnection.AppServer.wz_RollbackTrans();
時產生的錯誤.
 
你跟踪一下ADO产生的sql看看,是不是有问题
 
跟蹤了一下中間層代碼,發現只要把客戶端的:
SocketConnection.AppServer.wz_begin
Trans();
//開啟中間層異動
SocketConnection.AppServer.wz_CommitTrans() SocketConnection.AppServer.wz_RollbackTrans();
異動去掉就可以.
但是不能這樣做,否則三個表格的資料可能不同步.
依我所見,如果客戶端也要異動,在中間層最好是先判斷一下是否已開啟adoconnection的異動,如果已沒有開啟就adoconnection.begin
trans.
具体怎樣判斷? adoconnection.begin
trans有返回值嗎?
 
在begin
Trans之前判一下
adocon.Intransaction
否则
Sqlserver 是否有问题?
 
用adocon.Intransaction判斷后再begin
trans.
多謝各位.
 
多人接受答案了。
 
后退
顶部