Вставка данных в БД ОШИБКА: столбцы типа 'VARCHAR' не могут содержать значения типа 'INTEGER' - PullRequest
0 голосов
/ 09 июня 2018

Я построил БД, и сейчас я пишу функцию, которая вставляет данные в эту БД.Я полагаю, что проблема в том, чего я не вижу, я получаю ошибку:

Столбцы типа 'VARCHAR' не могут содержать значения типа 'INTEGER'.

хотя я полностью понимаю, что это значит, я просто не могу заставить его работать.

вот мой код для вставки:

public static void insertIntoCouponsDB(long COMPANY_ID, String TITLE, String START_DATE, String END_DATE, int AMOUNT, String TYPE, String MESSAGE, double PRICE, String IMAGE) throws SQLException {

    Connection connection = DriverManager.getConnection(connectionString);

    String sql = String.format("insert into Coupons (COMPANY_ID, TITLE, START_DATE,END_DATE,AMOUNT,TYPE,MESSAGE,PRICE,IMAGE) values (%d, '%s', '%s','%s',%d,'%s','%s',%.2f,'%s')",COMPANY_ID,TITLE,START_DATE,END_DATE,AMOUNT,TYPE,MESSAGE,PRICE,IMAGE);

    PreparedStatement preparedStatement = connection.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);

    preparedStatement.executeUpdate();

    ResultSet resultSet = preparedStatement.getGeneratedKeys();

    resultSet.next();

    int id = resultSet.getInt(1);

    System.out.println("Insertion into Coupons DONE !!! New ID: " + id);

}

}

и это код для создания табке:

public static void buildCouponsDB() {

    try {
        Connection connection = DriverManager.getConnection(connectionString);
        Statement statement = connection.createStatement();



        String sql = "create table Coupons (" +
                "ID bigint not null primary key " + 
                "generated always as identity(start with 1, increment by 1), "+
                "COMPANY_ID bigint not null, "+
                "TITLE varchar(50) not null, "+
                "START_DATE date not null, "+
                "END_DATE date not null, "+
                "AMOUNT integer not null, "+
                "TYPE varchar(50) not null, "+
                "MESSAGE varchar(250) not null, "+
                "PRICE double not null, "+
                "IMAGE varchar(100) not null)";


        statement.executeUpdate(sql);
        System.out.println("Coupons Table has been Created Succesfully !!");

    } catch (Exception ex) {
        System.out.println(ex.getMessage());
    }

}

Кто-нибудь может помочь?Я начинающий, так что извините, если это легко вопрос, но все же, с просьбой о помощи.Заранее спасибо.

1 Ответ

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

Похоже, DerbyDB не поддерживает неявное преобразование из целых чисел в тип данных varchar, как это делают многие (большинство?) Другие базы данных.
Быстрый просмотр документации не дал никакой информации о неявномпреобразования.

Существует CAST функция CAST ( [ expression | NULL | ? ] AS dataType ), но из таблицы в документации видно, что преобразование из всех числовых типов данных (SMALLINT, INTEGER, BIGINT, DECIMAL и т. д.) неподдерживается.

К счастью, еще одна функция [CHAR (https://db.apache.org/derby/docs/10.14/ref/rrefbuiltchar.html)), и, похоже, эту функцию можно использовать для преобразования числовых значений в тип данных varchar:

Синтаксис целочисленных символов

CHAR (integerExpression)

integerExpression

Выражение, которое возвращает значение, являющееся целочисленным типом данных(SMALLINT, INTEGER или BIGINT.) Результатом является символьное строковое представление аргумента в виде целочисленной константы SQL.из n символов, которые являются значащими цифрами, представляющими значение аргумента с предшествующим знаком минус, если аргумент отрицательный.Результат выравнивается по левому краю.

  • Если первый аргумент является SMALLINT: длина результата равна 6. Если число символов в результате меньше 6, то результат дополняетсясправа с пробелами до длины 6.
  • Если первый аргумент - INTEGER: длина результата равна 11. Если число символов в результате меньше 11, то результат дополняется насправа с пробелами до длины 11.
  • Если первый аргумент является BIGINT: длина результата равна 20. Если число символов в результате меньше 20, то результат дополняется справас пробелами длиной 20.

Поэтому вы должны использовать функцию CHAR для преобразования чисел в тип данных VARCHAR .

Быстрый тест, который я провел с помощью ij клиента Derby, показал, что вышеприведенное верно:

ij> connect 'jdbc:derby://localhost:1527/myDB;create=true'
> ;
ij> create table x( x integer, y varchar(20) );
0 wierszy wstawionych/zaktualizowanych/usuniŕtych

ij> insert into x values( 1,1);
BúąD 42821: Kolumny typu 'VARCHAR' nie mog╣ przechowywaŠ wartoťci typu 'INTEGER'.

ij> insert into x values( 1, cast(1 as varchar));
BúąD 42X01: B│╣d sk│adniowy: Encountered ")" at line 1, column 43.
Issue the 'help' command for general information on IJ command syntax.
Any unrecognized commands are treated as potential SQL commands and executed directly.
Consult your DBMS server reference documentation for details of the SQL syntax supported by your server.

ij> insert into x values( 1, char(1));
1 wiersz wstawiony/zaktualizowany/usuniŕty
ij> commit;
ij> select * from x;
X          |Y
--------------------------------
1          |1

1 wiersz wybrany
ij>

РЕДАКТИРОВАТЬ


Кажется, что CAST( 1 AS CHAR ) также работает, я сделал тест:

ij> insert into x values( 1, cast(1 as char));
1 wiersz wstawiony/zaktualizowany/usuniŕty
ij>
...