使用FieldByName来更新数据纪录,程序调试通过,但是为什么记录没有被更新
表结构:
name:string
L1:float
L1N:int
L2:float
L2N:int
.....
L9:float
L9N:int
程序:
//判断符合那种条件查询
if suiradiobutton1.Checked=true then 
begin sqlstr:='select L1,L1N from count'; end;
if suiradiobutton2.Checked=true then 
begin sqlstr:='select L2,L2N from count'; end;
if suiradiobutton3.Checked=true then 
begin sqlstr:='select L3,L3N from count'; end;
if suiradiobutton4.Checked=true then 
begin sqlstr:='select L4,L4N from count'; end;
if suiradiobutton5.Checked=true then 
begin sqlstr:='select L5,L5N from count'; end;
if suiradiobutton6.Checked=true then 
begin sqlstr:='select L6,L6N from count'; end;
if suiradiobutton7.Checked=true then 
begin sqlstr:='select L7,L7N from count'; end;
if suiradiobutton8.Checked=true then 
begin sqlstr:='select L8,L8N from count'; end;
if suiradiobutton9.Checked=true then 
begin sqlstr:='select L9,L9N from count'; end;
//连接数据库
if DBISAMDatabase1.Connected=true then 
DBISAMDatabase1.Connected:=false;
DBISAMDatabase1.DatabaseName:='count.dat';
DBISAMDatabase1.Connected:=true;
DBISAMQuery1.Close;
DBISAMQuery1.DatabaseName:=DBISAMDatabase1.DatabaseName;
DBISAMQuery1.SQL.Clear;
DBISAMQuery1.SQL.Add(sqlstr);
DBISAMQuery1.open;
//逐条更新纪录
i:=0;
DBISAMQuery1.First;
while not DBISAMQuery1.Eof do
begin
  i:=i+1;
   DBISAMQuery1.edit;
   DBISAMQuery1.FieldByName(DBISAMQuery1.FieldDefs[0].Name).asfloat:=DBISAMQuery1.FieldByName(DBISAMQuery1.FieldDefs[0].Name).asfloat+strtofloat(combo[i]);
   DBISAMQuery1.FieldByName(DBISAMQuery1.FieldDefs[1].Name).AsInteger:=DBISAMQuery1.FieldByName(DBISAMQuery1.FieldDefs[1].Name).AsInteger+1;
    DBISAMQuery1.Post;
    DBISAMQuery1.next;
end;
请高手指点

解决方案 »

  1.   

    不知道为什么程序执行后,记录的值没有发生变化。理论上记录的每个值都要发生变化。
    将DBISAMQuery1.edit;改为DBISAMQuery1.append;也不行
      

  2.   

    再说一下:在DBISAMQuery1.Post;之前用showmessage(DBISAMQuery1.FieldByName(DBISAMQuery1.FieldDefs[0].Name).asstring);发现值发生变化,但在他之后用showmessage(DBISAMQuery1.FieldByName(DBISAMQuery1.FieldDefs[0].Name).asstring);却发现值不变。
    我猜想可能是DBISAMQuery1.edit;和DBISAMQuery1.Post;的问题,但不知道怎么改,请高手指点。
      

  3.   

    你的程序看起来没有问题
    试一试把FieldByname改成FieValues
      

  4.   

    可能是你的ADOQUERY设为缓存了!!
      

  5.   

    改为fieldvalues不行,它的返回类型为variant,而字段的类型为float和int,不能改表结构。
      

  6.   

    如果你用的是QUERY的话,那在post后没有向数据库提交,加上以下的语句试试
      query.Database.StartTransaction;
      try
        query.ApplyUpdates;
        query.Database.Commit;
      except
        query.Database.Rollback;
        raise;
      end;
      query.CommitUpdates;如果用的是adoquery,那就试试改改ADOQUERY的各参数吧
      

  7.   

    我用的是dbisam单机数据库,如果有query缓存的话,为什么程序关闭后单独打开表,表里的内容也没变?
    我又作了一个简单的程序进行测试:
    窗体上放了两个数据库控件:DBISAMdatabase1和DBISAMQuery1,用这两个控件对表Vlast.dat和count.dat操作。
    程序如下:
    var
     sqlstr:string;
    begin
      if DBISAMDatabase1.Connected=true then DBISAMDatabase1.Connected:=false;
      DBISAMDatabase1.DatabaseName:='Vlast.dat';
      DBISAMDatabase1.Connected:=true;
      sqlstr:='select * from vlast';
      DBISAMQuery1.Close;
      DBISAMQuery1.DatabaseName:=DBISAMDatabase1.DatabaseName;
      dbisamquery1.SQL.Clear;
      dbisamquery1.SQL.Add(sqlstr);
      dbisamquery1.Active:=true;
      sqlstr:='insert into Vlast (name,Vcount,ScoreL) values('+'''zhang'''+',23'+',23.12'+')';
      DBISAMQuery1.Close;
      DBISAMQuery1.DatabaseName:=DBISAMDatabase1.DatabaseName;
      dbisamquery1.SQL.Clear;
      dbisamquery1.SQL.Add(sqlstr);
      dbisamquery1.ExecSQL;
      if DBISAMDatabase1.Connected=true then DBISAMDatabase1.Connected:=false;
      DBISAMDatabase1.DatabaseName:='count.dat';
      DBISAMDatabase1.Connected:=true;
      sqlstr:='select L1,L1N from count';
      DBISAMQuery1.Close;
      DBISAMQuery1.DatabaseName:=DBISAMDatabase1.DatabaseName;
      dbisamquery1.SQL.Clear;
      dbisamquery1.SQL.Add(sqlstr);
      dbisamquery1.Active:=true;
      dbisamquery1.First;
      while not dbisamquery1.Eof do
       begin
        DBISAMQuery1.Edit;
        DBISAMQuery1.Fieldbyname[DBISAMQuery1.FieldDefs[0].Name].asfloat:=DBISAMQuery1.Fieldbyname[DBISAMQuery1.FieldDefs[1].Name].asfloat+31;
        DBISAMQuery1.Fieldbyname[DBISAMQuery1.FieldDefs[1].Name].asinteger:=DBISAMQuery1.Fieldbyname[DBISAMQuery1.FieldDefs[1].Name].asinteger+1;
        DBISAMQuery1.Post;
        DBISAMQuery1.next;
       end;
    end;
    前面的对表Vlast.dat的select和insert操作都能正常执行,而对count.dat的edit和post操作之后,没有反应。