2017-10-28 46 views
0

无法将复制命令与jdbc Postgres一起使用。下面的代码片段示例有什么问题。使用副本Postgres jdbc的正确方法

public boolean loadReportToDB(String date) { 
     // TODO Auto-generated method stub 
     Connection connection = DBUtil.getConnection("POSTGRESS"); 
     String fileName = "C:/_0STUFF/NSE_DATA/nseoi_" + date + ".csv"; 
     String sql = "\\copy fno_oi FROM 'C:\\_0STUFF\\NSE_DATA\\nseoi_27102017.csv' DELIMITER ',' CSV header"; 
     try { 
      PreparedStatement ps = connection.prepareStatement(sql); 
      System.out.println("query"+ps.toString()); 
      int rowsaffected = ps.executeUpdate(); 
      System.out.println("INT+" + rowsaffected); 
      return true; 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return false; 
    } 
org.postgresql.util.PSQLException: ERROR: syntax error at or near "\" 
    Position: 1 
    at org. 

如果我们使用

String sql = "copy fno_oi FROM 'C:\\_0STUFF\\NSE_DATA\\nseoi_27102017.csv' DELIMITER ',' CSV header"; 

则没有行被更新

的Postgres版本的PostgreSQL-10.0-1-Windows的64位

+0

你不需要复制语句中的\\ from。你得到的错误是什么? – fvu

+0

服务器上是否存在'C:\\ _ 0STUFF \\ NSE_DATA \\ nseoi_27102017.csv'文件?如果您手动测试语句,它会被加载吗? – fvu

+0

postgres-#\ copy fno_oi FROM'C:\ _ 0STUFF \ NSE_DATA \ nseoi_27102017.csv'DELIMITER','CSV标头 COPY 212 –

回答

0

当你的输入文件存储本地在运行您的Java程序的计算机上您需要我们e相当于JDBC中的copy ... from stdin,因为copy只能访问服务器(其中Postgres正在运行)上的文件。

为此,请使用JDBC驱动程序提供的CopyManager API。

东西沿着线:

Connection connection = DBUtil.getConnection("POSTGRES"); 

String fileName = "C:/_0STUFF/NSE_DATA/nseoi_" + date + ".csv"; 
String sql = "copy fno_oi FROM stdin DELIMITER ',' CSV header"; 

BaseConnection pgcon = (BaseConnection)conection; 
CopyManager mgr = new CopyManager(pgcon); 

try { 

    Reader in = new BufferedReader(new FileReader(new File(fileName))); 
    long rowsaffected = mgr.copyIn(sql, in); 

    System.out.println("Rows copied: " + rowsaffected); 

} catch (SQLException e) { 
    e.printStackTrace(); 
} 
+0

如果postgress服务器和应用程序服务器不同,推荐的方式是什么 –

0

这个工作对我来说:

try (Connection conn = DriverManager.getConnection(connUrl, myUid, myPwd)) { 
    long rowsInserted = new CopyManager((BaseConnection) conn) 
      .copyIn(
       "COPY table1 FROM STDIN (FORMAT csv, HEADER)", 
       new BufferedReader(new FileReader("C:/Users/gord/Desktop/testdata.csv")) 
       ); 
    System.out.printf("%d row(s) inserted%n", rowsInserted); 
} 

使用copyIn(String sql, Reader from)有回避问题的优势PostgreSQL服务器的过程是无法直接读取文件,无论是因为它缺少权限(比如读取桌面上的文件),或者因为该文件不在PostgreSQL服务器运行的机器本地。