Postgres jdbc PreparedStatement setObject没有强制转换值?

时间:2016-03-03 19:01:37

标签: postgresql jdbc prepared-statement

我正在尝试将数据插入到不同的数据库中。使用dbutilsQueryRunner.batch()合并到批量插入中。这适用于SQL Server,它将数据转换为相应的类型。我尝试使用PostgreSQL,但无济于事。我尝试了一个示例插入但在PostGres中失败了,它验证了我的声明,而SQL Server的插入成功了:

private void postGrestest() throws ClassNotFoundException, SQLException
{
    Class.forName("org.postgresql.Driver");

    String dropStmt = "DROP TABLE PUBLIC.TEST";
    String createStmt = "CREATE TABLE PUBLIC.TEST(COL1 VARCHAR(10), COL2 BOOLEAN)";
    String insertStmt = "INSERT INTO PUBLIC.TEST(COL1, COL2) VALUES (?, ?)";
    try (Connection connection = DriverManager.getConnection(
            "jdbc:postgresql://<host>:5432/<dbname>", "<username>", "<password>");
            Statement stmt = connection.createStatement();
            PreparedStatement ps = connection.prepareStatement(insertStmt);)
    {
        //stmt.execute(dropStmt);
        stmt.execute(createStmt);
        Random r = new Random();
        for (int i = 0; i < 100; i++)
        {
            Object str = "Test" + i;
            ps.setObject(1, str);
            Object obj = String.valueOf(r.nextBoolean());
            ps.setObject(2, obj);
            ps.executeUpdate();
        }
    }
}
  

线程“main”中的异常org.postgresql.util.PSQLException:错误:   列“col2”的类型为boolean,但expression的类型为character   变化提示:您需要重写或转换表达式   位置:49

private void sqlserverTest() throws SQLException, ClassNotFoundException
{
    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

    String dropStmt = "DROP TABLE DBO.TEST";
    String createStmt = "CREATE TABLE DBO.TEST(COL1 VARCHAR(10), COL2 BIT)";
    String insertStmt = "INSERT INTO DBO.TEST(COL1, COL2) VALUES (?, ?)";
    try (Connection connection = DriverManager.getConnection(
            "jdbc:sqlserver://<host>:<port>", "<username>", "<password>");
            Statement stmt = connection.createStatement();
            PreparedStatement ps = connection.prepareStatement(insertStmt);)
    {
        //stmt.execute(dropStmt);
        stmt.execute(createStmt);
        Random r = new Random();
        for (int i = 0; i < 100; i++)
        {
            Object str = "Test" + i;
            ps.setObject(1, str);
            Object obj = String.valueOf(r.nextBoolean());
            ps.setObject(2, obj);
            ps.executeUpdate();
        }
    }
}

我必须施放的原因是因为,我从文件中读取数据并作为对象数组获取。我事先并不知道该类型,并且想使用setObject而不是特定类型setBoolean,setInteger等。

在没有在我的应用程序级别进行强制转换并让驱动程序处理强制转换的情况下,我可以使用哪些其他方法?

0 个答案:

没有答案