Таблица SQL-Sever не обновляется после вставки - PullRequest
0 голосов
/ 02 июня 2018

В настоящее время я изучаю Java JDBC с базой данных MSSQL.И я не могу вставить данные в таблицу Stats с помощью приведенного ниже кода, хотя все шаги завершаются успешно.

Код: получение данных из таблицы Entity, сохранение их в Collection.Наконец, ввод данных из этой коллекции в таблицу Stats.

Код insertCommand.executeUpdate() возвращает 1, но таблица Stats не содержит данных, которые код пытается вставить.

Почему это происходит?

protected void FillStats(Connection connection) throws SQLException {
    PreparedStatement selectCmd = DatabaseHelper.createCommand(connection,
            "Select Id, Created, CreatedBy, Updated, UpdatedBy from Entity");
    System.out.println("A SQL statement has been created to retrieving data from Entity table.");
    List<Object[]> list = new ArrayList<Object[]>();
    try (ResultSet results = selectCmd.executeQuery()) {
        int numberOfObject = 0;
        System.out.println(">>> Start getting data from Entity table.");
        while (results.next()) {
            list.add(new Object[] { results.getInt(1), results.getDate(2), results.getString(3), results.getDate(4),
                    results.getString(5) });
            ++numberOfObject;
        }
        System.out.println("Total number of records retrieved: " + numberOfObject);
    }

    for (Object[] media : list) {
        PreparedStatement insertCmd = DatabaseHelper.createCommand(connection,
                "Insert into Stats ([Id], [Created], [CreatedBy], [Updated], [UpdatedBy]) values (?, ?, ?, ?, ?)");
        insertCmd.setInt(1, (int) media[0]);
        insertCmd.setDate(2, (Date) media[1]);
        insertCmd.setString(3, (String) media[2]);
        insertCmd.setDate(4, (Date) media[3]);
        insertCmd.setString(5, (String) media[4]);

        int updated = insertCmd.executeUpdate();
        if (updated > 0) {
            System.out.println("success");
        } else {
            System.out.println("Stuck somewhere");
        }
    }
}

Команда создания таблицы статистики:

createCommand(con, "create table Stats "
            + "(Id INT not null, "
            + "Created DATETIME not null, "
            + "CreatedBy NVARCHAR(255) not null, "
            + "Updated DATETIME null, "
            + "UpdatedBy NVARCHAR(255) null, "
            + "primary key (Id))").execute()

Объект таблицы:

CREATE TABLE [Entity](
    [Id] [int] NOT NULL,
    [Version] [int] NOT NULL,
    [Name] [nvarchar](255) NOT NULL,
    [Description] [nvarchar](max) NULL,
    [Properties] [nvarchar](max) NULL,
    [TypeId] [int] NOT NULL,
    [TypeVersionId] [int] NOT NULL,
    [Created] [datetime] NOT NULL,
    [CreatedBy] [nvarchar](255) NOT NULL,
    [Updated] [datetime] NULL,
    [UpdatedBy] [nvarchar](255) NULL,
PRIMARY KEY 
(
    [Id] ASC
)) 

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Я нашел кое-что, что могло бы помочь.Вы объявили «Создан и обновлен» как DATETIME, для этого требуется метка времени, а не дата.Также вы создаете PreparedStatement для команды вставки в каждом цикле, попробуйте его перед циклом.Я также рекомендую закрыть DB-объекты перед выходом.Итак, я успешно попробовал это с этим кодом:

protected void FillStats(Connection connection) throws SQLException {
    PreparedStatement selectCmd = connection.prepareStatement("Select Id, Created, CreatedBy, Updated, UpdatedBy from Entity");

    System.out.println("A SQL statement has been created to retrieving data from Entity table.");
    List<Object[]> list = new ArrayList<Object[]>();
    try (ResultSet results = selectCmd.executeQuery()) {
        int numberOfObject = 0;
        System.out.println(">>> Start getting data from Entity table.");
        while (results.next()) {
            list.add(new Object[]{results.getInt(1), results.getTimestamp(2), results.getString(3), results.getTimestamp(4),
                results.getString(5)});
            ++numberOfObject;
        }
        System.out.println("Total number of records retrieved: " + numberOfObject);
        results.close();
        selectCmd.close();
    }

    PreparedStatement insertCmd = connection.prepareStatement("Insert into Stats ([Id], [Created], [CreatedBy], [Updated], [UpdatedBy]) values (?, ?, ?, ?, ?)");
    for (Object[] media : list) {

        insertCmd.setInt(1, (int) media[0]);
        insertCmd.setTimestamp(2, (Timestamp) media[1]);
        insertCmd.setString(3, (String) media[2]);
        insertCmd.setTimestamp(4, (Timestamp) media[3]);
        insertCmd.setString(5, (String) media[4]);

        int updated = insertCmd.executeUpdate();
        if (updated > 0) {
            System.out.println("success");
        } else {
            System.out.println("Stuck somewhere");
        }
    }
    insertCmd.close();
}
0 голосов
/ 02 июня 2018

Я заглянул в документ MySQL и, как я вижу, вы не можете дать имя столбца в квадратных скобках.Вам нужно написать запрос как

Insert into TableName (column1 , column2 , column3) values (value1 , value2 , value3);

Поскольку вы используете то же количество значений, что и количество столбцов, вы можете напрямую указать значения как

Insert into TableName values (your values);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...