在Java中读取sql文件和插入数据库时发生异常
从sql文件中,我尝试读取sql查询并使用以下java代码创建mysqlite db:在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
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;
}