我是android开发的初学者。这是我的第一个 android studio 应用程序中的注册代码的一部分:代码在第一个执行查询行之后立即进入 catch 状态,并且不执行第二个查询。如果我检查数据库,则会添加用户,但不会添加粉丝。
知道为什么吗?如有任何帮助,我们将不胜感激。
try {
Connection con = connectionClass.CONN();
if (con == null) {
z = "Error in connection with SQL server";
} else {
Statement stmt = con.createStatement();
String query1 = "INSERT INTO Usertb Values ('" + userid + "', '" + Password + "', '" + 1 + "')";
stmt.executeQuery(query1);
String query = "INSERT INTO Fan Values ('" + FirstName + "', '" + LastName + "','" + Age + "', '" + Email + "', '"
+ null + "', '" + i + "', '" + null + "')";
rs = stmt.executeQuery(query);
if (rs.next()) {
z = "Sign Up successfull";
isSuccess = true;
}
}
} catch (Exception ex) {
isSuccess = false;
z = "Exceptions";
}
最佳答案
必须使用executeUpdate(INSERT/UPDATE)而不是executeQuery。
String sql = "INSERT INTO Usertb(userid, passw, n) VALUES (?, PASSWORD(?), ?)";
try (PreparedStatement stmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
stmt.setString(1, userName);
stmt.setString(2, password);
stmt.setInt(3, 1);
int updateCount = stmt.executeUpdate(query1); // 1 when 1 record inserted
if (updateCount != 0) {
// If you want to use an autincrement primary key:
try (ResultSet rsKeys = stm.getGeneratedKeys()) {
if (rsKeys.next()) {
long id = rsKeys.getLong(1);
}
}
}
} // Closes stmt
此外,使用准备好的语句来防止SQL注入(inject)也非常重要。它还处理字符串中的单引号和反斜杠。
此外,还展示了如何使用 AUTOINCR 字段来检索数据库生成的 key ,例如用于第二个 INSERT。
第二次使用新的PreparedStatement。
密码最好以加密方式存储在数据库中,以防有人窃取数据。你可能会研究一下这个主题。我的解决方案非常简单,寻找种子和其他加密功能。
关于java - 代码在第一次执行查询后退出 try 并进入 catch ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36389464/