java—从外部文件读取的记录会两次写入jdbc

bttbmeg0  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(388)

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

kqqjbcuj

kqqjbcuj1#

在java中,数组是基于零的。
在你的代码中,我看到你从位置1开始。
所以,检查文件名是否真的出现在位置10( parts[9] 是第10部分)还是在第9位,最终改变 parts[9]parts[8] .

3npbholx

3npbholx2#

问题是我从中读取的外部sql文件包含每行的重复行。所以我的代码并没有导致它被插入两次。
尽管在添加新行之前处理检查重复项的代码未能检测到重复项,即使它正在检查我正在向其中添加新行的相同结果集。
在添加另一行之前不更新resultset肯定有一些错误,因为当我将记录添加到空数据库时,不会检测到重复项,但是一旦记录被填充,任何其他运行都会检测到重复项,从而阻止添加更多的重复项。

相关问题