在Java中读取sql文件和插入数据库时发生异常

在Java中读取sql文件和插入数据库时发生异常,java,mysql,sqlite,Java,Mysql,Sqlite,从sql文件中,我尝试读取sql查询并使用以下java代码创建mysqlite db: import java.io.BufferedReader; import java.io.FileReader; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; import java.util.ArrayList; public class ReadMySqlDump { sta

从sql文件中,我尝试读取sql查询并使用以下java代码创建mysqlite db:

import java.io.BufferedReader;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.util.ArrayList;

public class ReadMySqlDump {

static String sep = System.getProperty("line.separator");

public  ReadMySqlDump(){
    try{
        String s = "";
        String buff="";
        ArrayList<String> creates = new ArrayList<String> ();
           ArrayList<String> inserts = new ArrayList<String> ();

        boolean createStart = false;
        String currentCreate = "";

        BufferedReader br = new BufferedReader(new FileReader("mydb.sql.sql"));
        while((buff=br.readLine()) != null){
            buff = buff.trim();
             if(buff.length() == 0)continue;
            if(buff.startsWith("/*"))continue;
             if(buff.startsWith("--"))continue;
            if(createStart && buff.startsWith(");")){
             //   System.out.println("before: " + currentCreate);
                currentCreate = currentCreate.trim();
                if(currentCreate.endsWith(","))currentCreate = currentCreate.substring(0, currentCreate.length()-1);

             //currentCreate = currentCreate.substring(0, currentCreate.length()-2);
               //  System.out.println("after: " + currentCreate);
                    currentCreate += " " + buff + sep;
                createStart = false;
                creates.add(currentCreate);
                currentCreate = "";
                continue;
            }
            if(createStart){
                currentCreate += " " + buff +sep;
                continue;
            }
            if(!createStart && buff.startsWith("CREATE")){
                createStart = true;
                currentCreate += buff + sep;
                continue;
            }


            if(buff.startsWith("INSERT")) {
                inserts.add(buff);
                continue;

            }



        }
        br.close();

        for(String ss: creates){
            System.out.println(ss);
        }

        System.out.println("");
          System.out.println("");

                for(String ss: inserts){
            System.out.println(ss);
        }


         Class.forName("org.sqlite.JDBC");
    Connection conn = DriverManager.getConnection("jdbc:sqlite:testNew5.db");
    Statement stat = conn.createStatement();
          for(String ss: creates){

              System.out.println("SQL command: " + ss);

            stat.executeUpdate(ss);
        }

      //  ResultSet rs = stat.executeQuery("select * from tbl_passion_attributes");
        //  while(rs.next()){

         // }

        for (String ss : inserts){

                      System.out.println("ss: " + ss);
            int n =  stat.executeUpdate(ss);

                      System.out.println("n: " + n);
        }
             conn.close();



    } catch(Exception ex){

        ex.printStackTrace();

    }


}

public static void main(String[] args) {

    new   ReadMySqlDump();
}


}
我使用来自的JDBCJAR


如果有人能帮助解决此问题,将不胜感激。

发送到服务器的INSERT语句似乎不完整,在值之后被截断,但它应该包含文件中以下两行提供的数据

您没有从文件中正确获取INSERT语句。对于CREATE,它是正确的:您正在管理一个
currentCreate
标志并连接语句行。对于插入,您没有这样做:

if(buff.startsWith("INSERT")) {
    inserts.add(buff);
    continue;
}
在这里,您只需使用第一行(
buff
br.readLine()
的结果),其余的被忽略


解决方案是对INSERT执行与CREATE相同的操作:当您看到INSERT时,连接后续行,直到您看到语句完成为止,即该行以
结尾)

好的,通过在代码中包含以下内容,我自己解决了这个问题:

if(!insertStart && (buff.startsWith("INSERT") && buff.endsWith("VALUES"))) {
                insertStart = true;
                insertMain = buff;
                continue;

            }
            if(insertStart && (buff.endsWith("),"))){
                buff = buff.substring(0, buff.length()-1);
                insertQuery = insertMain+" " + buff+";";
                inserts.add(insertQuery);
                continue;
            }
            if(insertStart && (buff.endsWith(");"))){
                insertQuery = insertMain+" " + buff+";";
                inserts.add(insertQuery);
                insertStart = false;
                insertMain = "";
                continue;
            }

PS:SQLite不接受问题中所示形式的INSERT语句。对于每个INSERT语句,它只接受一组值。因此,我必须将多行INSERT转换为单INSERT语句

在数据库上运行时,该INSERT语句是否运行良好
if(buff.startsWith("INSERT")) {
    inserts.add(buff);
    continue;
}
if(!insertStart && (buff.startsWith("INSERT") && buff.endsWith("VALUES"))) {
                insertStart = true;
                insertMain = buff;
                continue;

            }
            if(insertStart && (buff.endsWith("),"))){
                buff = buff.substring(0, buff.length()-1);
                insertQuery = insertMain+" " + buff+";";
                inserts.add(insertQuery);
                continue;
            }
            if(insertStart && (buff.endsWith(");"))){
                insertQuery = insertMain+" " + buff+";";
                inserts.add(insertQuery);
                insertStart = false;
                insertMain = "";
                continue;
            }