обновлено
try
{
sqlite.setDbPath(dbPath);
con = sqlite.connect();
if (!con.isClosed())
{
String query = "SELECT Username,Password FROM Apps WHERE Username ='"+username+"'"; // and Password='"+password+"'";
ResultSet rs = con.createStatement().executeQuery(query);
while(rs.next())
{
if (rs.getString("Username").equals(username))//confronto se Username è gia esistente
{
trovato = true;
risultato = "gia' presente";
}
}
if (trovato==false) {
createUsers(username,password,name,surname,email,appname,ip,authorized,token);
risultato = "inserito";
}
if (con!=null)
{
con.close();
}
if (sqlite != null)
{
sqlite.close();
}
if (rs != null)
{
rs.close();
}
}
В блоке try catch я открыл соединение со встроенной базой данных, но в первый раз я не закрываю все соединения. С помощью if control программа закрывает все открытые соединения и работает хорошо
Я пытаюсь закрыть sqleditor, но у меня та же проблема
IIRC SQLite позволяет только одно соединение с базой данных, поэтому, если у вас есть несколько соединений, это не удастся. Однако это может быть ограничением более старых версий, поэтому в этом случае вам может потребоваться обновить версию sqlite, которую вы используете. Тем не менее, на мой взгляд, SQLite не совсем подходящая база данных для веб-приложения.
В вашем текущем коде много потенциальных утечек ресурсов. Я бы посоветовал вам переписать свой код, чтобы использовать попробовать с ресурсами, это значительно упростит ситуацию и снизит сложность вашего кода.
Кстати: con.createStatement().close(); не имеет смысла. Вам не нужно создавать выписку, если вы собираетесь ее сразу закрыть.
Я обновляю код, но он не работает
Вы по-прежнему не используете try-with-resources.
@MarkRotteveel, теперь все в порядке?
Прочтите ссылку о пробных ресурсах. Вы все еще не пользуетесь им.
Я обновил свой ответ, добавив в него версию "попробовать с ресурсом"
Я обновляю код, все в порядке?
Снимаем внешний try{} catch{}
@JoakimDanielson хорошо, готово
Не работает
if (trovato==false) { String query1 = "INSERT INTO Apps (Username,Password,Name,Surname,Email,AppName,Ip,Authorized,Token) VALUES ('" + username + "'," + "'" +password +"','" + name + "','" + surname + "','" +email + "','" + appname + "','"+ip+"','"+authorized+"','"+token+"')"; System.out.println(query1); //con.createStatement().execute(query1); con.createStatement().executeUpdate(query1); System.out.println("inserito"); }На мой взгляд, я делаю ошибку в этой части кода ... потому что сначала, если условие, код работает хорошо




Обновление 2
Вот сокращенная версия, в которой вместо этого используется try-with-resource. Код проще и короче
public String RegisterUser(... ) {
boolean trovato = false;
int authorized=0;
SqliteConnection sqlite = new SqliteConnection();
String dbPath = "C:/Users/l.pellegrini/eclipse-workspace/ClayAPI_dbembedded/claydb.db";
String query = "SELECT Username,Password FROM Apps WHERE Username ='"+username+"' and Password='"+password+"'";
try (java.sql.Connection con = sqlite.connect();
Statement statement = con.createStatement();
Statement updStatement = con.createStatement();
) {
ResultSet rsActiveServices = con.createStatement().executeQuery(query);
// handle result set as before
} catch(SQLException e) {
e.printStackTrace();
System.out.println("errore" + e);
}
if (trovato==false) {
createUser(username, password, name, surname, appname, email, ip)
}
return "username: " + username;
}
private createUser(String username, String password, String name, String surname, String appname, String email, String ip {
String query1 = "INSERT INTO Apps (Username,Password,Name,Surname,Email,AppName,Ip,Authorized,Token) VALUES ('" + username + "'," + "'" +password +"','" + name + "','" + surname + "','" +email + "','" + appname + "','"+ip+"','"+authorized+"','"+token+"')";
SqliteConnection sqlite = new SqliteConnection();
String dbPath = "C:/Users/l.pellegrini/eclipse-workspace/ClayAPI_dbembedded/claydb.db";
try (java.sql.Connection con = sqlite.connect();
Statement statement = con.createStatement();) {
updStatement.executeUpdate(query1);
} catch(SQLException e) {
e.printStackTrace();
System.out.println("errore" + e);
}
}
Вполне может быть, что ваш подготовленный оператор не закрыт должным образом. Изменять
ResultSet rsActiveServices = con.createStatement().executeQuery(query);
к
statement = con.createStatement();
ResultSet rsActiveServices = statement.executeQuery(query);
где заявление объявлено перед try
java.sql.Connection con = null;
Statement statement = null;
а затем закройте его в своем предложении finally
finally
{
try
{
statement.close();
con.close();
sqlite.close();
}
Обновление 1
Я только что заметил, что вы дважды пытаетесь закрыть свои объекты, что неправильно, удалите первый набор вызовов close и закройте только в finally {} в конце.
finally { try { statement.close(); con.close(); sqlite.close(); } я не могу поставить statement.close (); наконец
@lucapellegrini, моя простая ошибка. Вам необходимо объявить переменную вне предложения try. Я обновлю ответ
Вероятно, лучше (и короче) использовать try-with-resources.
@MarkRotteveel Я знаю, но это был самый простой способ двигаться вперед.
@MarkRotteveel свяжите мне страницу
@lucapellegrini Я обновил свой ответ, добавив пробную версию с ресурсом
Вы вносите соответствующие изменения: да, вверху и в конце.
@lucapellegrini попробуйте переместить создание второго оператора в то же место, что и другие (я обновлю свой ответ) или, что еще лучше, переместите его в другой метод (вместе со всем остальным кодом try-with-resource.
@JoakimDanielson хорошо, я стараюсь
@JoakimDanielson Я обновляю код, но он не работает ... консоль показывает ту же ошибку
@lucapellegrini переместите обновление в отдельный метод и вызовите его в конце текущего метода, если trovato имеет значение false
@JoakimDanielson, я не понимаю ... приведите пример, пожалуйста
@lucapellegrini Я привел пример. Обратите внимание, что это написано прямо здесь, поэтому не компилируется и не проверяется синтаксис.
Решено
Я делаю ошибки при открытии и закрытии соединения в Main .. С SQLite соединение, которое вы должны открывать и закрывать каждый раз, когда выполняется запрос любого типа (Insert, Delete, Update и т. д.)
У вас открыта база данных в каком-нибудь редакторе sql? Это, вероятно, вызовет такую ошибку.