2013-10-22 8 views
-1

我想從一臺服務器插入值到另一臺使用java程序。這裏是我的代碼: -在使用java程序在數據庫中插入幾行後出錯

public static void main(String[] args) throws FileNotFoundException { 
    // TODO code application logic here 

    try { 
     Class.forName("oracle.jdbc.OracleDriver"); 
    } catch (Exception exception) { 
    } 

    Connection conn = null; 
    Connection conn1 = null; 

    ResultSet rs, rs1 = null; 

    Statement pst = null; 


    try { 
     //  dbConnect.executequery(sdate, edate); 
     conn = DriverManager.getConnection("jdbc:oracle:thin:@31.4.224.76:1521:RPTPSG", "pihist", "pihist"); 
     String query = "select * from messagemasterhistory where ROWNUM<=1572660"; 
     // String query="select * from messagemasterhistory where createdate>='28-JAN-11' and createdate<='18-FEB-2011'"; 
     pst = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY); 

     // String sql="insert into test(SRN ,UTR) values ("; 
     // pst=conn.prepareStatement(sql); 

     // rs.absolute(2000); 
     // pst.setFetchSize(2000); 
     // pst.setMaxRows(1500000); 
     pst.setFetchDirection(ResultSet.FETCH_FORWARD); 

     rs = pst.executeQuery(query); 

     // String statment="insert into test(UTR,SRN) values('abc','1')"; 

     // PrintWriter wt=new PrintWriter("ritima2.txt"); 
     conn1 = DriverManager.getConnection("jdbc:oracle:thin:@31.4.224.81:1521:RPTPSG", "rptr", "rptr"); 
     Statement stat1 = conn1.createStatement(); 
     while (rs.next()) { 
      String str = rs.getString("FIELDDATA"); 
      String str1 = rs.getString("FIELDINFO"); 
      String statment = "insert into MESSAGEMASTERHISTORY2(UTR,CREATEDATE,SENDER,RECEIVER,SUBMESSAGETYPE,FIELDINFO,FIELDDATA,DUPLICATE) values(" + "'" + rs.getString("UTR") + "'" + "," + "TO_DATE('" + rs.getDate("CREATEDATE") + "'" + ",'YYYY-MM-DD\" \"HH24:MI:SS')" + "," + "'" + rs.getString("SENDER") + "'" + "," + "'" + rs.getString("RECEIVER") + "'" + "," + "'" + rs.getString("SUBMESSAGETYPE") + "'" + "," + "'" + str1 + "'" + "," + "'" + str + "'" + "," + rs.getInt("DUPLICATE") + ")"; 
      // String statment="insert into test1 (fielddata,utr) values("+"'"+(rs.getString("fielddata"))+"'"+","+"'"+rs.getString("UTR")+"')"; 
      System.out.println(count); 
      stat1.executeQuery(statment); 

      System.out.println(str); 
      System.out.println(str1); 
      // System.out.println(rs.getClob("FIELDDATA")); 
      System.gc(); 
      count++; 
     } 
     conn1.commit(); 
     conn1.close(); 
     // wt.close(); 
     System.out.println("Completed"); 
     conn.close(); 

    } catch (Exception e) { 
     e.printStackTrace(); 

    } 

} 
}    

插入幾行(6274),它提供了錯誤「java.sql.SQLException中後:ORA-00917:缺少逗號

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:113) 
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331) 
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288) 
    at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:754) 
    at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:210) 
    at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:963) 
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1192) 
    at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1315) 
    at javaapplication2.Main.main(Main.java:73) 
+0

這行代碼是'Main.java:73'? –

+2

該程序看起來不太好。它忽視了世界上所有的最佳實踐。使用佔位符(綁定變量)創建準備好的語句,設置值並通過調用pstmt.addBatch將其添加到批處理中,最後再說pstmt.execute()。 –

回答

3

這不是一個很安全的方法在數據庫中插入數據。 這是容易受到SQL注入。這很有可能發生的事情。

你可能在你插入某個數據',它太快結束查詢。

你應該檢查這篇文章,它會告訴你如何使用準備好的語句,或其他方式來保護你的查詢。

https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

如果你好奇,你也可以考慮休眠。隨着位配置的,它可以安全地堅持你的實體,而無需編寫冗長查詢自己

http://docs.jboss.org/hibernate/orm/4.2/quickstart/en-US/html/

3

一個你是從源數據庫複製字符串的大概是它的非法SQL代碼序列。

您應該考慮使用具有參數的PreparedStatement,而不是使用String連接構造SQL。 PreparedStatement應該被預編譯,並且你不需要擔心轉義你的字符串。

喜歡的東西:

 String statment = "insert into MESSAGEMASTERHISTORY2(UTR,CREATEDATE,SENDER,RECEIVER,SUBMESSAGETYPE,FIELDINFO,FIELDDATA,DUPLICATE) values(?,?,?,?,?,?,?,?)"; 
     PreparedStatement ps = conn1.prepareStstement(statement) 
     while (rs.next()) { 
        ps.setString(1, rs.getString("UTR")); 
        ps.setDate(2, rs.getDate("CREATEDATE")); 
        // etc etc 

        ps.executeUpdate(); 
        conn1.commit(); //maybe you want this outside the loop 
     } 

http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

相關問題