【发布时间】:2016-09-10 11:24:45
【问题描述】:
我正在尝试将 CSV 文件上传到包含学生成绩的数据库中。我想为数据库中已经存在的学生记录更新一个字段,并为那些不存在的学生插入新记录。 CSV 文件包含新学生和现有学生的记录。
我使用两个字段 - idnumber 和 courseCode 来唯一标识数据库和 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 comparingStrings;br.close()应该在循环之外。 -
检查您的
updateRecord()方法是否正确匹配位置参数和字段值。并检查字段的正确类型,例如,如果您的所有字段都是String类型,因为我们正在为所有字段调用PreparedStatement的setString()方法。