2013-11-04 60 views
1

我已經編寫了一個java代碼,用於從Sqlite數據庫命名的邊緣中的一個表中獲取值,並將其寫入名爲距離的另一個表。但是,在將值寫入表格距離時,我必須每次重新定義語句。如果我沒有一個迭代執行如下的代碼之後退出循環重新定義語句的值:每次寫入Sqlite數據庫時重新定義語句

statement.executeUpdate(sql); 

但是,如果我重新定義聲明循環繼續按預期即我註釋掉的代碼行。謝謝。

public static Connection dbconn; 
public static Statement statement; 
public void solve(InputReader in,OutputWriter out) throws ClassNotFoundException 
{ 
    try 
    { 
     Class.forName("org.sqlite.JDBC"); 
     dbconn =DriverManager.getConnection("jdbc:sqlite:/home/src/db.db"); 
     System.out.println("Connected"); 
     statement = dbconn.createStatement(); 
     statement.setQueryTimeout(30); 
     ResultSet rs = statement.executeQuery("select * from edges;"); 
     while(rs.next()) 
     { 
      String sql = "INSERT INTO distances (Road_Name,Start_Latitude,Start_Longitude)" + 
         "VALUES ('"+rs.getString("Road_Name")+"',"+rs.getString("Start_Latitude")+","+rs.getString("Start_Longitude")"; 

      //Statement statement= dbconn.createStatement(); 
      statement.executeUpdate(sql); 
     } 
    } 
    catch(Exception e) 
    { 
     System.out.println("Exception : "+e); 
    } 
} 
+1

考慮使用由@ pasha701建議單次操作!這將是我的選擇。 –

回答

1
  1. 您不能重複使用Statement statement,因爲它會關閉ResultSet rs;
  2. 您不應連接SQL語句中的數據。使用準備好的語句中的參數
  3. 爲了獲得更好的性能,應該禁用自動提交,並在所有更新調用後顯式調用。

我的建議:

public static Connection dbconn; 
public static Statement qry; 
public void solve(InputReader in,OutputWriter out) throws ClassNotFoundException 
{ 
    try 
    { 
     Class.forName("org.sqlite.JDBC"); 
     dbconn =DriverManager.getConnection("jdbc:sqlite:/home/src/db.db"); 
     System.out.println("Connected"); 
     PreparedStatement upd = dbconn.prepareStatement("INSERT INTO distances (Road_Name,Start_Latitude,Start_Longitude) VALUES (?, ?, ?)"); 
     dbconn.setAutoCommit(false); 
     qry = dbconn.createStatement(); 
     qry.setQueryTimeout(30); 
     ResultSet rs = qry.executeQuery("select * from edges;"); 
     while(rs.next()) 
     { 
      upd.setString(1, rs.getString("Road_Name")); 
      upd.setString(2, rs.getString("Start_Latitude")); 
      upd.setString(3, rs.getString("Start_Longitude")); 
      upd.executeUpdate(); 
     } 
     dbconn.commit(); 
    } 
    catch(Exception e) 
    { 
     System.out.println("Exception : "+e); 
    } 
} 
2

更好地做出這樣的操作與單個SQL操作:

INSERT INTO distances (Road_Name, Start_Latitude, Start_Longitude) 
SELECT Road_Name, Start_Latitude, Start_Longitude 
FROM edges 

或者使用兩種說法,一爲Select,第二個爲Insert

相關問題