Query1,DataSource1
DBGrid连接DataSource1
Query1设置缓存模式CachedUpdate:=True;
想要实现功能:
当我想在数据库中增加一个记录,Query1.insert;.....。
在我ApplyUpdates前先检查同样的记录在数据库中是否存在?如果存在那么先删除原来的。问题是:
当我用insert设置好字段后,DBGrid上显示相应的数据
保存时如果发现数据库中有重复记录,那么删除这个记录,但是这时,DBGrid中的数据也将清空。无法保存insert在缓冲中的数据了。不知道我的描述大家能明白不?

解决方案 »

  1.   

    有点晕
    本人是习惯通过sql来实现修改
      

  2.   

    判断不要等到 ApplyUpdates的时候,在 BeforePost 的时候就处理.  在缓存下视业务的不同,判断也会有一些差异. 可以只判断当前数据集,也可以还要加上判断 表中数据.2. 第二种情况一定要先处理掉重复记录.
      

  3.   

    Query1.insert;
    fields.fields[1].asstring:='a';
    //判断同样的记录是不是在数据库中存在,如果存在则删除ApplyUpdates;//这时前面insert的数据也将失效!
      

  4.   

    直接用Sql语句控制更灵活些 Insert时 可以用类似not Exists等过滤重复记录
      

  5.   

    谢谢华仔和卡庙的方法,但是这个还不是我需要的
    比如:
    我数据库中有一个姓名叫张三的记录;那么我的程序可以从外部的配置文件中导入一个记录,导入的数据我就通过insert显示在DBGrid上给客户看,那么这时用户想保存这个记录。然后就发生我上面描述的。
    所以对于华仔和卡庙说的,我觉得我这里不可能在insert前就对重复数据处理了!
      

  6.   

    要下班了我没太仔细看,如果可以,我觉得你可以用了一个临时表中转,将导入的数据先填到临时表,回头在写入实际表,之前写的存储过程一段代码,你参考参考,看看有没有帮助:  --将临时表的数据插入到实表中
      Insert into MeterTb(userId, scanTime, scanCode, meterNo, orderId, boxNo) 
             select userId, scanTime, scanCode, meterNo, orderId, boxNo from TmpMeterTb 
                where not Exists
                   (select 1 from MeterTb 
                      where MeterTb.MeterNo = TmpMeterTb.MeterNo
                      and MeterTb.OrderId = @OrderId)
                and OrderId = @OrderId and isExported <> 1 
      

  7.   


    这个我也处理过.如果只是 DataSet上的,视数据量的大小,做个遍历,来查是可以的.
      

  8.   

    华仔能再描述下吗?按我的意思就是在我insert前一般是不删除库里的数据,否则万一用户不保存那原来的数据就丢失了