Я использую JavaFX с базой данных SQLite для общего управления магазином. Ранее я использовал SQL-сервер как назначение, но для его реализации мне требовалась встроенная база данных. Для этого я выбрал SQLite. Здесь я столкнулся со многими проблемами, поскольку в нем не было хранимых процедур, и теперь у меня возникли следующие 3 проблемы во всей моей Системе управления:
- Ошибка при поиске по запросу
- Ошибка при выполнении транзакции
Получение сообщения об ошибке, что файл базы данных заблокирован.
Теперь я собираюсь определить каждую часть отдельно.
1. Ошибка при поиске по запросу
Я использовал хранимую процедуру на сервере SQL для поиска в таблице с использованием некоторого текста, внутренний запрос которого был:
Создать PROC [dbo]. [SpGetProductListByQuery]
@query varchar (MAX)
AS
НАЧАТЬ
ВЫБЕРИТЕ p.Product_id, p.Name, pt.Type, p.Pur_Price, p.Sale_Price, p.Stock, s.Name, s.Contact_No, s.Email
ИЗ ((Продукт AS p
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ProductType AS pt ON p.Type_Id = pt.Type_Id)
ВНУТРЕННЕЕ ПРИСОЕДИНЕНИЕ Поставщик включен. P.Supplier_Id = s.Supplier_Id)
ГДЕ p.Name LIKE @query + '%'
И в Java я выполнил эту хранимую процедуру, используя следующий код:
pst=con.prepareStatement("EXEC spGetProductListByQuery @query=?");
pst.setString(1,query)
и в то время это работало, но сейчас, когда я использую SQLite studio, я использую следующий код:
sql="SELECT p.Product_id, p.Name, pt.Type, p.Pur_Price, p.Sale_Price, p.Stock,s.Name, s.PhoneNumber, s.Email\r\n" +
"FROM ((Product AS p\r\n" +
"INNER JOIN ProductType AS pt ON p.Type_Id=pt.Type_Id)\r\n" +
"INNER JOIN Supplier AS s ON p.Supplier_Id=s.Supplier_Id)\r\n" +
"WHERE p.Name LIKE ?+'%'";
System.out.println(searchText);
pst=con.prepareStatement(sql);
pst.setString(1, searchText);
rs=pst.executeQuery();
он работает на студии SQLite, но ничего не возвращает Java, я не могу понять, в чем проблема.
2. Ошибка при выполнении транзакции
Я столько времени пытался выполнить хотя бы один оператор в транзакции, но он по-прежнему возвращает сообщение об ошибке, как показано ниже:
BEGIN TRANSACTION;
INSERT INTO Staff (Name, Address, Contact_No,Salary,Accountant)
VALUES ('Danish', 'Gujrat','034803','22000,0)
END TRANSACTION
и я получил следующее сообщение об ошибке:
невозможно запустить транзакцию внутри транзакции. Невозможно получить строку.
3. Получение сообщения об ошибке, что файл базы данных заблокирован
Поскольку 3-я проблема связана с 2-й проблемой, если она решается, я могу использовать несколько операторов в одной транзакции SQL и сделать возможным работу. Но странно то, что когда я пытался выполнить эту функцию:
public static Boolean saleItem(int productId, double quantity) {
con=Connectivity.getConnectivity();
Connection con2 = null;
try {
if(productId!=0&&quantity!=0)
pst=con.prepareStatement("INSERT INTO SALE (Product_Id, Date, Quantity)\r\n" +
"VALUES (?, CURRENT_TIMESTAMP, ?)");
pst.setInt(1, productId);
pst.setDouble(2, quantity);
pst.executeUpdate();
if(!con.isClosed()) {
con.close();
}
pst=con.prepareStatement("UPDATE Product\r\n" +
"SET Stock=Stock-? WHERE Product_id=?");
pst.setInt(2, productId);
pst.setDouble(1, quantity);
pst.executeUpdate();
con.close();
} catch (SQLException e) {
//showErrorAlert(e.getMessage());
e.printStackTrace();
return false;
}catch(NullPointerException e) {
showErrorAlert(e.getMessage());
}
return true;
}
здесь мы видим, что два соединения устанавливаются одновременно, и это показывает сообщение об ошибке
org.sqlite.SQLiteException: [SQLITE_BUSY] Файл базы данных заблокирован (база данных заблокирована)
Но когда я попытался выполнить функцию, имеющую только один экземпляр соединения, в котором был выполнен запрос на обновление:
public static void changeStock(double quantity, int id) {
con=Connectivity.getConnectivity();
if(quantity!=0) {
try {
pst=con.prepareStatement("UPDATE Product \r\n" +
"SET Stock=Stock+(?) \r\n" +
"WHERE Product_id=?");
pst.setDouble(1, quantity);
pst.setInt(2, id);
} catch (SQLException e) {
showErrorAlert(e.getMessage());
e.printStackTrace();
}
}
}
это все еще показало ошибку, которая показана выше.
Мои проблемы немного длинные, но надеюсь, что вы сможете мне помочь.
Спасибо