Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每次写入Sqlite数据库时重新定义语句_Java_Sqlite - Fatal编程技术网

Java 每次写入Sqlite数据库时重新定义语句

Java 每次写入Sqlite数据库时重新定义语句,java,sqlite,Java,Sqlite,我编写了一个java代码,从Sqlite数据库中名为edges的一个表中获取值,然后将其写入另一个名为distance的表中。但是,在将值写入表距离时,每次都必须重新定义语句。如果我不重新定义语句的值,循环将在执行以下给定代码的一次迭代后退出: statement.executeUpdate(sql); 但是,如果我重新定义语句,循环将按预期继续,即我已注释掉的代码行。谢谢 public static Connection dbconn; public static Statement sta

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

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

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

INSERT INTO distances (Road_Name, Start_Latitude, Start_Longitude)
SELECT Road_Name, Start_Latitude, Start_Longitude
FROM edges
或者使用两条语句,一条用于
Select
,另一条用于
Insert

  • 不能重用
    语句,因为它将关闭
    结果集rs
  • 您不应该在SQL语句中连接数据。在准备好的语句中使用参数
  • 为了获得更好的性能,应该禁用自动提交,并在所有更新调用之后显式调用
  • 我的建议是:

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

    考虑使用一个如@ PASH701所建议的操作!!!这是我的选择。