2014-09-23 42 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