login()登陆检测,函数不能进入if(rs.next)中,求解释
public boolean login(String account,String password){
boolean check = false;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
try {
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:orcl", "system", "oracle");
String sql = "SELECT account,password from manager where account=? and password=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, account);
ps.setString(2, password);
ResultSet rs = ps.executeQuery();
if(rs.next()){
//System.out.println(rs.getString("account"));
//System.out.println(rs.getString("password"));
check = true;
}
ps.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return check;
}
为什么函数不能进入if()里面呢?也就是说我初始化check是什么值,返回就是什么值。请大神帮我看看啊!
[最优解释]
char是定长,不足的用空格补。
Java里用String Oracle数据库用varchar2对应。
[其他解释]
char(18)....char....ca
我才看到。。。
[其他解释]
SELECT account,password from manager where account=? and password=?查不到值当然进不去了
[其他解释]
ResultSet rs = ps.executeQuery();
结果集 rs 里没有东东
那么
if(rs.next()){
}
就进不去了
debug 下 看看吧 应该是select 没有查询到数据
[其他解释]
但是我是用数据库已有的账号密码验证的啊,那么rs有数据啊?
[其他解释]
你把ResultSet rs 定义到try catch外面去试试看.
[其他解释]
确定是这个错误!!!
[其他解释]
首先我觉得看着你的sql语句感觉怪怪的...建表的时候应该有主键值吧,你试着把where后面的语句改为id=?,然后set一下试试...
[其他解释]
为什么要定义到外面?解释一下
[其他解释]
如果没报异常的话 那么就是你传递的账户和密码和数据库对应不上、
查看你传递的账户密码是否与数据库表里的数据对应、
在oracle里执行
SELECT account,password from manager where account="你传递的账户" and password="你传递的密码"
是否有返回结果
------其他解决方案--------------------
quote=引用:]
引用:public boolean login(String account,String password){
boolean check = false;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
try {
Connection conn = Dri……[/quote]没有报异常,在数据库中也有返回结果
[这是查看从servlet传过来的账号和密码,
这是输出结果
这是从数据库中查询的结果
[其他解释]
主键就是account,因为不能重复注册,所以就把account设为主键了。
[其他解释]
account 和password 取值附近是不是有空格、
程序也看不出什么毛病、sql就得多瞧瞧了、
ps.setString(1, account.trim());
ps.setString(2, password.trim());
[其他解释]
把你的程序赋值了改了改配置、我是mysql数据库、不过返回的是true
public static void main(String[] args) throws Exception {
System.out.println(login("123123", "123123"));;
}
public static boolean login(String account,String password){
boolean check = false;
try {
Class.forName("com.mysql.jdbc.Driver");
try {
Connection conn = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8", "root", "123456");
String sql = "SELECT username,password from t_test where username=? and password=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, account);
ps.setString(2, password);
ResultSet rs = ps.executeQuery();
if(rs.next()){
//System.out.println(rs.getString("account"));
//System.out.println(rs.getString("password"));
check = true;
}
ps.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return check;
}[其他解释]
崩溃了
[其他解释]
感觉还是传递的账户和密码的问题。debug看下吧、
也拿个main方法测试下、自己传递
[其他解释]
System.out.println("["+account+"]");
System.out.println("["+password+"]");
程序开始的时候输出看看 ,是否是空格的影响
[其他解释]
没有。。。
[其他解释]
还是不行。。。
这是我建的表,不知道是不是表的问题(没有设主键,应该没区别吧)
[其他解释]
那试着换个表 起个 t_manager 表 字段也区分出来 t_account t_password
然后在试试、 也不知道是不是关键字的问题、
[其他解释]
这个能查到
[其他解释]
改成查询全部sql 不绑定参数 看能查到不、奇了怪了、
select * from t_manager
while(rs.next()){ }
[其他解释]
那要怎么修改呢
[其他解释]
感觉只能是传递过来的账户密码问题了、
[其他解释]
为什么这样可以?求解释!
[其他解释]
建表用char(18)搞笑呢。
给你的account和password各加上15个空格,凑齐18位再去查询。
[其他解释]
哦,原来是这样,多谢但是我做删除操作的时候为什么成功删除呢?(也是用char(18))这个有什么区别么?
[其他解释]
受教了,看来数据库建表有很多细节啊!多谢
[其他解释]
没区别,你用"delete from manager where account=? and password=?"在JDBC里一样删不掉。
用别的方式删掉了证明两种删除操作有区别。
[其他解释]
[其他解释]
这个。。。还是要多谢你
