这个问题困扰我的主要原因是,我甚至包含了一段代码,如果记录已经存在,就不能添加它们。我几乎可以肯定,出于某种原因,更新只执行了两次。我还检查了调用filldatabase方法的方法是否不在某种循环中,但它只是在示例化类时执行的基本公共方法。它只示例化了一次。
下面是我的数据库填充方法的代码,它似乎将每条记录连续添加两次。
public void FillDatabase(String filename) {
try {
Statement statement = dbConnection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
String sql = "SELECT * FROM OTH";
ResultSet resultSet = statement.executeQuery(sql);
resultSet.first();
String file = "C:\\Users\\Desktop\\" + filename +".sql";
try(BufferedReader br = new BufferedReader(new FileReader(file))) {
for(String line; (line = br.readLine()) != null; ) {
line = line.substring(line.indexOf("VALUES") + 7, line.length() - 2);
String[] parts = line.split(",");
parts[1] = parts[1].replaceAll("'", "");
parts[2] = parts[2].replaceAll("'", "");
parts[3] = parts[3].replaceAll("'", "");
parts[4] = parts[4].replaceAll("'", "");
parts[5] = parts[5].replaceAll("'", "");
parts[6] = parts[6].replaceAll("'", "");
parts[7] = parts[7].replaceAll("'", "");
parts[8] = parts[8].replaceAll("'", "");
parts[9] = parts[9].replaceAll("'", "");
parts[10] = parts[10].replaceAll("'", "");
parts[11] = parts[11].replaceAll("'", "");
parts[12] = parts[12].replaceAll("'", "");
resultSet.last();
int resultSetSize = resultSet.getRow();
resultSet.first();
boolean addToDatabase = true;
for (int i = 0; i < resultSetSize; i++) {
if (resultSet.getString("filename").equals(parts[9])) { // If duplicate has been found
addToDatabase = false;
break;
}
resultSet.next();
}
if (addToDatabase) {
resultSet.moveToInsertRow();
resultSet.updateString("entity", parts[1].replaceAll("'", ""));
resultSet.updateFloat("s_val", Float.parseFloat(parts[2].replaceAll("'", "")));
resultSet.updateString("bdate", parts[3].replaceAll("'", ""));
resultSet.updateString("edate", parts[4].replaceAll("'", ""));
resultSet.updateInt("il", Integer.parseInt(parts[5].replaceAll("'", "")));
resultSet.updateInt("ih", Integer.parseInt(parts[6].replaceAll("'", "")));
resultSet.updateInt("jl", Integer.parseInt(parts[7].replaceAll("'", "")));
resultSet.updateInt("jh", Integer.parseInt(parts[8].replaceAll("'", "")));
resultSet.updateString("filename", parts[9].replaceAll("'", ""));
resultSet.updateString("source", parts[10].replaceAll("'", ""));
resultSet.updateString("contact", parts[11].replaceAll("'", ""));
resultSet.updateString("email", parts[12].replaceAll("'", ""));
resultSet.insertRow();
}
}
statement.close();
resultSet.close();
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
} catch (SQLException err) {
System.out.println(err.getMessage());
}
}
我可以直接运行正在使用的sql文件,如果表有适当数量的列,它就可以工作,但是sql文件会考虑我不需要的列。这就是为什么我包含了一个bufferedreader,它读取并分隔.sql文件的每一行。这一切都很正常,因为每个值都被分配给它对应的列。问题出现在我将记录添加到数据库之后,因为它们被添加了两次而不是一次。我应该澄清的是,不是两个值被添加到同一行的一列中,而是两个相同的行被添加到数据库中。
我最好的猜测是,也许是一个try-catch内部的try-catch导致了这个问题。或者因为我正在将表拉入一个resultset,然后在再次更新表之前对其进行编辑,而不是仅仅添加带有“insert into oth”的记录。但这种方法在过去对我很有效,特别是在使用c#时,所以我猜它不应该是这个问题的原因。
2条答案
按热度按时间kqqjbcuj1#
在java中,数组是基于零的。
在你的代码中,我看到你从位置1开始。
所以,检查文件名是否真的出现在位置10(
parts[9]
是第10部分)还是在第9位,最终改变parts[9]
至parts[8]
.3npbholx2#
问题是我从中读取的外部sql文件包含每行的重复行。所以我的代码并没有导致它被插入两次。
尽管在添加新行之前处理检查重复项的代码未能检测到重复项,即使它正在检查我正在向其中添加新行的相同结果集。
在添加另一行之前不更新resultset肯定有一些错误,因为当我将记录添加到空数据库时,不会检测到重复项,但是一旦记录被填充,任何其他运行都会检测到重复项,从而阻止添加更多的重复项。