本意是想在窗口打开的时候清空某个数据表的内容,我在BUTTON上写了如下代码:
while not adoataset1.eof do
  begin
    adoataset1.delete;
  end;
但运行时系统报错:键列信息不足或不正确,更新影响到过多的行。
我用的数据库是ACESS的,表的内容没有定义主键。有部分列值是空白。如:
编号  姓名   数量  单价  金额  备注      小张    3     3             
其中金额是计算型的,由数量*单价得出值,(数据表本身没有金额这个字段,我想可能这是原因所在)。
但报错后我继续按F9键运行,数据表的内容就清空了。请各位前辈指导一下,怎样才使其不报错。谢谢。

解决方案 »

  1.   

    你这样删除不行....漏洞太多了//==============================================================================
    //数据安全删除******************************************************************
    //==============================================================================
    function Data_SafeDelete(DataSet: TDataSet; DBGrid: TDBGrid): Boolean;
    var i: integer;//TDBDataSet是TQuery,TTable,TStoredProc的直接父类
    begin
      Result := false;
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      //TDBDataSet是TQuery,TTable,TStoredProc的直接父类(两层结构)*******************
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      if (DataSet is TDBDataSet) then
      begin
        if DBGrid<>nil//如果是从DBGRid中执行删除
        then try
               for i:=1 to DBGrid.SelectedRows.Count do
               begin//多行选择
                 (DataSet as TDBDataSet).GotoBook(Pointer(DBGrid.SelectedRows.Items[i-1]));
                 (DataSet as TDBDataSet).Delete;
               end;
             except
               Abort;
             end
        else (DataSet as TDBDataSet).Delete;
        //==========================================================================
        //提交到数据库服务器********************************************************
        //==========================================================================
        if (DataSet as TDBDataSet).Database.InTransaction then (DataSet as TDBDataSet).Database.Rollback;
        (DataSet as TDBDataSet).Database.StartTransaction;//开始提交一个事务
        try
          (DataSet as TDBDataSet).ApplyUpdates;//把缓存中未决的记录写到数据集中
          (DataSet as TDBDataSet).Database.Commit;//把调用StartTransaction以来所有的数据变化都反映到服务器上,与Query_Main.Database.Rollback相反
          Result := true;
        except
          (DataSet as TDBDataSet).CancelUpdates;
          (DataSet as TDBDataSet).Database.Rollback;//把调用StartTransaction以来所有的数据变化都取消,与Query_Main.Database.Commit相反
          Result := false;
        end;
        (DataSet as TDBDataSet).CommitUpdates;
      end
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      //TClientDataSet远程更新(三层结构)********************************************
      //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      else if (DataSet is TClientDataSet) then
      begin
        if DBGrid<>nil//如果是从DBGRid中执行删除
        then try
               for i:=1 to DBGrid.SelectedRows.Count do
               begin//多行选择
                 (DataSet as TClientDataSet).GotoBook(Pointer(DBGrid.SelectedRows.Items[i-1]));
                 (DataSet as TClientDataSet).Delete;
               end;
             except
               Abort;
             end
        else (DataSet as TClientDataSet).Delete;
        //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        if (DataSet as TClientDataSet).ApplyUpdates(0)=0 then
        begin
          Result := true;
        end else
        begin
          Result := false;
          Abort;
        end;
      end;
    end;
      

  2.   

    adoataset1.First;
    while not adoataset1.eof do
      begin
        adoataset1.delete;
        adoataset1.Next;
      end;
    或直接用SQL语句’delete table';
      

  3.   

    因为表中的数据有重复的行存在,所以报错。直接用SQL语句就可以了
    delete from tablename
      

  4.   

    直接用SQL:'truncate table tablename'