所以有点背景: 我正在创建一个管理产品(蜡烛)的程序,我需要在更新数据之前检查蜡烛香水的名称是否存在。 经过一些研究,我写了这个:
try {
stmt = conn.createStatement();
//Get a perfumeCode from a perfumeName
sql = "SELECT Code_Parfum FROM T_Parfum WHERE Nom_Parfum = \"" + tbxPerfumeName.getText() + "\";";
rs = stmt.executeQuery(sql);
System.out.println(!rs.next()); // = true if doesn't exists and = false if it does exist
if (!rs.next()) {
System.out.println("Ce produit n'exist pas !!"); //prints an error to help me see if this works
}
} catch (SQLException e) {
}
简而言之:它获取我输入的香水的名称(在textField中)并返回一个ResultSet。 使用该结果集,我可以检查香水的代码是否与rs.next()
一起存在问题是:对于打印......它工作正常!! 如果它不存在,我会 true (因为“!”),当它存在时,我会得到 false ! 但是当涉及到if时,它不再起作用了。每次我尝试,if中的打印都会被执行。每次。即使!rs.next()为true或false。这是我得到的输出:
Connection to SQLite has been established.
false
Ce produit n'exist pas !!
DataBase Closed
Connection to SQLite has been established.
true
Ce produit n'exist pas !!
DataBase Closed
你可以看到:我第一次得到 false (我输入了一个存在的名字)而 true 另一个(名字不存在)但是 if 在两种情况下都打印了String。尽管具有与之前的印刷相同的条件。
我错过了什么吗?为什么我没有得到“相同”的结果(如果在打印时为真,那么在if中是真的,反之亦然)? 任何帮助表示赞赏和感谢!
答案 0 :(得分:5)
你只需要调用class ETQueue: NSObject {
static func main(completion: @escaping()->()) {
if Thread.isMainThread {
// If current thread is main the i am calling the completion handler but execution of this completionHandler
//Takes the thread to some other level.
completion()
}else {
DispatchQueue.main.sync {
completion()
}
}
}
static func main(_ deley: Double, completion: @escaping()->()) {
DispatchQueue.main.asyncAfter(deadline: .now() + deley) {
completion()
}
}
static func background(completion: @escaping()->()) {
DispatchQueue.global(qos: .background).async {
completion()
}
}
}
一次,因为下次你调用它时会检查下一行,另外看看PreparedStatement类,你不应该直接连接字符串到查询,因为这可能导致SQLInjection
答案 1 :(得分:2)
每次调用rs.next()
都会将光标移动到下一个结果。所以:
rs = stmt.executeQuery(sql);
现在光标位于-1位置(即第一个结果集之前)。
System.out.println(!rs.next()); // = true if doesn't exists and = false if it does exist
现在光标位于第一个结果的位置0;此结果存在,因此调用返回true
。
if (!rs.next()) {
现在光标位于位置1;因为只返回了一个结果,该位置不存在,并且调用返回false
。