我正在制作一些程序,用于检查不同用户名的方法比例。当我调用函数DodajObrisiPristupe(table,comboBox)时,它说数据库已锁定。我搜索了解决方案,所有人都说我可能没有在某处关闭连接,但我无法找到它。有人可以帮帮我吗?
public void DodajObrisiPristupe(JTable tabela, JComboBox<String> korisnickoime)
{
DefaultTableModel model = (DefaultTableModel)tabela.getModel();
for (int i = 0; i < model.getRowCount(); i++)
{
String serijskibroj = model.getValueAt(i, 2).toString();
boolean pristup = (Boolean)model.getValueAt(i, 4);
if(ProveriDaLiPostojiPristup(serijskibroj, korisnickoime.getSelectedItem().toString()) == true)
{
if(pristup == false)
ObrisiPristup(serijskibroj, korisnickoime.getSelectedItem().toString());
}
else
{
if(pristup == true)
DodajPristup(serijskibroj, korisnickoime.getSelectedItem().toString());
}
}
}
public boolean ProveriDaLiPostojiPristup(String serijskibroj, String korisnickoime)
{
Connection c = null;
Statement stmt = null;
try {
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:" + naziv + ".db");
stmt = c.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM PRISTUPI;");
while(rs.next())
{
if(Decrypt(rs.getString("korisnickoime")).equals(korisnickoime) && Decrypt(rs.getString("vage")).equals(serijskibroj))
return true;
}
rs.close();
stmt.close();
c.close();
}
catch ( Exception e ) {
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
System.exit(0);
}
return false;
}
public void DodajPristup(String serijskibroj, String korisnickoime)
{
Connection c = null;
Statement stmt = null;
try {
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:" + naziv + ".db");
stmt = c.createStatement();
String sql = "INSERT INTO PRISTUPI (KORISNICKOIME,VAGE) " +
"VALUES ('" + Encrypt(korisnickoime) + "', '" + Encrypt(serijskibroj) + "');";
stmt.executeUpdate(sql);
stmt.close();
c.close();
}
catch ( Exception e ) {
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
System.exit(0);
}
}
public void ObrisiPristup(String serijskibroj, String korisnickoime)
{
Connection c = null;
Statement stmt = null;
try {
Class.forName("org.sqlite.JDBC");
c = DriverManager.getConnection("jdbc:sqlite:" + naziv + ".db");
stmt = c.createStatement();
String sql = "DELETE from PRISTUPI where KORISNICKOIME = '" + Encrypt(korisnickoime) + "' AND VAGE = '" + Encrypt(serijskibroj) + "';";
stmt.executeUpdate(sql);
stmt.close();
c.close();
}
catch ( Exception e ) {
System.err.println( e.getClass().getName() + ": " + e.getMessage() );
System.exit(0);
}
}
答案 0 :(得分:0)
您未在ProveriDaLiPostojiPristup(String, String)
中关闭连接。
你应该总是将你的连接包装在try-with-resources中,或者尝试最终,所以它们总是关闭的。
c = DriverManager.getConnection("jdbc:sqlite:" + naziv + ".db"); stmt = c.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM PRISTUPI;"); while(rs.next()) { if(Decrypt(rs.getString("korisnickoime")).equals(korisnickoime) && Decrypt(rs.getString("vage")).equals(serijskibroj)) return true; } rs.close(); stmt.close(); c.close();
会发生什么,是你的方法返回true,但由于执行在那里停止,它不会执行它下面的行。如果将语句包装在try with resources块中,则可以解决此问题:
try(c = DriverManager.getConnection("jdbc:sqlite:" + naziv + ".db")){
try(stmt = c.createStatement()){
try(ResultSet rs = stmt.executeQuery("SELECT * FROM PRISTUPI;")){
while(rs.next())
{
if(Decrypt(rs.getString("korisnickoime")).equals(korisnickoime) && Decrypt(rs.getString("vage")).equals(serijskibroj))
return true;
}
}
}
}