当前位置:主页>销售管理软件> 列表

數據會莫名奇妙丟失!請各位幫忙解決,先謝了! 找客户管理软件下载

销售管理软件版1楼: 背景: D6 + Server SQL 2000 + ADO ,兩层架構, 使用 TADODataSet + 數據感應控件 .

問題描述: 當程序保存數據發生異常時,只要退出程序,異常之前輸入並保存成功的所有數據就會不見! 程序里使用Append和Post新增和保存數據,ADODataSet的LockType屬性為ltOptimistic,沒有使用過事物,而且這種情況只是偶而,並不經常出現.

例: 打開程序,先輸入几張請購單,保存成功,接著輸入訂購單,保存發生異常,退出程序再打開,之前保存成功的請購單查詢不到,說明並沒有真正保存到數據庫,但大部分時候不會有樣情況!

請大伙幫忙解決!先謝了!

2楼: 保存成功的数据会再丢失,很可怕。
换成批量更新,用事务控制呢? 如财务软件永久免费版

3楼: 試過用EDIT作為輸入,保存時用SQL語句INSERT INTO 直接新增到數據庫,並加上事務控制,還是沒能解決問題,不知是不是數據庫問題,或是網絡問題,大家有遇到過這種情況嗎?怎麼解決的?

4楼: 各位高手,幫幫忙阿!

5楼: 看看你的事务控制,保存成功的时候是不是没有提交事务,异常发生后导致数据回滚

6楼: TO : 小小东
我檢查了下,在我程序里,像這些單表操作的並沒有使用到事務,有關多表操作有使用到事務的地方都提交了!應該不是事務控制的問題,因為這種情況只是偶而出現,並不是發生異常就一定丟失數據.

销售管理软件版7楼: 沉的太快,自己頂一下!


各位大俠,沒有遇到過這種情況嗎?
高手們,幫幫俺吧!!!!

8楼: 把代码帖出来吧
大家帮你研究下

9楼: 有勞小小东了,基本上所有表操作的新增和保存代碼都差不多:
其中所有數據維護創體都繼承自一個數據維護基本模板,該模板實現了一些基本的數據操作功能.繼承創體使用接口來進行各自的數據操作,接口定義如下:
//數據操作接口
type
IData = interface
[''{2F55E0C3-8A03-4F97-895E-4333430D51FE}'']
function TableName:string; //數據表名
function Key:string; //關鍵字
procedure Append; //新增
procedure Edit; //編輯
procedure Delete; //刪除
function Post:boolean; //保存
end;
其中定義一個全局變量 MainData:IData;
模板的新增代碼如下:
if MainData=nil then exit;
flag:=''insert'';
SetBtn; //設置按鈕狀態過程
PageControl1.ActivePageIndex:=1;
StatusBar1.Panels[3].Text:=cbText.Items[1];
MainData.Append; //調用接口

模版的保存代碼如下:
if MainData=nil then exit;
if Data.State in[dsEdit,dsInsert]then //Data為TADODataSet


