我更新一个表,从form1里的30多个edit,memo等中取内容,现在不知道用户修改了其中几个,那么我就选择全部更新到库里,写update句子的时候岂不是要写30多个字段,很麻烦啊,有简单一点的办法没有?不光是UPDATE的简单办法,整个更新的解决办法也可以

解决方案 »

  1.   

    如果不是insert,完全可以用dbedit和dbmemo来完成工作。
      

  2.   

    可以判断一下新旧值是否相等,相等就不处理,update语句逐个拼接起来
    若30个都改了,就得写上30个字段更新,没其它办法!!!
      

  3.   


    我去看看dbedit这些的具体应用
      

  4.   

    我的MIS框架里,update/insert都是自动根据edit名字生成对应的字段填写语句
    只是要求edit的名字必须是:(与表名对应的)特定前缀+字段名
      

  5.   


    //新增,修改记录
    //ThashTable 是我自己实现的一个key数组类
    //_COUNT为特殊字段。更新自动+1
    function Edit(AData: THashTable; table:string; where:string = ''):string;
    var
      i: integer;
      Key: string;
    begin
      Result := '';
      ConnectDatabase();
      try
        Form1.ADOQuery1.SQL.Text := 'select * from ' + table + where;
        Form1.ADOQuery1.Open;
        if where = '' then Form1.ADOQuery1.Append
        else Form1.ADOQuery1.Edit;
        for i := 0 to AData.Count - 1 do
          begin
            Key := AData.HtGetKey(i);
            if Key = '_COUNT' then Form1.ADOQuery1.FieldValues[Key] := Form1.ADOQuery1.FieldByName(Key).AsInteger + 1
            else Form1.ADOQuery1.FieldValues[Key] := AData.HtGet(Key);
          end;
        Form1.ADOQuery1.Post;
        if where = '' then
          begin
            Form1.ADOQuery1.Last;
            Result := Form1.ADOQuery1.FieldValues['ID'];
          end;
      finally
        CloseDatabase;
      end;
    end;
      

  6.   


    //新增,修改记录
    //THashTable 是我自己实现的一个key数组类
    //_COUNT为特殊字段。更新自动+1
    function Edit(AData: THashTable; table:string; where:string = ''):string;
    var
      i: integer;
      Key: string;
    begin
      Result := '';
      ConnectDatabase();
      try
        Form1.ADOQuery1.SQL.Text := 'select * from ' + table + where;
        Form1.ADOQuery1.Open;
        if where = '' then Form1.ADOQuery1.Append
        else Form1.ADOQuery1.Edit;
        for i := 0 to AData.Count - 1 do
          begin
            Key := AData.HtGetKey(i);
            if Key = '_COUNT' then Form1.ADOQuery1.FieldValues[Key] := Form1.ADOQuery1.FieldByName(Key).AsInteger + 1
            else Form1.ADOQuery1.FieldValues[Key] := AData.HtGet(Key);
          end;
        Form1.ADOQuery1.Post;
        if where = '' then
          begin
            Form1.ADOQuery1.Last;
            Result := Form1.ADOQuery1.FieldValues['ID'];
          end;
      finally
        CloseDatabase;
      end;
    end;
      

  7.   

    如果使用数据库联动的控件dbedit,dbmemo就比较好做了,如果还是用普通的话,可以
    先定位到当前记录,然后用
    adoquery.edit;
    adoquery.fieldbyname('aa').value := ....
    adoquery.fieldbyname('bb').value := ....
    ........................................
    adoquery.post;
      

  8.   

    用DBEDIT简单,或直接在DBGRID中修改数据,数据会自动提交,不用写UPDATE语句
      

  9.   

    在edit,memo的onchange 记录下那些数据改变了 维护bIschange :boolean 
    如果改变 即adoquery.fieldbyname('aa').value := ....
      

  10.   

    最后我想想还是2楼用dbedit那些可能更方便一点,一个小程序,数据量也很小,不存在什么数据量大导致的一些问题,感谢大家