Поиск в sql, транзакции и файл БД заблокированы - PullRequest
0 голосов
/ 15 января 2019

Я использую JavaFX с базой данных SQLite для общего управления магазином. Ранее я использовал SQL-сервер как назначение, но для его реализации мне требовалась встроенная база данных. Для этого я выбрал SQLite. Здесь я столкнулся со многими проблемами, поскольку в нем не было хранимых процедур, и теперь у меня возникли следующие 3 проблемы во всей моей Системе управления:

  1. Ошибка при поиске по запросу
  2. Ошибка при выполнении транзакции
  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();
            }
        }
    }

это все еще показало ошибку, которая показана выше. Мои проблемы немного длинные, но надеюсь, что вы сможете мне помочь. Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...