本帖最后由 aion729812 于 2012-09-05 09:41:12 编辑

解决方案 »

  1.   

    目标表的数据量大么?如果不是很大,考虑先把所有crad_id选择出来,放入 Set 中,那么导入时就可以比对下再进行导入了。如果数据量很大,就只能靠数据库关于crad_id的唯一索引来处理了;那么执行insert时要1条条执行,不要放在一个事务中。insert失败是可以利用返回值来判断的。
      

  2.   

    数据量应该不是很大,一次导入最多最多也就20,30条数据,
    String curFieldValue="xxx";//当前要插入到数据库中的关键字的字段值
                         String strQuerySql = "select  crad_id  from  IOAS_CAPITALASSETS";
                         //从数据库中查询出该关键字的所有字段值,下面的方法ExecuteDataTable()封装数据库查询,并返回一个包含结果的DataTable
                         DataTable queryResultDT = DataBase.ExecuteDataTable(strQuerySql,DataBase.Config);
             
                         //利用DataTable的Select方法找出相同字段值的记录
                         DataRow[] dr= queryResultDT.Select("FnshChartNo ='"+curFieldValue+"'");//如果为整形等则不需要单引号
             
                         if (dr != null && dr.Length > 0)
                        {//当查询出来的行数组不为空,并且至少有一行,则说明数据库中已经存在该关键字的记录,不能插入
                            System.out.println("数据库中已经存在相同字段值的记录,不能插入");
                           return;
                        }
                       else
                        {
                         //执行插入等后续工作   
                                     }
    我这样的方法行不行,有错的地方可以帮忙看下嘛?谢谢
      

  3.   


    NoNoNo,我是问数据库中的数据量大不大,而不是导入量。导入量越小,数据库数据量越大,这种情况下就越没有必要优化;
    直接在insert失败的时候输出crad_id就行了。如果数据库表已有数据量很小,而导入量很大,才有优化必要;但你二楼代码不是我说的那个意思,你是每次导入一行数据前,去数据库里面做个查询,不过也能解决问题。我的原意是:
      Result rs = stmt.executeQuest("select crad_id from IOAS_CAPITALASSETS");
      HastSet ids = new HashSet();
      while (rs.next()) ids.add(rs.getString(1)); // 这样就把所有id都拿到了。
    后面处理Excel记录时可以直接判断:
      if (ids.contains(xxxooo)) continue; // 跳过该行的导入
    不过总的来说,我还是觉得,每次只导入30行,没必要特殊处理,就判断insert失败的时候,提示下就行了。
      

  4.   

    我开始是这么想的,我的SQL语句是组装的嘛,在组装前,我先把数据库里面的crad_id的值都取出来,然后在for循环之后把这一条要插入的crad_id跟已有的crad_id比较,if相同就输出“该条数据信息已经存在”,else就执行插入语句。这样行不行?
      

  5.   

    JDBC 在insert的时候提供的返回值的,根据返回值判断是否成功了
      

  6.   

    但是我这个重复数据的一句就只是单单一个crad_id,别的一不一样都行,那是不是把crad_id设置成主键就行了呢?
      

  7.   

    你的意思是导入文件里的crad_id和数据库的crad_id重复?那你可以这样处理。
    那如果导入文件里本身就用重复的crad_id呢?总不能插入每一条之前都就重新查询数据库吧。
    最好catch下,如果返回的是主键冲突的key值,就输出“该条数据信息已经存在”,然后continue执行。
      

  8.   

    好像明白你说的意思了,我开始想的好像有点错,我开始想的是先把数据库的crad_id都取出来,但是忘记导入文件可能有相同crad_id了,但是   “最好catch下,如果返回的是主键冲突的key值,就输出“该条数据信息已经存在”,然后continue执行。”这句话怎么实现啊?小弟刚刚开始接触,不是很懂,希望指点下。谢了