2014-09-23 61 views
3

我试图插入一个字符串数组到Postgres中。我从Postgres中得到一个无效的类型错误。错误设置java字符串[] postgres准备好的语句

public static void main(String[] args) throws SQLException { 
    String[] skus = { "0514", "0414", "0314", "0214", "0114", "1213", "1113", "1013", "0913", "0813", "0713", "0613" }; 
    String sqlString = "Insert into dbo.Inventory_Metrics skus values(?)"; 
    Connection conn = DriverManager.getConnection(getPostgresConnUrl()); 
    PreparedStatement ps = conn.prepareStatement(sqlString); 

    //THIS NEXT LINE THROWS AN ERROR 

    ps.setObject(1, skus, java.sql.Types.NVARCHAR, skus.length); 
    int status = ps.executeUpdate(); 
    ps.close(); 

    System.out.print(status); 
} 
public static String getPostgresConnUrl() { 
    String database = "mycode"; 
    String userName = "xxxxxxxx"; 
    String password = "xxxxxxxx"; 
    return "jdbc:postgresql://192.168.0.50:5432/" + database + "?user=" + userName + "&password=" + password; 

} 
+0

但是你有一个问号和一个值的数组。您可以尝试一串逗号分隔值。 – 2014-09-23 15:33:59

+1

JDBC API不能以这种方式工作。请描述你想要达到的目标。最重要的是:PostgreSQL不支持'NVARCHAR'类型afaik – 2014-09-23 16:06:50

+0

ps.setObject(1,skus,java.sql.Types.VARCHAR,skus.length); //修复错误,将其作为答案发布。 – Voltron 2014-09-23 19:10:08

回答

6

根据文档,您必须使用JDBC array API

您不能只在setObject JDBC中的数组。如果这是它的工作方式,那会很好,但事实并非如此。你需要专门处理数组。

Array jdbcSkus = con.createArrayOf("VARCHAR", skus); 
pstmt.setArray(2, jdbcSkus); 
+1

@NathanHughes重新删除您的答案 - 大多数DBMS支持原生数组,并且[如果您可以避免这种情况,[存储逗号分隔数据几乎永远不会]](http://dba.stackexchange.com/q/55871/7788)。 – 2014-09-24 07:34:01

+0

表示同意,这只是不清楚OP的想法。我认为nvarchar是正确的,并与之一起,然后当我看到马克的评论时删除。对于避免用逗号分隔的数据(*几乎从不*可能不够强壮的措辞)不能达成一致。不确定数组是否好得多。 – 2014-09-25 18:16:13