//用户登录
boolean flag=false;
int userNo=Integer.parseInt(user.getUserNo());
String password=user.getPassword();
//测试是否从现在的user对象中取到了值
System.out.println(userNo+"我是USER对象的userNo");
System.out.println(password+"我是USER对象的password");
DatabaseConnection dbc=new DatabaseConnection();//取得数据库连接和关闭对象;
try{
String sql="SELECT userNo FROM userInfo where userNo=? and password=?";
this.conn=dbc.getConnection();
this.pst=conn.prepareStatement(sql);
//this.pst.setInt(1, userNo);//给sql中参数赋值
this.pst.setLong(1, userNo);
this.pst.setString(2, password);
ResultSet rs=pst.executeQuery();
if(rs.next()){//传入用户账号和对应的密码都存在时为真
flag=true;
System.out.println(rs.getString(userNo)+"我是从数据库里取出来的");
System.out.print(flag+"测试flag");//测试flag,看是否进入了if里面,true则进入了
rs.close();
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(this.pst!=null){
this.pst.close();
}
this.conn.close();
}
return flag;
}
报的错误信息如:
at java.lang.Thread.run(Unknown Source)
123我是从页面取出来的userNO
123我是USER对象的userNo
123我是USER对象的password
java.sql.SQLException: No value specified for parameter 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2214)
从上面可以看出userNO和password都是取得了值 的,可是为什么会设置不了SQL语句里面的参数呢?
48 个解决方案
#1
pst.executeUpdate();
#2
我错了、、、看错sql了
#3
userNo 实体类中的类型是什么、和数据库的一致么、
#4
this.pst.setLong(0, userNo);
this.pst.setString(1, password);
这样设置
this.pst.setString(1, password);
这样设置
#5
代码应该没错,确保表里面有数据吧
#6
是否表名与关键字之间添加空格了?
#7
难道不用吗?不会吧,这个我一直都是这样用的呀…………
#8
不是,数据库里的是bigint类型哦……这样有问题不?
我等下换个统一的来试 一下
#9
不懂啊?API文档都不是这样只的吧~~~(刚查了下)
#10
确定好了Userno到底是什么类型的,设置参数就是从1开始的
#11
數據庫中,userNO
什麽類型?
this.pst.setLong(1, userNo);
this.pst.setString(2, password);
userNo最好給成long再設置進來,逐句類型保持一致。不知道你數據庫是什麽類型?
#12
用的是MYSQL ,类型是bigint,正要统一一下呢,刚打球赛去了,洗个澡( ⊙ o ⊙ )
#13
补充下哈,当我输入的是数据库里面的内容 的时候:控制台显示有下
172我是从页面取出来的userNO
172我是USER对象的userNo
172我是USER对象的password
java.sql.SQLException: Column '172' not found.
红色这个是什么情况呢?
172我是从页面取出来的userNO
172我是USER对象的userNo
172我是USER对象的password
java.sql.SQLException: Column '172' not found.
红色这个是什么情况呢?
#14
System.out.println(rs.getString(userNo)+"我是从数据库里取出来的");
这个不对。
改成如下
System.out.println(rs.getString("userNo")+"我是从数据库里取出来的");
这个不对。
改成如下
System.out.println(rs.getString("userNo")+"我是从数据库里取出来的");
#15
确实应该如此呀……
java.sql.SQLException: No value specified for parameter 1这个问题应该怎么样啊?
#16
你把你最新修改后的代码,用csdn标准的代码输出格式发出来,我再给你看。
#17
csdn标准的代码输出格式?这个是什么,没看到过耶
代码如下:不知道行不行?
public boolean login(UserInfo user)throws Exception{
//用户登录
boolean flag=false;
String userNo=user.getUserNo();
String password=user.getPassword();
//测试是否从现在的user对象中取到了值
System.out.println(userNo+"我是USER对象的userNo");
System.out.println(password+"我是USER对象的password");
DatabaseConnection dbc=new DatabaseConnection();//取得数据库连接和关闭对象;
try{
String sql="SELECT userNo FROM userInfo where userNo=? and password=?";
this.conn=dbc.getConnection();
this.pst=conn.prepareStatement(sql);
//this.pst.setInt(1, userNo);//给sql中参数赋值
this.pst.setString(1, userNo);
this.pst.setString(2, password);
System.out.println(sql);
ResultSet rs=pst.executeQuery();
if(rs.next()){//传入用户账号和对应的密码都存在时为真
flag=true;
String no=rs.getString("userNo");
System.out.println(no+"我是从数据库里取出来的");
System.out.print(flag+"测试flag");//测试flag,看是否进入了if里面,true则进入了
rs.close();
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(this.pst!=null){
this.pst.close();
}
this.conn.close();
}
return flag;
}
#18
参考下面的格式。我已经修改了部分。
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
public boolean login(UserInfo user) throws Exception {
// 用户登录
boolean flag = false;
String userNo = user.getUserNo();
String password = user.getPassword();
// 测试是否从现在的user对象中取到了值
System.out.println(userNo + "我是USER对象的userNo");
System.out.println(password + "我是USER对象的password");
DatabaseConnection dbc = new DatabaseConnection();// 取得数据库连接和关闭对象;
try {
String sql = "SELECT * FROM userInfo where userNo = ? and password = ?";
this.conn = dbc.getConnection();
this.pst = conn.prepareStatement(sql);
this.pst.setString(1, userNo);
this.pst.setString(2, password);
System.out.println(sql);
rs = pst.executeQuery();
while(rs.next()) {// 传入用户账号和对应的密码都存在时为真
flag = true;
String no = rs.getString("userNo");
System.out.println(no + "我是从数据库里取出来的");
System.out.print(flag + "测试flag");// 测试flag,看是否进入了if里面,true则进入了
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
rs.close();
}
if (pst != null) {
pst.close();
}
if (conn != null) {
conn.close();
}
}
return flag;
}
#19
1。String sql="SELECT userNo FROM userInfo where userNo=? and password=?"; 不好用
2。String sql="SELECT password FROM userInfo where userNo=? and password=?"; 应该也不好用
3。String sql="SELECT userNo,password FROM userInfo where userNo=? and password=?"; ?
4。String sql="SELECT * FROM userInfo where userNo=? and password=?"; 应该好用。
这个问题比较奇怪。
#20
不是好用不好用的問題,習慣而已。你先試試,看看是否ok,這個是關鍵。
#21
试了select * from……的方法,但报错一样,有没有什么方法来判断返回值为void的方法是否执行成功的呀,如设置个boolean变量,来判断this.pst.setString(1, userNo);这句是否执行成功的……
#22
1、没有看到你完整代码,不好确定原因。
2、你这样试试。使用普通的Statement代替PreparedStatement,试试,看看是否依旧报错、
#23
想一下哈,在现在这种情况下,用它们的区别是什么呀?
#24
区别一会跟你说,我问你,是不是好报错?
#25
一样会报错哦~~
172我是从页面取出来的userNO
172我是USER对象的userNo2
172我是USER对象的password2
SELECT userNO FROM userInfo where userNO=172 and password=172这是在执行this.st.executeQuery(sql2)之前
SELECT userNO FROM userInfo where userNO=172 and password=172这是在执行this.st.executeQuery(sql2)之后
172我是从数据库里取出来的
true测试flagjava.sql.SQLException: No value specified for parameter 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
#26
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
public boolean login(UserInfo user) throws Exception {
// 用户登录
boolean flag = false;
String userNo = user.getUserNo();
String password = user.getPassword();
// 测试是否从现在的user对象中取到了值
System.out.println(userNo + "我是USER对象的userNo");
System.out.println(password + "我是USER对象的password");
DatabaseConnection dbc = new DatabaseConnection();// 取得数据库连接和关闭对象;
try {
String sql = "SELECT * FROM userInfo where userNo = ? and password = ?";
this.conn = dbc.getConnection();
this.pst = conn.prepareStatement(sql);
this.pst.setString(1, userNo);
this.pst.setString(2, password);
System.out.println(sql);
rs = pst.executeQuery();
while(rs.next()) {// 传入用户账号和对应的密码都存在时为真
flag = true;
String no = rs.getString("userNo");
System.out.println(no + "我是从数据库里取出来的");
System.out.print(flag + "测试flag");// 测试flag,看是否进入了if里面,true则进入了
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
rs.close();
}
if (pst != null) {
pst.close();
}
if (conn != null) {
conn.close();
}
}
return flag;
}
上面这段代码你劝改了,改成直接获取conn,获取pst,rs,别要你封装的类。
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
public boolean login(UserInfo user) throws Exception {
// 用户登录
boolean flag = false;
String userNo = user.getUserNo();
String password = user.getPassword();
try {
Class.forName("");类似这样,写完整
String sql = "SELECT * FROM userInfo where userNo = ? and password = ?";
this.pst = conn.prepareStatement(sql);
this.pst.setString(1, userNo);
this.pst.setString(2, password);
System.out.println(sql);
rs = pst.executeQuery();
while(rs.next()) {// 传入用户账号和对应的密码都存在时为真
flag = true;
String no = rs.getString("userNo");
System.out.println(no + "我是从数据库里取出来的");
System.out.print(flag + "测试flag");// 测试flag,看是否进入了if里面,true则进入了
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
rs.close();
}
if (pst != null) {
pst.close();
}
if (conn != null) {
conn.close();
}
}
return flag;
}
#27
26楼,还是报这样的错哦java.sql.SQLException: No value specified for parameter 1
但是这你说的这样,和报这个错有什么关联不?
挺感谢你的,能提供这么多见解~~
但是这你说的这样,和报这个错有什么关联不?
挺感谢你的,能提供这么多见解~~
#28
1、我给你说这么多,是想确定是不是你建表的问题,也就是,是数据库的问题,跟程序没有关系。
2、你把你改后的完整代码贴一下,注意用csdn标准的插入源代码编辑,像26楼我发的这样的格式。把你的注释测试代码全部删除掉。
3、另外把你的表结构贴出来
#29
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.PreparedStatement;
public class UserDAOImpl implements UserDAO{
Connection conn=null;
PreparedStatement pst=null;
Statement st=null;
public boolean login(UserInfo user) throws Exception {
// 用户登录
String DRIVER="com.mysql.jdbc.Driver";
String URL="jdbc:mysql://localhost:3309/bank";
String USER="root";
String PASSWORD="mysql";
boolean flag = false;
String userNo = user.getUserNo();
String password = user.getPassword();
System.out.println(userNo+"我是在user对象里的");
try {
Class.forName(DRIVER);//类似这样,写完整
this.conn=DriverManager.getConnection(URL,USER,PASSWORD);
String sql = "SELECT * FROM userInfo where userNo = ? and password = ?";
this.pst = conn.prepareStatement(sql);
this.pst.setString(1, userNo);
this.pst.setString(2, password);
System.out.println(sql);
ResultSet rs = pst.executeQuery();
if(rs.next()) {// 传入用户账号和对应的密码都存在时为真
flag = true;
String no = rs.getString("userNo");
System.out.println(no + "我是从数据库里取出来的");
System.out.println(flag + "测试flag");// 测试flag,看是否进入了if里面,true则进入了
}
} catch (Exception e) {
e.printStackTrace();
} finally {
/*if (rs!=null) {
rs.close();
}*///注释这,是因为不知道为什么rs为报错
if (pst != null) {
pst.close();
}
if (conn != null) {
conn.close();
}
}
return flag;
}
}
这是实现本功能的方法,我把它从类里剪出来了……
表的结构如下:
+-----------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+-------------+------+-----+---------+-------+
| userNo | varchar(20) | NO | PRI | | |
| userName | varchar(8) | NO | | | |
| userAge | int(3) | YES | | NULL | |
| tel | varchar(11) | NO | | | |
| userAddress | varchar(10) | YES | | NULL | |
| userSex | varchar(2) | YES | | NULL | |
| balance | int(30) | NO | | | |
| userflag | int(1) | YES | | 0 | |
| password | varchar(30) | NO | | | |
| confirmpassword | varchar(30) | NO | | | |
+-----------------+-------------+------+-----+---------+-------+
#30
1、你的mysql端口是3309不是3306?你改了?
2、if(rs.next()) {// 传入用户账号和对应的密码都存在时为真
改成
while(rs.next()) {// 传入用户账号和对应的密码都存在时为真
3、ResultSet rs 放在try外面定义,
if (rs!=null) {
rs.close();
}
这个就不报错了。
4、你的表没有主键?
5、
String userNo = user.getUserNo();
String password = user.getPassword();
确定这俩都有数值,不为空?因为数据库中,userNo和password都不允许为null
6、
String no = rs.getString("userNo");
改为
String no = rs.getString(1);
2、if(rs.next()) {// 传入用户账号和对应的密码都存在时为真
改成
while(rs.next()) {// 传入用户账号和对应的密码都存在时为真
3、ResultSet rs 放在try外面定义,
if (rs!=null) {
rs.close();
}
这个就不报错了。
4、你的表没有主键?
5、
String userNo = user.getUserNo();
String password = user.getPassword();
确定这俩都有数值,不为空?因为数据库中,userNo和password都不允许为null
6、
String no = rs.getString("userNo");
改为
String no = rs.getString(1);
#31
回答:
1、确实是改了
2、这样有什么好处不?
3、果真如此,等下得查下这是为什么,嘿嘿
4、有啊,看下表结构的第一句| userNo | varchar(20) | NO | PRI | | |
5、of course
6、用它们都是可以取出值来哦
“昨日凡阳”,能不能加QQ好友啊?多向你讨教一下哦,我的QQ441288971
#32
你的驱动包是不是有问题
#33
不会吧,想不能的是,以前我也是这样用的,东西 也都是那些,可是都不会报呀,难道和重装了系统也有关系 ?
#34
你为什么要改端口?
#35
是重装过MYSQL之后的默认的端口的
#36
重转之后默认的为什么就变3309了?
#37
这个我也不是很清楚,和这有关系么?
我贴出,看一咯:
mysql> status;
--------------
mysql Ver 14.12 Distrib 5.0.27, for Win32 (ia32)
Connection id: 1
Current database:
Current user: root@localhost
SSL: Not in use
Using delimiter: ;
Server version: 5.0.27-community-nt
Protocol version: 10
Connection: localhost via TCP/IP
Server characterset: utf8
Db characterset: utf8
Client characterset: gbk
Conn. characterset: gbk
TCP port: 3309
Uptime: 17 min 1 sec
#38
这看不出来什么。你的确实奇怪。
#39
昨晚想起来了,只是没有网上了,没有回啊,记得是重装的时候,担心以前的没有清干净,会有端口冲突,我就设置为3309了,可是这对报现在的错有影响么?
#40
不好說呀。
#41
要不我发远程给你,你调着帮我看看呗,这真是个让人纠结的问题
#42
我的电脑是Linux,而且不能装qq的。
#43
这样呀,那能不能帮我看看这个校验器的问题啊?这个也让我纠结了好久……我在下面的URL这里提了问
http://topic.csdn.net/u/20120510/12/4bbd924d-7f92-4b83-b2aa-b26be9421974.html
http://topic.csdn.net/u/20120510/12/4bbd924d-7f92-4b83-b2aa-b26be9421974.html
#44
校验器的问题已解决,原来是一路径配置错了
#45
我看的云山雾绕的,怎么回城了路径配置问题呢?
#46
是在配置ACTION的时候,CLASS的路径配置了哦,<action name="registValidate" class="bank.action.validate.LoginValidate">
我这里应该是registValidate了
#47
ok,解决了就好。
#48
java.sql.SQLException: No value specified for parameter 1
这个错也不清楚为什么也不报了,谢谢你这么给了这么多的帮助……
#1
pst.executeUpdate();
#2
我错了、、、看错sql了
#3
userNo 实体类中的类型是什么、和数据库的一致么、
#4
this.pst.setLong(0, userNo);
this.pst.setString(1, password);
这样设置
this.pst.setString(1, password);
这样设置
#5
代码应该没错,确保表里面有数据吧
#6
是否表名与关键字之间添加空格了?
#7
难道不用吗?不会吧,这个我一直都是这样用的呀…………
#8
不是,数据库里的是bigint类型哦……这样有问题不?
我等下换个统一的来试 一下
#9
不懂啊?API文档都不是这样只的吧~~~(刚查了下)
#10
确定好了Userno到底是什么类型的,设置参数就是从1开始的
#11
數據庫中,userNO
什麽類型?
this.pst.setLong(1, userNo);
this.pst.setString(2, password);
userNo最好給成long再設置進來,逐句類型保持一致。不知道你數據庫是什麽類型?
#12
用的是MYSQL ,类型是bigint,正要统一一下呢,刚打球赛去了,洗个澡( ⊙ o ⊙ )
#13
补充下哈,当我输入的是数据库里面的内容 的时候:控制台显示有下
172我是从页面取出来的userNO
172我是USER对象的userNo
172我是USER对象的password
java.sql.SQLException: Column '172' not found.
红色这个是什么情况呢?
172我是从页面取出来的userNO
172我是USER对象的userNo
172我是USER对象的password
java.sql.SQLException: Column '172' not found.
红色这个是什么情况呢?
#14
System.out.println(rs.getString(userNo)+"我是从数据库里取出来的");
这个不对。
改成如下
System.out.println(rs.getString("userNo")+"我是从数据库里取出来的");
这个不对。
改成如下
System.out.println(rs.getString("userNo")+"我是从数据库里取出来的");
#15
确实应该如此呀……
java.sql.SQLException: No value specified for parameter 1这个问题应该怎么样啊?
#16
你把你最新修改后的代码,用csdn标准的代码输出格式发出来,我再给你看。
#17
csdn标准的代码输出格式?这个是什么,没看到过耶
代码如下:不知道行不行?
public boolean login(UserInfo user)throws Exception{
//用户登录
boolean flag=false;
String userNo=user.getUserNo();
String password=user.getPassword();
//测试是否从现在的user对象中取到了值
System.out.println(userNo+"我是USER对象的userNo");
System.out.println(password+"我是USER对象的password");
DatabaseConnection dbc=new DatabaseConnection();//取得数据库连接和关闭对象;
try{
String sql="SELECT userNo FROM userInfo where userNo=? and password=?";
this.conn=dbc.getConnection();
this.pst=conn.prepareStatement(sql);
//this.pst.setInt(1, userNo);//给sql中参数赋值
this.pst.setString(1, userNo);
this.pst.setString(2, password);
System.out.println(sql);
ResultSet rs=pst.executeQuery();
if(rs.next()){//传入用户账号和对应的密码都存在时为真
flag=true;
String no=rs.getString("userNo");
System.out.println(no+"我是从数据库里取出来的");
System.out.print(flag+"测试flag");//测试flag,看是否进入了if里面,true则进入了
rs.close();
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(this.pst!=null){
this.pst.close();
}
this.conn.close();
}
return flag;
}
#18
参考下面的格式。我已经修改了部分。
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
public boolean login(UserInfo user) throws Exception {
// 用户登录
boolean flag = false;
String userNo = user.getUserNo();
String password = user.getPassword();
// 测试是否从现在的user对象中取到了值
System.out.println(userNo + "我是USER对象的userNo");
System.out.println(password + "我是USER对象的password");
DatabaseConnection dbc = new DatabaseConnection();// 取得数据库连接和关闭对象;
try {
String sql = "SELECT * FROM userInfo where userNo = ? and password = ?";
this.conn = dbc.getConnection();
this.pst = conn.prepareStatement(sql);
this.pst.setString(1, userNo);
this.pst.setString(2, password);
System.out.println(sql);
rs = pst.executeQuery();
while(rs.next()) {// 传入用户账号和对应的密码都存在时为真
flag = true;
String no = rs.getString("userNo");
System.out.println(no + "我是从数据库里取出来的");
System.out.print(flag + "测试flag");// 测试flag,看是否进入了if里面,true则进入了
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
rs.close();
}
if (pst != null) {
pst.close();
}
if (conn != null) {
conn.close();
}
}
return flag;
}
#19
1。String sql="SELECT userNo FROM userInfo where userNo=? and password=?"; 不好用
2。String sql="SELECT password FROM userInfo where userNo=? and password=?"; 应该也不好用
3。String sql="SELECT userNo,password FROM userInfo where userNo=? and password=?"; ?
4。String sql="SELECT * FROM userInfo where userNo=? and password=?"; 应该好用。
这个问题比较奇怪。
#20
不是好用不好用的問題,習慣而已。你先試試,看看是否ok,這個是關鍵。
#21
试了select * from……的方法,但报错一样,有没有什么方法来判断返回值为void的方法是否执行成功的呀,如设置个boolean变量,来判断this.pst.setString(1, userNo);这句是否执行成功的……
#22
1、没有看到你完整代码,不好确定原因。
2、你这样试试。使用普通的Statement代替PreparedStatement,试试,看看是否依旧报错、
#23
想一下哈,在现在这种情况下,用它们的区别是什么呀?
#24
区别一会跟你说,我问你,是不是好报错?
#25
一样会报错哦~~
172我是从页面取出来的userNO
172我是USER对象的userNo2
172我是USER对象的password2
SELECT userNO FROM userInfo where userNO=172 and password=172这是在执行this.st.executeQuery(sql2)之前
SELECT userNO FROM userInfo where userNO=172 and password=172这是在执行this.st.executeQuery(sql2)之后
172我是从数据库里取出来的
true测试flagjava.sql.SQLException: No value specified for parameter 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
#26
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
public boolean login(UserInfo user) throws Exception {
// 用户登录
boolean flag = false;
String userNo = user.getUserNo();
String password = user.getPassword();
// 测试是否从现在的user对象中取到了值
System.out.println(userNo + "我是USER对象的userNo");
System.out.println(password + "我是USER对象的password");
DatabaseConnection dbc = new DatabaseConnection();// 取得数据库连接和关闭对象;
try {
String sql = "SELECT * FROM userInfo where userNo = ? and password = ?";
this.conn = dbc.getConnection();
this.pst = conn.prepareStatement(sql);
this.pst.setString(1, userNo);
this.pst.setString(2, password);
System.out.println(sql);
rs = pst.executeQuery();
while(rs.next()) {// 传入用户账号和对应的密码都存在时为真
flag = true;
String no = rs.getString("userNo");
System.out.println(no + "我是从数据库里取出来的");
System.out.print(flag + "测试flag");// 测试flag,看是否进入了if里面,true则进入了
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
rs.close();
}
if (pst != null) {
pst.close();
}
if (conn != null) {
conn.close();
}
}
return flag;
}
上面这段代码你劝改了,改成直接获取conn,获取pst,rs,别要你封装的类。
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
public boolean login(UserInfo user) throws Exception {
// 用户登录
boolean flag = false;
String userNo = user.getUserNo();
String password = user.getPassword();
try {
Class.forName("");类似这样,写完整
String sql = "SELECT * FROM userInfo where userNo = ? and password = ?";
this.pst = conn.prepareStatement(sql);
this.pst.setString(1, userNo);
this.pst.setString(2, password);
System.out.println(sql);
rs = pst.executeQuery();
while(rs.next()) {// 传入用户账号和对应的密码都存在时为真
flag = true;
String no = rs.getString("userNo");
System.out.println(no + "我是从数据库里取出来的");
System.out.print(flag + "测试flag");// 测试flag,看是否进入了if里面,true则进入了
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
rs.close();
}
if (pst != null) {
pst.close();
}
if (conn != null) {
conn.close();
}
}
return flag;
}
#27
26楼,还是报这样的错哦java.sql.SQLException: No value specified for parameter 1
但是这你说的这样,和报这个错有什么关联不?
挺感谢你的,能提供这么多见解~~
但是这你说的这样,和报这个错有什么关联不?
挺感谢你的,能提供这么多见解~~
#28
1、我给你说这么多,是想确定是不是你建表的问题,也就是,是数据库的问题,跟程序没有关系。
2、你把你改后的完整代码贴一下,注意用csdn标准的插入源代码编辑,像26楼我发的这样的格式。把你的注释测试代码全部删除掉。
3、另外把你的表结构贴出来
#29
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.PreparedStatement;
public class UserDAOImpl implements UserDAO{
Connection conn=null;
PreparedStatement pst=null;
Statement st=null;
public boolean login(UserInfo user) throws Exception {
// 用户登录
String DRIVER="com.mysql.jdbc.Driver";
String URL="jdbc:mysql://localhost:3309/bank";
String USER="root";
String PASSWORD="mysql";
boolean flag = false;
String userNo = user.getUserNo();
String password = user.getPassword();
System.out.println(userNo+"我是在user对象里的");
try {
Class.forName(DRIVER);//类似这样,写完整
this.conn=DriverManager.getConnection(URL,USER,PASSWORD);
String sql = "SELECT * FROM userInfo where userNo = ? and password = ?";
this.pst = conn.prepareStatement(sql);
this.pst.setString(1, userNo);
this.pst.setString(2, password);
System.out.println(sql);
ResultSet rs = pst.executeQuery();
if(rs.next()) {// 传入用户账号和对应的密码都存在时为真
flag = true;
String no = rs.getString("userNo");
System.out.println(no + "我是从数据库里取出来的");
System.out.println(flag + "测试flag");// 测试flag,看是否进入了if里面,true则进入了
}
} catch (Exception e) {
e.printStackTrace();
} finally {
/*if (rs!=null) {
rs.close();
}*///注释这,是因为不知道为什么rs为报错
if (pst != null) {
pst.close();
}
if (conn != null) {
conn.close();
}
}
return flag;
}
}
这是实现本功能的方法,我把它从类里剪出来了……
表的结构如下:
+-----------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+-------------+------+-----+---------+-------+
| userNo | varchar(20) | NO | PRI | | |
| userName | varchar(8) | NO | | | |
| userAge | int(3) | YES | | NULL | |
| tel | varchar(11) | NO | | | |
| userAddress | varchar(10) | YES | | NULL | |
| userSex | varchar(2) | YES | | NULL | |
| balance | int(30) | NO | | | |
| userflag | int(1) | YES | | 0 | |
| password | varchar(30) | NO | | | |
| confirmpassword | varchar(30) | NO | | | |
+-----------------+-------------+------+-----+---------+-------+
#30
1、你的mysql端口是3309不是3306?你改了?
2、if(rs.next()) {// 传入用户账号和对应的密码都存在时为真
改成
while(rs.next()) {// 传入用户账号和对应的密码都存在时为真
3、ResultSet rs 放在try外面定义,
if (rs!=null) {
rs.close();
}
这个就不报错了。
4、你的表没有主键?
5、
String userNo = user.getUserNo();
String password = user.getPassword();
确定这俩都有数值,不为空?因为数据库中,userNo和password都不允许为null
6、
String no = rs.getString("userNo");
改为
String no = rs.getString(1);
2、if(rs.next()) {// 传入用户账号和对应的密码都存在时为真
改成
while(rs.next()) {// 传入用户账号和对应的密码都存在时为真
3、ResultSet rs 放在try外面定义,
if (rs!=null) {
rs.close();
}
这个就不报错了。
4、你的表没有主键?
5、
String userNo = user.getUserNo();
String password = user.getPassword();
确定这俩都有数值,不为空?因为数据库中,userNo和password都不允许为null
6、
String no = rs.getString("userNo");
改为
String no = rs.getString(1);
#31
回答:
1、确实是改了
2、这样有什么好处不?
3、果真如此,等下得查下这是为什么,嘿嘿
4、有啊,看下表结构的第一句| userNo | varchar(20) | NO | PRI | | |
5、of course
6、用它们都是可以取出值来哦
“昨日凡阳”,能不能加QQ好友啊?多向你讨教一下哦,我的QQ441288971
#32
你的驱动包是不是有问题
#33
不会吧,想不能的是,以前我也是这样用的,东西 也都是那些,可是都不会报呀,难道和重装了系统也有关系 ?
#34
你为什么要改端口?
#35
是重装过MYSQL之后的默认的端口的
#36
重转之后默认的为什么就变3309了?
#37
这个我也不是很清楚,和这有关系么?
我贴出,看一咯:
mysql> status;
--------------
mysql Ver 14.12 Distrib 5.0.27, for Win32 (ia32)
Connection id: 1
Current database:
Current user: root@localhost
SSL: Not in use
Using delimiter: ;
Server version: 5.0.27-community-nt
Protocol version: 10
Connection: localhost via TCP/IP
Server characterset: utf8
Db characterset: utf8
Client characterset: gbk
Conn. characterset: gbk
TCP port: 3309
Uptime: 17 min 1 sec
#38
这看不出来什么。你的确实奇怪。
#39
昨晚想起来了,只是没有网上了,没有回啊,记得是重装的时候,担心以前的没有清干净,会有端口冲突,我就设置为3309了,可是这对报现在的错有影响么?
#40
不好說呀。
#41
要不我发远程给你,你调着帮我看看呗,这真是个让人纠结的问题
#42
我的电脑是Linux,而且不能装qq的。
#43
这样呀,那能不能帮我看看这个校验器的问题啊?这个也让我纠结了好久……我在下面的URL这里提了问
http://topic.csdn.net/u/20120510/12/4bbd924d-7f92-4b83-b2aa-b26be9421974.html
http://topic.csdn.net/u/20120510/12/4bbd924d-7f92-4b83-b2aa-b26be9421974.html
#44
校验器的问题已解决,原来是一路径配置错了
#45
我看的云山雾绕的,怎么回城了路径配置问题呢?
#46
是在配置ACTION的时候,CLASS的路径配置了哦,<action name="registValidate" class="bank.action.validate.LoginValidate">
我这里应该是registValidate了
#47
ok,解决了就好。
#48
java.sql.SQLException: No value specified for parameter 1
这个错也不清楚为什么也不报了,谢谢你这么给了这么多的帮助……