结束事务数据一半不能保存?(by 3h)(88分)

  • 主题发起人 主题发起人 3h
  • 开始时间 开始时间
3

3h

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个数据库,使用主—零结构联系两个表。现想用事务处理一批数据。由于在开
始修改之前需要预览,所以采用让Table的ReadOnly:=True。在按下某个按钮之后,两
个Table的ReadOnly均为 False,并开始事务,见下代码所述。其中DataModu是一个数
据模块,内有1个DataBase,2个Table和2个DataSource;ModifyDataForm 窗口有若干
DBTEXT 之类的组件各有一半分别指向两个DataSource。关于此数据库的一些内容与定
义可参见我的另一个问题所述:<a href="http://www.gislab.ecnu.edu.cn/delphibbs/dispq.asp?LID=145539
">关于数据表的几个问题</a>

private
FEditing: Boolean;
Procedure SetEditState(Es: Boolean);
Procedure ShowData;
public
Property Editing: Boolean Read FEditing Write SetEditState;

procedure TModifyDataForm.FormShow(Sender: TObject);
begin
ShowData;
end;

procedure TModifyDataForm.ShowData;
begin
Editing := False;
MainForm.Enabled := False;

With DataModu do
begin
Table2.Close;
With Table1 do
begin
Close;
Filter := 'TeleNo=''' + EditTeleNo.Text + '''';
Filtered := True;
ReadOnly := True;
Open;
end;
With Table2 do
begin
MasterFields := 'UserID';
MasterSource := DataSource1;
ReadOnly := True;
Open;
end;
end;
end;

procedure TModifyDataForm.BtnUpdataClick(Sender: TObject);
begin
If Editing then
// 取消事务
DataModu.Database1.Rollback;

Editing := Not Editing;
end;

procedure TModifyDataForm.BtnOKClick(Sender: TObject);
begin
If Editing then
begin
// 确认事务
DataModu.Database1.Commit;
Editing := False;
end
else
Close
end;

procedure TModifyDataForm.SetEditState(Es: Boolean);
begin
If FEditing = Es then
Exit;

FEditing := Es;

If FEditing then
begin
BtnUpdata.Caption := '取消';
BtnOk.Caption := '保存';
// 进入事务状态
With DataModu do
begin
Table2.Close;
With Table1 do
begin
Close;
ReadOnly := False;
Open;
end;
With Table2 do
begin
ReadOnly := False;
Open;
end;
Database1.StartTransaction;
end;
end
else
begin
With DataModu do
begin
With Table1 do
begin
Close;
ReadOnly := True;
Open;
end;
With Table2 do
begin
Close;
ReadOnly := True;
Open;
end;
end;
BtnUpdata.Caption := '修改...';
BtnOk.Caption := '关闭';
end;
end;

此窗口运行状态还算良好,结果是正确是,表明查询是准确的。但是想要进入编辑
状态,按下BtnUpdata按钮,能进入编辑状态。修改一些内容,按BtnOK,发现凡是
Table1属下的DBTEXT均不能得到修改!修改SetEditState的else后面那一段,将
With Table2 do提到With Table1 do的前面,发现两个表均不能修改。

<font color=red><b>求救!</b></font>
 
With DataModu do
begin
//Database1.StartTransaction; 放这里试试
Table2.Close;
With Table1 do
begin
Close;
ReadOnly := False;
Open;
end;
With Table2 do
begin
ReadOnly := False;
Open;
end;
Database1.StartTransaction;
--------------------------
你把database1的starttransaction放到前面去试试!
BTW.你为什么不用“高速绶存”呢?
 
啊, 你为什么要改table.readonly呢? 建议你永远是false. 打开关闭数据库很慢
的. 要想只读, 改dbedit等的readonly好了.
 
to hntangwei:
1, I will try.
2, CacheUpdata?

to cytown:
DBEDIT太多。 :)
 
呵呵, 再多也是最省事的办法:-)
 
3h:
for i:=0 to form1.controlcount - 1 do
begin
if control is tdbedit then
with control as tdbedit do
...
end;
 
试了一下,没有用。
在修改的时候似乎有效,但关闭后再进入发现内容还是原来的。真奇怪。
 
procedure TModifyDataForm.BtnOKClick(Sender: TObject);
begin
If Editing then
begin
// 确认事务
DataModu.table1.ApplyUpdates;
DataModu.table2.ApplyUpdates;
DataModu.Database1.Commit;
Editing := False;
end
else
Close
end;
 
原来是忘记post了。呵呵,不好意思。

顺便请教,ApplyUpdates是什么意思?(作用)
 
把缓存中的数据真正post到数据库中去.
 
应该是:
with datamodu.table1 do
if modified then // 好象是这样拼
applyupdate;
结束问题了谢谢大家。

btw: cytown真是后来居上啊!恭喜!
 
后退
顶部