1

我编写了一个 java 代码,用于从 Sqlite 数据库中名为边的一个表中获取值,并将其写入另一个名为距离的表中。但是在将值写入表距离时,我每次都必须重新定义语句。如果我不重新定义 Statement 的值,则循环在执行下面给出的代码的一次迭代后退出:

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

2 回答 2

2

最好使用单个 SQL 操作进行此类操作:

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

或者使用两个语句,一个 for Select,第二个 for Insert

于 2013-11-04T14:30:26.177 回答
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);
    }
}
于 2013-11-04T14:34:00.047 回答