从外部文件读取的记录将被写入JDBC两次

时间:2016-05-10 08:17:54

标签: java mysql jdbc resultset

这个问题困扰我的主要原因是因为我甚至包含了一段代码,如果已经存在,就会阻止添加记录。而且我几乎可以肯定,由于某种原因,更新会被执行两次。我还检查过调用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#时,所以它不应该是这个问题的原因,我猜。

2 个答案:

答案 0 :(得分:0)

在java 数组基于零

在你的代码中,我看到你从位置1开始。

因此,检查文件名是否确实存在于位置10(parts[9]是第10部分)或位置9中,并最终将parts[9]更改为{{1 }}

答案 1 :(得分:0)

问题是我正在读取的外部SQL文件包含每行的重复行。所以我的代码实际上并没有导致它被插入两次。

虽然在添加新行之前处理重复项检查的代码无法检测到重复项,即使它正在检查相同的ResultSet,但我还是要添加新行。

在添加另一行之前必须有一些错误不会更新结果集,因为当我将记录添加到空数据库时,永远不会检测到重复项,但是一旦填充完毕,任何其他运行都将检测到重复项和防止添加更多重复项。