Используя Java, обновите существующую строку таблицы SQL из Excel Sheet - PullRequest
0 голосов
/ 16 января 2020

Я использую apache Poi для извлечения данных из листа Excel, загруженного на сервер. Цель состоит в том, чтобы получить данные Excel, которые имеют четыре столбца (clientId, clientName, monthMinimum, setUpFee), и обновить ежемесячную минимальную сумму существующей строки и плату за установку, основанную на clientId, в существующей таблице базы данных с именем client. У меня есть этот код в другом разделе моего проекта для вставки нового клиента, и он работает, но я изо всех сил пытаюсь заставить его обновить существующий. Может кто-нибудь сказать мне, что я делаю не так с clientId, где он не обновляет эти два поля?

    @RequestMapping(value="/save/acctDocument")
    public String addAcctDoc(Model model, @ModelAttribute(value="newDocument") Document newDocument, @RequestParam("document") MultipartFile file) throws IOException{
//        Document doc=documentRepository.save(newDocument);
        newDocument.setStorage(storageService.storer(file));  //uploads the doc
        //find doc, read doc, save info to db client table
        int batchSize = 20;

        Connection connection = null;

        try {
            long start = System.currentTimeMillis();

            FileInputStream inputStream = new FileInputStream(appDir+"\\AcctUploadFile.xlsx");

            Workbook workbook = new XSSFWorkbook(inputStream);

            Sheet firstSheet = workbook.getSheetAt(0);
            Iterator<Row> rowIterator = firstSheet.iterator();

            connection = DriverManager.getConnection(jbdcUrl, dbusername, dbpassword);
            connection.setAutoCommit(false);

            String sql = "UPDATE client SET (monthlyMinimum, oliSetUpFee) VALUES (?, ?) WHERE  clientId = (?)";
            PreparedStatement statement = connection.prepareStatement(sql);

            int count = 0;

            rowIterator.next(); // skip the header row

            while (rowIterator.hasNext()) {
                Row nextRow = rowIterator.next();
                Iterator<Cell> cellIterator = nextRow.cellIterator();

                while (cellIterator.hasNext()) {
                    Cell nextCell = cellIterator.next();

                    int columnIndex = nextCell.getColumnIndex();

                    switch (columnIndex) {
                                                case 1:
                        long clientId = (long) nextCell.getNumericCellValue();
                        statement.setLong(3, clientId);
                        break;
                    case 2:
                        float monthlyMinimum = (float) nextCell.getNumericCellValue();
                        statement.setFloat(1, monthlyMinimum);
                        break;
                    case 3:
                       float setUpFee= (float) nextCell.getNumericCellValue();
                        statement.setFloat(2, setUpFee);
                        break;
                    }

                }

                statement.addBatch();

                if (count % batchSize == 0) {
                    statement.executeBatch();
                }

            }

            workbook.close();

            // execute the remaining queries
            statement.executeBatch();

            connection.commit();
            connection.close();
            File acctUploadFile = new File(appDir+"\\AcctUploadFile.xlsx");
            acctUploadFile.delete();

            long end = System.currentTimeMillis();
            System.out.printf("Import done in %d ms\n", (end - start));

        } catch (IOException ex1) {
            System.out.println("Error reading file");
            ex1.printStackTrace();
        } catch (SQLException ex2) {
            System.out.println("Database error");
            ex2.printStackTrace();
        }
        return  "redirect:/reports/";
    }


}

Обновление: я обновил код, чтобы включить мудрость из одного из комментариев, но он все еще не совсем работает. Я застреваю в операторе if для счетного модуля. Это ошибка базы данных, которую она выдает: java. sql .BatchUpdateException: неправильный синтаксис рядом с '('.

Ответы [ 2 ]

1 голос
/ 16 января 2020

clientId не установлен:

String sql = "UPDATE client SET (monthlyMinimum, setUpFee) VALUES (?, ?) WHERE clientId = clientId";

Записать clientId в качестве параметра и установить его после cellIterator:

String sql = "UPDATE client SET (monthlyMinimum, setUpFee) VALUES (?, ?) WHERE clientId = ?";

Statement.setLong (3, clientId) или setInteger (),

Порядок параметров запроса также неправильный:

[monthMinimum, setUpFee, clientId] [1,2,3] соответственно.

, поэтому месячные Minimun и setUpFee должны быть:

statement.setFloat(1, monthlyMinimum);

statement.setFloat(2, setUpFee);

0 голосов
/ 17 января 2020

Ответ выше решил половину моих проблем. Другая половина проблемы была заявлением об обновлении. Должно быть String sql = "UPDATE client SET monthlyMinimum = ? , oliSetUpFee= ? WHERE clientId = ?";

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...