将Java String[]设置为Postgres准备好的语句时出错

3

我试图将一个字符串数组插入到Postgres中,但是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;

}

但是你只有一个问号和一组值。你可以尝试使用逗号分隔的字符串代替。 - Dave Newton
1
JDBC API不是这样工作的。请描述您想要实现什么。另外:据我所知,PostgreSQL不支持NVARCHAR类型。 - Mark Rotteveel
ps.setObject(1, skus, java.sql.Types.VARCHAR, skus.length); //修复错误,请将其作为答案发布。 - Voltron
几乎相同的帖子在http://stackoverflow.com/q/26005620/398670上发布。 (+1,感谢您包含代码和错误消息。将来,在所有问题中也应包括您的PostgreSQL和PgJDBC版本)。 - Craig Ringer
1个回答

6

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

在JDBC中,您不能仅仅使用setObject来设置一个数组。如果可以这样工作就太好了,但事实并非如此。您需要特殊处理数组。

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

1
@NathanHughes 关于你删除的回答 - 大多数DBMS支持本地数组,并且如果可以避免,几乎从不存储逗号分隔的数据。 (http://dba.stackexchange.com/q/55871/7788) - Craig Ringer
同意,只是不清楚 OP 想要什么。我假设 nvarchar 是正确的并选择了它,当我看到 Mark 的评论后删除了它。非常赞同避免逗号分隔的数据(几乎从来没有可能不够强烈)。不确定数组是否更好。 - Nathan Hughes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接