将数据插入数据库错误:“VARCHAR”类型的列不能包含“INTEGER”类型的值

时间:2018-06-09 08:17:32

标签: java sql jdbc derby

我已经构建了一个数据库,现在我正在编写一个将数据插入该数据库的函数。 我想这个问题是我看不到的,我得到的错误是:

  

“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);

}

}

这是tabke创建的代码:

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 :(得分:0)

似乎DerbyDB不支持从整数到varchar数据类型的隐式转换,就像许多(大多数?)其他数据库一样。 对the documentation的快速审核没有提供有关隐式转化的任何信息
CAST函数CAST ( [ expression | NULL | ? ] AS dataType ),但是从文档中的表中可以看出,不支持从所有数值数据类型(SMALLINT,INTEGER,BIGINT,DECIMAL等)进行转换。
/> 幸运的是,thete是另一个[CHAR(https://db.apache.org/derby/docs/10.14/ref/rrefbuiltchar.html)函数,似乎这个函数可用于将数值转换为varchar datatye:

  

整数字符语法

     

CHAR(integerExpression)

     

integerExpression

     

返回值为的表达式   整数数据类型(SMALLINT,INTEGER或BIGINT)。结果是   一个形式的参数的字符串表示形式   SQL整数常量。结果由n个字符组成   有效数字,用a表示参数的值   如果参数为负,则在减号之前。结果留下了   合理的。

     
      
  • 如果第一个参数是SMALLINT:结果的长度是6. If   结果中的字符数小于6,然后是结果   在右边填充空白,长度为6。
  •   
  • 如果是第一个参数   是一个INTEGER:结果的长度是11.如果是   结果中的字符小于11,然后填充结果   与长度为11的空白的权利。
  •   
  • 如果第一个参数是BIGINT:   结果的长度是20.如果是字符数   结果小于20,然后在右边填充结果   空白到20号。
  •   

所以你必须使用CHAR功能将数字转换为VARCHAR数据类型

使用ij德比客户端进行的快速测试表明以上情况属实:

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>