这个问题困扰我的主要原因是因为我甚至包含了一段代码,如果已经存在,就会阻止添加记录。而且我几乎可以肯定,由于某种原因,更新会被执行两次。我还检查过调用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 try中的try-catch可能导致问题。或者因为我将表拉入ResultSet,然后在再次更新表之前编辑,而不是仅添加“INSERT INTO OTH”的记录。但是这种方法在过去对我有用,特别是在使用C#时,所以它不应该是这个问题的原因,我猜。
答案 0 :(得分:0)
在java 数组基于零。
在你的代码中,我看到你从位置1开始。
因此,检查文件名是否确实存在于位置10(parts[9]
是第10部分)或位置9中,并最终将parts[9]
更改为{{1 }}
答案 1 :(得分:0)
问题是我正在读取的外部SQL文件包含每行的重复行。所以我的代码实际上并没有导致它被插入两次。
虽然在添加新行之前处理重复项检查的代码无法检测到重复项,即使它正在检查相同的ResultSet,但我还是要添加新行。
在添加另一行之前必须有一些错误不会更新结果集,因为当我将记录添加到空数据库时,永远不会检测到重复项,但是一旦填充完毕,任何其他运行都将检测到重复项和防止添加更多重复项。