在sql中搜索,事务和数据库文件已锁定

时间:2019-01-15 05:07:13

标签: java sqlite javafx

我正在将JavaFX与SQLite DB结合使用以进行一般的商店管理。以前,我使用SQL Server作为分配,但是要实现它,我需要一个嵌入式数据库。为此,我选择了SQLite。在这里,由于没有存储过程,我遇到了许多问题,现在我在整个管理系统中遇到了以下三个问题:

  1. 搜索查询时出错
  2. 执行交易时出错
  3. 正在获取错误消息,指出数据库文件已锁定。
    现在,我将分别定义每个部分。
    1。搜索查询时出错
    我在SQL Server中使用存储过程通过内部查询在某些文本中搜索表:

    创建PROC [dbo]。[spGetProductListByQuery]
    @query varchar(MAX)
    AS
    开始
    选择p.Product_id,p。名称,pt.Type,p.Pur_Price,p.Sale_Price,p.Stock,s.Name,s.Contact_No,s.Email
    FROM(((产品AS p
    INNER JOIN ProductType AS pt ON p.Type_Id = pt.Type_Id)
    供应商AS的内部加入p.Supplier_Id = s.Supplier_Id)
    其中的名称类似@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 Studio上工作,但是它不返回任何Java,我不明白问题出在哪里。
2。执行交易时出错
我已经尝试了很多次了,甚至在事务中只执行一条语句,但是它仍然返回错误消息,如下所示:

BEGIN TRANSACTION;
INSERT INTO Staff (Name, Address, Contact_No,Salary,Accountant)
VALUES ('Danish', 'Gujrat','034803','22000,0)
END TRANSACTION

,我收到以下错误消息:

  

无法在事务内启动事务。无法获取行。

3。收到错误消息,指出数据库文件已锁定
由于第三个问题解决了第二个问题,因此我可以在一个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();
            }
        }
    }

它仍然显示上面显示的错误。 我的问题有点长,但希望能对您有所帮助。 谢谢

0 个答案:

没有答案