Topic: 另一个CallableStatement的问题

  Print this page

1.另一个CallableStatement的问题 Copy to clipboard
Posted by: Jsharp
Posted on: 2006-08-03 02:18

数据库:sqlserver2000
操作系统 winxp 2
存储过程如下
CREATE proc adduser
@name varchar(20),@pwd varchar(20)
as
insert into users values(@name,@pwd)
程式代码如下
public void reg() {
System.out.println("请输入你的用户名:");
String username = input();//input()方法返回一个控制台输入的字符串
System.out.println("请输入你的密码:");
String passwd = input();
System.out.println("请再次输入你的密码:");
String passwd2 = input();
String id1 = String.valueOf((int) (Math.random() * 10));
String id2 = String.valueOf((int) (Math.random() * 10));
String id3 = String.valueOf((int) (Math.random() * 10));
String id4 = String.valueOf((int) (Math.random() * 10));
String id = id1 + id2 + id3 + id4;
System.out.println("请输入你看到的右边的验证码:" + id);
String idd = input();
regCheck(username, passwd, passwd2, idd, id);
}
public void regCheck(String username, String passwd, String passwd2,
String idd, String id) {
if (passwd.compareTo(passwd2) != 0) {
System.out.println("两次输入密码不同");
reg();
} else if (passwd.compareTo(passwd2) == 0 && idd.compareTo(id) == 0) {

ConnectBean conBean = new ConnectBean();
Connection conn = conBean.getConnection();
if (conn == null) {
System.out.println("连接数据库失败");
}
try {
cst = conn.prepareCall("{call adduser(?,?)}");
cst.setString(1, username);
cst.setString(2, passwd);
cst.executeUpdate();
System.out.println("注册成功!");
login();
} catch (SQLException ex) {
} finally {
try {
cst.close();
} catch (SQLException ex1) {
}
}

} else if (idd.compareTo(id) != 0) {
System.out.println("验证码输入错误");
reg();
}
}
这样之后数据库中的确加入了一个username 和passwd
提出passwd数据后和在控制台输入的密码数据无论用equals或compareTo方法比较结果都是false但如果直接在数据库中添加数据则能判断为true或直接在数据库中调用存储过程做判断结果都是true实在搞不明白 请帮帮我 谢谢大家

2.Re:另一个CallableStatement的问题 [Re: Jsharp] Copy to clipboard
Posted by: why
Posted on: 2006-08-03 08:57

最後那句很難看明白
請說清楚閣下怎樣判断

不相信equals會不行

3.Re:另一个CallableStatement的问题 [Re: Jsharp] Copy to clipboard
Posted by: Jsharp
Posted on: 2006-08-03 14:36

谢谢why 对你仰慕很久了.
****************************************************
这样之后数据库中的确加入了一个username 和passwd
提出passwd数据后和在控制台输入的密码数据无论用equals或compareTo方法比较结果都是false但如果直接在数据库中添加数据则能判断为true或直接在数据库中调用存储过程做判断结果都是true实在搞不明白
****************************************************
我的意思是:这样就会在数据库的users表中添加上一个用户名和密码.然后用这个用户名和密码登陆系统.当在执行程序我用刚添加的username和passwd登陆,总提示我我输入的passwd和数据库中的(也就是我刚添加的)passwd不等(试了equals和compareTo方法).
如果直接在数据库中exec proc的话也能在users表中添加一个username和passwd
用这样添加的username和passwd登陆 就能通过
如果在数据库中直接用insert也能在users表中添加一个username和passwd
用这样添加的username和passwd登陆 也能通过
惟独在程式中调用存储过程添加进去的username和passwd不能用
于是我把在控制台登陆时输入的username和passwd
System.out.prinltln了一下并把在数据库中用程式调用存储过程创建的username和passwd打印了一下 肉眼看上去一样 无空格 无其他符号 length也一样
但就是equals false
SadSad

4.Re:另一个CallableStatement的问题 [Re: Jsharp] Copy to clipboard
Posted by: Jsharp
Posted on: 2006-08-03 15:29

关于这个问题我又重新写了一个方法如下

import com.atm.tools.ConnectBean;
import java.sql.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Test {
private BufferedReader br = null;
private ResultSet rs = null;
private PreparedStatement ps=null;

public Test() {
}
public static void main(String[] args) {
Test t=new Test();
t.zhu();
}

public void zhu() {
System.out.println("**************ATM**************");
System.out.println("1.拥有帐户");
System.out.println("2.新用户注册");
String mm = input();
if ("1".equals(mm)) {
login();
} else if ("2".equals(mm)) {
reg();
} else {
System.out.println("输入有错误");
zhu();
}
//System.out.println("***********请选择功能************");
}

public void reg(){
System.out.println("注册");
System.out.println("username");
String name=input();
System.out.println("passwd");
String passwd=input();
ConnectBean conBean = new ConnectBean();//数据库连接类 ,没问题
Connection conn=conBean.getConnection();
if(conn==null){
System.out.println("连接数据库失败");
}
try {
ps = conn.prepareStatement("insert into users values(?,?)");
ps.setString(1,name);
ps.setString(2,passwd);
ps.executeUpdate();
} catch (SQLException ex) {
}finally{
try {
ps.close();
conn.close();
} catch (SQLException ex1) {
}
}

public void login(){
System.out.println("登陆");
System.out.println("username");
String name=input();
System.out.println("passwd");
String passwd=input();
ConnectBean conBean = new ConnectBean();
Connection conn=conBean.getConnection();
if(conn==null){
System.out.println("连接数据库失败");
}
try {
ps = conn.prepareStatement("select * from users where username=?");
ps.setString(1,name);
ResultSet rs=ps.executeQuery();
System.out.println("aaaa");
while(rs.next()){
String pwd=rs.getString(3);
System.out.println(pwd);
System.out.println(passwd);
System.out.println(passwd.equals(pwd));
}

} catch (SQLException ex) {
}finally{ //加与不加都试过了
try {
ps.close();
conn.close();
} catch (SQLException ex1) {
}
}

}

public String input() {
br = new BufferedReader(new InputStreamReader(System.in));
String s = new String();
try {
s = br.readLine();
} catch (IOException ex) {
}
return s;
}

}
}

情况是这样 如果用reg()方法添加的用户 则在login()里面判断为false;
如果手工在 users表中写如一条记录 用那条记录的username 和 passwd调用
login()方法 就为true
帮帮我吧

5.Re:另一个CallableStatement的问题 [Re: Jsharp] Copy to clipboard
Posted by: why
Posted on: 2006-08-03 15:33

>> System.out.prinltln了一下并把在数据库中用程式调用存储过程创建的username和passwd打印了一下 肉眼看上去一样 无空格 无其他符号 length也一样
>>
如何知道length也一样?
那個table中的username和passwd是char還是varchar?
是char可能要trim

6.Re:另一个CallableStatement的问题 [Re: Jsharp] Copy to clipboard
Posted by: Jsharp
Posted on: 2006-08-03 15:41

回答 why老师
是varchar(50)
是我不对问题描述不全面对不起了

7.Re:另一个CallableStatement的问题 [Re: Jsharp] Copy to clipboard
Posted by: Jsharp
Posted on: 2006-08-03 16:22

新发现,将reg()方法里的prepareStatment换成用Statement来执行sql
插入数据后
然后调用login 用新用reg()方法生成的username和passwd判断就为true了
期待ing


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923