下面的程序实现把strggrd2(stringgrid对象)所选的纪录行进行删除,在删除时无提示错误,但是无法删除纪录。这段程序有何问题?try
   dm.Connection.BeginTrans;
   //label6.Caption:=trim(strggrd2.Cells[3,strggrd2.Row]);
   with dm.qr2  do
   begin
      close;
      sql.Text:='delete classname where cl_name=:a5';
      parameters.ParamByName('a5').Value:=trim(strggrd1.Cells[3,strggrd2.Row]);
      execsql;
   end;
finally
    try
      dm.Connection.CommitTrans;
      stringgriddelete(strggrd2,strggrd2.Row);
      lbl_sum.Caption:=inttostr(strggrd2.RowCount-1)+' 个班级';
    except
      MessageBox(handle,'操作失败,请重试!','提示',mb_ok+mb_iconinformation);
      dm.Connection.RollbackTrans ;
    end;
  end;

解决方案 »

  1.   

    with dm.qr2  do
       begin
          close;//加入一句:sql.clear;
          sql.Text:='delete classname where cl_name=:a5';
          parameters.ParamByName('a5').Value:=trim(strggrd1.Cells[3,strggrd2.Row]);
          execsql;
       end;
      

  2.   

    该表的班级字段为cl_name,我先前把它设置为主键,由于在添加类似数据的时候(实际上不重复,比如计算机20041和计算机20042),出现错误,提示主键的值不能重复。因为班级名类似的情况,后来只好取消主键。就形成删除不成功的情况,如何解决?
      

  3.   

    后来检查了,按上面的一位朋友说的在close后面增加sql.clear。然后检查实现“添加”功能的代码发现也少了sql.clear,后来又把这句加上去。最后,在设置该表的cl_name字段设置为主键。在运行程序时无错误提示。但是还是不能删除数据(无提示错误)。我编写的另一个子程序能实现删除(代码和上面的差不多)。是不是sql2000或其它问题
      

  4.   

    把SQL语句放到查询分析器中执行一下,如果能删除的话,还是你的代码有问题。
    另外,在你的事务中只有一个SQL需要执行,所以没有必要用到Trans,直接执行就可以了。
    还有,把try...except...end去掉再执行一下看一下具体有没有出错信息。
      

  5.   

    同意 zzllabc(抱朴子--清心释累,绝率忘情)的意见,应该会提示“删除多条纪录”,这样就可以把同名纪录处理一下就行了
      

  6.   

    问题解决了。谢谢大家的关心。有两个问题。一个是由于没有sql.clear造成添加相同纪录。
    另一个是strggrd1.Cells[3,strggrd2.Row应该是strggrd2.Cells[3,strggrd2.Row。
    分数不多。希望谅解!