2017-10-28 52 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服務器運行的機器本地。