我希望用csv文件中的值填充我的数据库。但它返回SQLITE_BUSY:数据库文件被锁定。
这是我的代码
try {
BufferedReader br=new BufferedReader(new FileReader("v.csv"));
String line;
while((line=br.readLine())!=null) {
System.out.println(line);
String[]value = line.split(",");
System.out.println(value.length);
String sql = "INSERT into main ([Ticket #], Status, Priority, Department, [Account Name]) "
+ "values ('"+value[0]+"','"+value[1]+"','"+value[2]+"','"+value[3]+"','"+value[4]+"')";
System.out.println("test");
PreparedStatement pst = null;
try {
pst = DatabaseConnection.ConnectDB().prepareStatement(sql);
pst.executeUpdate();
} finally {
if(pst != null) {
pst.close();
}
}
}
br.close();
} catch(Exception e) {
JOptionPane.showMessageDialog(null, e);
}
我使用不同的打印语句来检查错误的位置,似乎它不能执行更新();当循环执行第二次时。这是我在控制台中获得的内容
Ticket,Status,Priority,Department,Account Name
5
test
这是我的DatabaseConnection仅供参考
public class DatabaseConnection {
Connection conn = null;
Statement stmt = null;
public static Connection ConnectDB() {
try {
Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager.getConnection("jdbc:sqlite:database.db");
conn.setAutoCommit(true);
return conn;
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
return null;
}
}
}
答案 0 :(得分:2)
每次循环都会连接到数据库。
在循环外部创建数据库连接并使用in,因此在每次迭代时都不会getConnection
。
try
{
BufferedReader br=new BufferedReader(new FileReader("v.csv"));
String line;
db = DatabaseConnection.ConnectDB();
while((line=br.readLine())!=null){
System.out.println(line);
String[]value = line.split(",");
System.out.println(value.length);
String sql = "INSERT into main ([Ticket #], Status, Priority, Department, [Account Name]) "
+ "values ('"+value[0]+"','"+value[1]+"','"+value[2]+"','"+value[3]+"','"+value[4]+"')";
System.out.println("test");
PreparedStatement pst = null;
try{
pst = db.prepareStatement(sql);
pst.executeUpdate();
}finally{
if(pst != null) {
pst.close();
}
}
}
br.close();
}
catch(Exception e)
{
JOptionPane.showMessageDialog(null, e);
}
答案 1 :(得分:1)
检查以确保您的数据库不是只读的或类似的东西。如果将db项目移动到linux,请不要忘记文件权限。