数据库更新问题(急急急!!!)(50分)

  • 主题发起人 主题发起人 woofer
  • 开始时间 开始时间
W

woofer

Unregistered / Unconfirmed
GUEST, unregistred user!
interbase数据库,用一个TBQuery查询一个表中一个整数字段的最大值。
发现在程序其他部分修改了改表中的数据后,查询的结果还没有变?
如何解决。
 
需要你显示的提交事物。
试一下
TIBTransaction.CommitRetaining
看看能不能解决。
 
[:(]好像还是不行。
我的查询部分如下:
[green]Mystring := ' SELECT max(UID) UID FROM HISTORY ';
with MyData.IBQry do
begin
Close;
Sql.Clear ;
Sql.Add (MyString);
Prepare;
active:=true;
if isempty then
HID := 0
else
HID := FieldByName('UID').AsInteger + 1;[/green]
[black]修改数据库部分如下[/black]
[green] with IBTabHistory do
begin
Append;
FieldByName('UID').AsInteger := DataResult.UID ;
FieldByName('SNO').AsInteger := DataResult.SNO ;
FieldByName('EXAMINEDATE').AsDateTime := DataResult.Examinedate ;
FieldByName('TESTID').AsInteger := DataResult.Testid;
FieldByName('ITEMCODE').AsString := DataResult.Itemcode ;
FieldByName('TYPE').AsString := DataResult.ResultTYPE ;
FieldByName('CPSVALUE').AsFloat := DataResult.CPSVALUE ;
FieldByName('CONC').AsFloat := DataResult.CONC ;
FieldByName('AVERAGE').AsString := DataResult.AVERAGE ;
post;
end;[/green]
 
看看IBTabHistory 的cachedupdates的属性是否为False,如果为True的话,
应用applyupdates将它更新
 
[:(] [xx(] 我没有改变IBTable的默认值。cachedupdate为false。
而且我的程序如果中间非法对出的话,数据也不会保存更新。
分不够我可以再加!
 
你没有提交事务,所以只是你那个表看到增加了,但其他表还是不知道.
你要用TDataBase的Commit,Rollback,StartTranscation系列.
 
你可以用
insert into(表名) values(字段名);
提交后再进行查询一定可以
 
呵呵,是默认的事务构件没有设置,TTransaction 双击,4个中选一个,一个个试吧,很快的[:D][:D]
 
你用的这个方法:
' SELECT max(UID) UID FROM HISTORY ';
在多用户环境下并不安全:
如A用户在数据库的最大ID为5的时候取ID 为6
在A用户未更新记录前:
此时B用户在这时取ID 也为6
若A保存记录后,B又保存记录,就会出现关键字重复的错误:

正确的方法:
1-建立一个保存最大ID记录的表:
字段定义如下: tMaxID:
TableName(Char(12)) 主键索引
MaxID(Integer)

取最大ID 的Function 如下:
由于每次调用ID 都加1,所以永远不会出现关键字重复的错误.

Function TBaseInfo.GetMaxID(tName: String): Integer;
Var
ID: Integer;
Begin
Result := 1;
With tMaxID Do
Begin
If Not Active Then
Open;
IndexName := 'TableName';
If FindKey([tName]) Then
Begin
ID := FieldByName('MaxID').AsInteger;
Result := ID;
ID := ID + 1;
Edit;
FieldByName('MaxID').AsInteger := ID;
Post;
End
Else
Begin //第一次
ID := 1;
Insert;
FieldByName('TableName').AsString := tName;
FieldByName('MaxID').AsInteger := ID + 1;
Post;
End;
End; //With
End;



 
谢谢各位!已解决!分不够,交个朋友啦,平均分配了。
 
后退
顶部