【问题标题】:How to compare records from a CSV file to those in a database before uploading如何在上传之前将 CSV 文件中的记录与数据库中的记录进行比较
【发布时间】:2016-09-10 11:24:45
【问题描述】:

我正在尝试将 CSV 文件上传到包含学生成绩的数据库中。我想为数据库中已经存在的学生记录更新一个字段,并为那些不存在的学生插入新记录。 CSV 文件包含新学生和现有学生的记录。

我使用两个字段 - idnumbercourseCode 来唯一标识数据库和 CSV 文件中的学生记录。

这是我到目前为止所尝试的...请任何人帮助我吗?

try{

   String updateSql = "update ResultUpload set idnumber = ?,ca = ?, exams = ?, total = ?, AAA=?,BPLUS=?,BBB=?,CPLUS=?,CCC=?,DDD=?,EEE=?,FFF=?,gpp=?,ugp=?,remarks=?,unit=?,level=?,courseCode=?,courseName=?,semester=? where idnumber=? and courseCode=?";
   String insertSql = "Insert into ResultUpload (idnumber,ca,exams,total,AAA,BPLUS,BBB,CPLUS,CCC,DDD,EEE,FFF,gpp,ugp,remarks,unit,level,courseCode,courseName,semester) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
   String sql = "select idnumber, courseCode from ResultUpload where idnumber = ? and courseCode = ?"; // no need to execute this statement inside a loop

   BufferedReader br = new BufferedReader(new FileReader(filename));
   Connection conn = null;

   PreparedStatement insertStatement = conn.prepareStatement(insertSql);
   PreparedStatement updateStatement = conn.prepareStatement(updateSql);
   PreparedStatement pst = conn.prepareStatement(sql);

   String line;
        while ((line = br.readLine()) != null) {
            String[] value = line.split(","); // check this line that it is not null
            pst.setString(1, value[0]);
            pst.setString(2, value[17]);
            ResultSet rs = pst.executeQuery();
            if (rs.next()) { // if there is an entry in the DB make update
                updateRecord(updateStatement, value);
                                    update_table();
            } else {
                insertRecord(insertStatement, value);
                                    update_table();
            }
            rs.close();
        }

                    br.close();  // close these resources in the finally block
        insertStatement.close();
        updateStatement.close();
        conn.close();





   }
    catch (SQLException | IOException ex) {
 ex.printStackTrace();      // handle exception here
    }
         // handle exception here



   finally{
       try{
       pst.close();
       rs.close();
       }
       catch(Exception e){}
}





    } 
}                                            


  private static void updateRecord(PreparedStatement preparedStatement,String[] value) throws SQLException {
    preparedStatement.setString(1, value[0]);
    preparedStatement.setString(2, value[1]);
            preparedStatement.setString(3, value[2]);
            preparedStatement.setString(4, value[3]);
            preparedStatement.setString(5, value[4]);
            preparedStatement.setString(6, value[5]);
            preparedStatement.setString(7, value[6]);
            preparedStatement.setString(8, value[7]);
            preparedStatement.setString(9, value[8]);
            preparedStatement.setString(10, value[9]);
            preparedStatement.setString(11, value[10]);
            preparedStatement.setString(12, value[11]);
            preparedStatement.setString(13, value[12]);
            preparedStatement.setString(14, value[13]);
            preparedStatement.setString(15, value[14]);
            preparedStatement.setString(16, value[15]);
            preparedStatement.setString(17, value[16]);
            preparedStatement.setString(18, value[17]);
            preparedStatement.setString(19, value[18]);
            preparedStatement.setString(20, value[19]);


    preparedStatement.executeUpdate();
}

   private static void insertRecord(PreparedStatement preparedStatement,String[] value) throws SQLException {
    preparedStatement.setString(1, value[0]);
    preparedStatement.setString(2, value[1]);
            preparedStatement.setString(3, value[2]);
            preparedStatement.setString(4, value[3]);
            preparedStatement.setString(5, value[4]);
            preparedStatement.setString(6, value[5]);
            preparedStatement.setString(7, value[6]);
            preparedStatement.setString(8, value[7]);
            preparedStatement.setString(9, value[8]);
            preparedStatement.setString(10, value[9]);
            preparedStatement.setString(11, value[10]);
            preparedStatement.setString(12, value[11]);
            preparedStatement.setString(13, value[12]);
            preparedStatement.setString(14, value[13]);
            preparedStatement.setString(15, value[14]);
            preparedStatement.setString(16, value[15]);
            preparedStatement.setString(17, value[16]);
            preparedStatement.setString(18, value[17]);
            preparedStatement.setString(19, value[18]);
            preparedStatement.setString(20, value[19]);


    preparedStatement.executeUpdate();

}

