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

标签 java mysql jdbc resultset

这个问题让我困惑的主要原因是因为我什至添加了一段代码来阻止添加记录(如果它们已经存在)。而且我几乎可以肯定,出于某种原因,更新只会执行两次。我还检查了调用 FillDatabase 方法的方法不在某种循环中,但它只是在实例化类时执行的基本公共(public)方法。而且它只实例化一次。

这是我的数据库填充方法的代码,它似乎连续两次添加每条记录。

    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 导致了问题。或者因为我将表拉入结果集,然后在再次更新表之前对其进行编辑,而不是仅使用“INSERT INTO OTH”添加记录。但这种方法过去对我有用,尤其是在使用 C# 时,所以我猜它不应该是这个问题的原因。

最佳答案

在java中数组是从零开始的

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

因此,检查文件名是否确实出现在位置 10(parts[9] 是第 10 个部分)或位置 9 中,并最终更改 零件[9]零件[8]

关于java - 从外部文件读取的记录会写入 JDBC 两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37132846/

相关文章:

java - 多线程文件传输到 FTP 服务器

java - 如何用Java连接MS SQL数据库?

java - JDBC SQL SELECT 查询总和方法行为不正确

mysql - 导轨 3 : Change charset and collation of an existing mysql database

插入大量数据时出现Java SQL异常

java - 如何在android中放大位图的触摸点?

java - 未连接到公司VPN时从Maven存储库下载 Artifact

java - SpringMVC REST Web 服务

.net - 如何在 .NET MySqlCommand 中使用 MySql 用户定义变量?

php - 更新两个表 Codeigniter