J
jozosoft
Unregistered / Unconfirmed
GUEST, unregistred user!
现在如下过程,用于单击按钮时保存用户数据:
------------------------------------------------
------------------------------------------------
procedure Tfmbs_Major.btnSaveClick(Sender: TObject);
Var
TempFile:String;
RecNO:Integer;
IsInsert:Bool;
SQL_BeforePost:WideString;
begin
//inherited; 只可放在最后,否则,数据提交有误时,系统会一样的按btnSetbtns.click
TempFile:= global_AdoSaveDir + '/Major.Dat' ;
RecNO := adoMain.RecNo ;
IsInsert:= adoMain.State =dsInsert;
IsAborted:=False;
IsShowedErr:=False;
IsPostOK:=True;
adoMain.SaveToFile( TempFile ); //不会调用post
if IsPostOK=False then
begin
exit; //提交数据时有错, IsPostOK放在 Dataset.BeforePost中,用于检测数据是否合法
end;
try
if not adoMain.Connection.InTransaction then
begin
adoMain.Connection.BeginTrans;
end;
if adoMain.LockType =ltOptimistic then
adoMain.Post
else if adoMain.LockType =ltBatchOptimistic then
adoMain.UpdateBatch(arAll);
if adoMain.Connection.InTransaction then
adoMain.Connection.CommitTrans;
myDeleteFile( TempFile);
except on E:Exception do
begin
if adoMain.Connection.InTransaction then
begin
adoMain.Connection.RollbackTrans;
end;
adoMain.LoadFromFile( TempFile);
if IsInsert then
adoMain.Last
else
try
adoMain.RecNo:= RecNO;
except
;
end;
if IsAborted=False then
myShowErr('保存数据时失败!原因:' + #13 + E.Message );
exit;
end;
end; //end try
myShowInfo('数据已成功保存!','保存');
end;
-----------------------------------------------------
----------------------------------------------------
问题:
数据库是Access(其实,应该与数据库无关,估计SQL Server也是一样)。
如果用户提交数据有重复的键值,即系统显示类似:
由于将在索引、主关键字、或关系中创建重复的值,请求对表的改变没有成功。......
的信息时,再次执行下面的语句时:
adoMain.close;
adoMain.commandText:='Select * from bs_Major';
adoMain.open;
时,系统报错。提示:
“文件 Select * from bs_major 无法被找到。”
大家看清了,哪怕我作一个按钮,强制执行上述三行语句,都是出此问题,但是,如果用户提交的数据是其它错误而非主键错误,程序又很正常。特别奇怪的是,系统提示“文件 Select * from bs_major 无法被找到。”后,我用Try ...end 跟踪调试发现,adoMain.CommandText 的值是正常的,没有错误。
大家可能会问为什么一定要用 SaveToFile和LoadFromFile呢?
原因是:如果不用此方法,那么用户提交的数据发生主键重复时,即使用户把冲突的主键数据改正过来了,保存后,系统总是只保存最后那条记录。
含泪求各位大虾伸出援助之手:
1、解释上述错误发生之原因;
2、给小弟一个解决方案!
小弟三生都会记住你的好。
------------------------------------------------
------------------------------------------------
procedure Tfmbs_Major.btnSaveClick(Sender: TObject);
Var
TempFile:String;
RecNO:Integer;
IsInsert:Bool;
SQL_BeforePost:WideString;
begin
//inherited; 只可放在最后,否则,数据提交有误时,系统会一样的按btnSetbtns.click
TempFile:= global_AdoSaveDir + '/Major.Dat' ;
RecNO := adoMain.RecNo ;
IsInsert:= adoMain.State =dsInsert;
IsAborted:=False;
IsShowedErr:=False;
IsPostOK:=True;
adoMain.SaveToFile( TempFile ); //不会调用post
if IsPostOK=False then
begin
exit; //提交数据时有错, IsPostOK放在 Dataset.BeforePost中,用于检测数据是否合法
end;
try
if not adoMain.Connection.InTransaction then
begin
adoMain.Connection.BeginTrans;
end;
if adoMain.LockType =ltOptimistic then
adoMain.Post
else if adoMain.LockType =ltBatchOptimistic then
adoMain.UpdateBatch(arAll);
if adoMain.Connection.InTransaction then
adoMain.Connection.CommitTrans;
myDeleteFile( TempFile);
except on E:Exception do
begin
if adoMain.Connection.InTransaction then
begin
adoMain.Connection.RollbackTrans;
end;
adoMain.LoadFromFile( TempFile);
if IsInsert then
adoMain.Last
else
try
adoMain.RecNo:= RecNO;
except
;
end;
if IsAborted=False then
myShowErr('保存数据时失败!原因:' + #13 + E.Message );
exit;
end;
end; //end try
myShowInfo('数据已成功保存!','保存');
end;
-----------------------------------------------------
----------------------------------------------------
问题:
数据库是Access(其实,应该与数据库无关,估计SQL Server也是一样)。
如果用户提交数据有重复的键值,即系统显示类似:
由于将在索引、主关键字、或关系中创建重复的值,请求对表的改变没有成功。......
的信息时,再次执行下面的语句时:
adoMain.close;
adoMain.commandText:='Select * from bs_Major';
adoMain.open;
时,系统报错。提示:
“文件 Select * from bs_major 无法被找到。”
大家看清了,哪怕我作一个按钮,强制执行上述三行语句,都是出此问题,但是,如果用户提交的数据是其它错误而非主键错误,程序又很正常。特别奇怪的是,系统提示“文件 Select * from bs_major 无法被找到。”后,我用Try ...end 跟踪调试发现,adoMain.CommandText 的值是正常的,没有错误。
大家可能会问为什么一定要用 SaveToFile和LoadFromFile呢?
原因是:如果不用此方法,那么用户提交的数据发生主键重复时,即使用户把冲突的主键数据改正过来了,保存后,系统总是只保存最后那条记录。
含泪求各位大虾伸出援助之手:
1、解释上述错误发生之原因;
2、给小弟一个解决方案!
小弟三生都会记住你的好。