【问题讨论】:

  • 您面临的问题是什么;而且,这是一道作业题吗?
  • 我面临@manish的问题是,csv文件不断上传,数据库中存在的记录没有更新
  • 提示:== does not work for comparing Strings; br.close() 应该在循环之外。
  • 检查您的updateRecord() 方法是否正确匹配位置参数和字段值。并检查字段的正确类型,例如,如果您的所有字段都是String 类型,因为我们正在为所有字段调用PreparedStatementsetString() 方法。

标签: java mysql csv


【解决方案1】:

我稍微修改了你的代码如下(但代码不完整;留作作业:-)):

try {
        // Create sql statements

        String updateSql = "update ResultUpload set ca = ?, exams = ?, total = ?, AAA=?, BPLUS=?, BBB=?, CPLUS=?, CCC=?, DDD=?, EEE=?, FFF=?, gpp=?, ugp=?, remarks=?, unit=?, level=?, courseName=?, semester=? where idnumber=? and courseCode=?";
        String insertSql = "Insert into ResultUpload (idnumber,ca,exams,total,AAA,BPLUS,BBB,CPLUS,CCC,DDD,EEE,FFF,gpp,ugp,remarks,unit,level,courseCode,courseName,semester) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
        String sql = "select idnumber, courseCode from ResultUpload where idnumber = ? and courseCode = ?"; 

        BufferedReader br = new BufferedReader(new FileReader("fileName"));
        Connection conn = null;

        // Create PreparedStatement objects for both queries; and this
        // should be done outside of the loop
        PreparedStatement insertStatement = conn.prepareStatement(insertSql);
        PreparedStatement updateStatement = conn.prepareStatement(upadteSql);
        PreparedStatement pst = conn.prepareStatement(sql);

        String line;
        while ((line = br.readLine()) != null) {
            String[] value = line.split(","); // check this line that it is not null
            pst.setString(1, value[0]);
            pst.setString(2, value[1]); 
            ResultSet rs = pst.executeQuery();
            if (rs.next()) { // if there is an entry in the DB make update
                updateRecord(updateStatement, value);
            } else {
                insertRecord(insertStatement, value);
            }
            rs.close();
        }
        br.close();  // close these resources in the finally block
        insertStatement.close();
        updateStatement.close();
        conn.close();
    } catch (SQLException ex) {
        ex.printStackTrace();
    } catch (IOException ex) {
        ex.printStackTrace();
    }

private static void updateRecord(PreparedStatement preparedStatement,
        String[] value) throws SQLException {
    preparedStatement.setString(19, value[0]); // in where clause: value of idnumber
    preparedStatement.setString(20, value[1]); // in where clause: value of coursecode

    // 
    preparedStatement.setString(1, value[ca]);  // array index for 'ca'
    preparedStatement.setString(2, value[exams]); // array index for 'exams'
    // set values for rest of the fields ....

    preparedStatemtn.executeUpdate();
}

private static void insertRecord(PreparedStatement preparedStatement,
        String[] value) throws SQLException {
    preparedStatement.setString(1, value[0]); // index of array for 'idnumber'
    preparedStatement.setString(2, value[]); // index of array for 'ca'
    // set values for rest of the fields ....

    preparedStatement.executeUpdate();
}

还有here you'll find how to use PreparedStatement。希望对您有所帮助。

【讨论】:

  • 如果您需要对代码的任何部分进行任何说明,请给我留言。
  • 我已经尽力使用修改后的代码,但是当我尝试上传包含需要更新的记录和将插入的新记录的 csv 文件时,没有任何反应......并且没有'不提示任何错误,它既不插入也不更新记录a
  • 我修改了updateStatementcatch 块,以便您现在可以获取堆栈跟踪。试试看,给我留言。我刚刚修改了代码,一切都对我有用:读取 csv 文件,并将进行更新和插入。确实,您必须为插入数据的情况创建一个insertRecord()
  • 并注意PreparedStatement中的位置参数;他们开始计算 1、2、3、4、...、正确的数据类型和字段顺序。
  • thanks@ujulu 你真的帮了我,我理解了你在代码中的所有概念,并使用如下......但仍然没有在数据库中插入或更新,请你介意看看是什么我遇到的逻辑错误。
【解决方案2】:

为什么不在重复键更新时使用 insert ...?

【讨论】:

  • 这应该是对问题的评论,而不是答案。
  • 我认为这比在循环中使用多个选择查询进行编码要好得多。
猜你喜欢
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
相关资源
最近更新 更多