我正在将JavaFX与SQLite DB结合使用以进行一般的商店管理。以前,我使用SQL Server作为分配,但是要实现它,我需要一个嵌入式数据库。为此,我选择了SQLite。在这里,由于没有存储过程,我遇到了许多问题,现在我在整个管理系统中遇到了以下三个问题:
正在获取错误消息,指出数据库文件已锁定。
现在,我将分别定义每个部分。
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();
}
}
}
它仍然显示上面显示的错误。 我的问题有点长,但希望能对您有所帮助。 谢谢