2017-10-28 18 views
0

jdbc Postgresでcopyコマンドを使用することができません。以下のコードスニペットサンプルで何が間違っていますか。copyを使用する正しい方法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のx64の

+0

コピーステートメントの\\ inは必要ありません。そしてあなたが得ているエラーは何ですか? – 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 header COPY 212 –

答えて

0

更新されませんあなたのJavaプログラムを実行しているコンピュータで私たちに必要なものcopyサーバ(Postgresが実行されている場所)のファイルにしかアクセスできないため、JDBCのcopy ... from stdinに相当します。

これを行うには、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

ポストログサーバーとアプリケーションサーバーが異なる場合の推奨方法 –

0

これは私の作品:copyIn(String sql, Reader from)を使用して

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); 
} 

はどちらか、PostgreSQLサーバプロセスがファイルを直接読み取ることができません問題を回避するという利点を持っています(デスクトップ上のファイルの読み込みのような)権限がないか、PostgreSQLサーバが動作しているマシンのローカルファイルではないためです。

関連する問題