begin
try
if MainData.Post then //調用接口
begin
//操作日誌
if flag=''insert'' then
dm.RAdd(dm.ResultTableKY(Maindata.TableName,''CE''),dm.ResultTableKY(MainData.TableName,''KYE''),Data.fieldByName(MainData.Key).AsString);
if flag=''edit'' then
begin
dm.EditAfter(Data);
dm.REdit(dm.ResultTableKY(Maindata.TableName,''CE''),dm.ResultTableKY(Maindata.TableName,''KYE''),Data.fieldByName(MainData.Key).AsString);
end;
flag:='''';
SetBtn;
StatusBar1.Panels[3].Text:=cbText.Items[0];
if btnAdd.Enabled then
btnAdd.SetFocus;
end;
except
Application.ShowException(ExceptObject as Exception);
dm.WriteErrLog((ExceptObject as Exception).Message); //寫錯誤日誌
end;
end;

以下是請購單的新增和保存代碼,其他都擦不多:
新增代碼:
procedure TMData.Append; //實現接口
begin
with CG_PO_FORM do
begin
Data.Append;
Data.FieldByName(''Dates'').AsString:=FormatDateTime(dm.DateFormat,Date);
Data.FieldByName(''InMan'').AsString:=S_main_Form.UserName;
Data.FieldByName(''PLACE'').AsInteger:=1;
Data.FieldByName(''SHKIND'').AsInteger:=1;
cb5.ItemIndex:=0;
cb6.ItemIndex:=0;
Date1.SetFocus;
end;
end;

//保存代碼
function TMData.Post: boolean;
begin
Result:=false;
with CG_PO_FORM do
begin
if (trim(Date1.Text)='''')or(trim(Date2.Text)='''')or(trim(cb1.Text)='''')
or(trim(cb2.Text)='''')or(trim(cb4.Text)='''')or(trim(cb5.Text)='''')or(trim(cb6.Text)='''') then
begin
S_Main_Form.ShowMsg(10006); //不能為空字段提示
cb1.SetFocus;
Exit;
end;
if flag=''insert'' then //新增標識
//保存時才生成請購編號
Data.FieldByName(''PONO'').AsString:=dm.CreateNO(10,''PO'',''CG_PO_M'',''PONO'');
Data.Post; //保存,我的程序沒有使用到批量更新形式
Result:=true;
end;
end;

10楼: 可能是cursor设置不正确

11楼: 用存储过程试试

12楼: To: newsmile
TADODataSet的CursorType=ctStatic,應該沒問題.

To:cactus123456
全都轉存儲過程工作量太大了,因為這程序還比較大,完成了銷售,庫存,採購,物料需求計劃,制程/托外管理等模塊,基本上所有數據輸入都是採用繼承接口方式.所以要全改成存儲過程不太可能.還有別的辦法嗎? 如管家商铺进销存

13楼: 你把它放到server端试一下。要么就是代码本身有问题,显然本地数据已经修改,但并未提交出去。

销售管理软件版14楼: to: newsmile
由於是兩层架構,不是三层,所以沒有server端,直接是程序用ADO連SQL Server服務器,所有業務邏輯都在客戶端實現,我知道這種架構不好,但已定型了,每辦法改變架構了,除非重寫,呵呵!
應該是代碼問題,但新增,保存的代碼都很簡單(如上),且沒用到事務控制,我實在是分析不出來是那里的問題,還請各位幫忙分析分析,提提意見.

15楼: 1\可能是代码错误,使用showmessgae(''1'')...(''N'')分开放在不同的代码段,看看问题发生在那一级...最好先屏蔽一部分代码,再逐级打开,,看问题再那里...2\可能是数据库的主键问题,代码错误引起重复写入数据库......3\一般不会有服务器问题(硬件及系统..可能性1/1000 )...我一般使用showmessgae..看show 到那里出现问题,就查后面的代码...

16楼: 没遇到过哟!

17楼: 還是沒能解決,煩ing.....

18楼: 各位能不能說說,對於單表和多表操作,你們是怎麼做的?採用甚麼方式?三层應該不會有這種現象吧?

19楼: 从你说的问题现象来看应当就是事务提交上面的问题...事务提交一般分为两种,一种是显示的提交(就是用commit写出的提交);另一种是隐式提交(没有具体用commit写出)我想多半是因为客户端出现问题的时候没有进行隐式提交而造成自动回滚的原因...
建议你用单步执行方法检查客户端数据提交,在提交过程中密接注意数据库后台数据变化情况,就可以看到是不是因隐式提交而造成的问题了。
解决方法,在每次成功提交数据事务组后用TADOConnection的CommitTrans方法显示提交事务既可。

20楼: TO:Johnny_du
如果是隱式事務提交的問題,那有沒有辦法在數據保存後再進行強制事務提交?
試過在窗體退出時加上:
if dm.CON.InTransaction then
dm.CON.CommitTrans;
還是沒能解決!

销售管理软件版21楼: 不会吧!?:(

22楼: ADOQuery1.UpdateBatch(arAll);

QQ:136293586 如客户管理软件下载

23楼: 剛才試了下,在POST後加上dm.CON.CommitTrans;提示沒有事務錯誤!
如果加上
if dm.CON.InTransaction then
dm.CON.CommitTrans;
不能解決!因為沒有顯式開啟事務,總是執行不到dm.CON.CommitTrans;

24楼: 显示开启事务可以在事务组开始前dm.CON.BeginTrans;然后做数据处理,最后用if dm.CON.InTransaction then dm.CON.CommitTrans...
但不知你的问题是否解决了呢??

25楼: TO:bbscom


由於程序不是批量更新方式,ADODataSet的LockType=ltOptimistic,而不是ltBatchOptimistic,所以不能ADOQuery1.UpdateBatch(arAll);

26楼: 显示开启事务可以在事务组开始前dm.CON.BeginTrans;然后做数据处理,最后用if dm.CON.InTransaction then dm.CON.CommitTrans...
但不知你的问题是否解决了呢??
要是解决了,可别忘记放分啊!呵呵:)

27楼: TO:Johnny_du
呵呵,只要問題解決了,分有的是.
因為程序大部分新增,修改,保存都是單表操作,事務控制對單表更新好像意義不大,而且都加上會增加服務器負擔,所有有關係到多表更新的地方都用到了事務控制.
先試試!

销售管理软件版28楼: 先頂起來

29楼: 建议用存储过程

30楼: 全都轉存儲過程工作量太大了,因為這程序還比較大,完成了銷售,庫存,採購,物料需求計劃,制程/托外管理等模塊,基本上所有數據輸入都是採用繼承接口方式.所以要全改成存儲過程不太可能.

31楼: 還沒解決,期待中.....

32楼: 各位能不能說說,對於單表和多表操作,你們是怎麼做的?採用甚麼方式?三层應該不會有這種現象吧?

33楼: 問題沒能解決,不過還是非常感謝大伙的熱心幫助,散分!

34楼: 多人接受答案了。