代码如下 public boolean login(UserInfo user)throws Exception{
//用户登录
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语句里面的参数呢?
//用户登录
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语句里面的参数呢?
this.pst.setString(1, password);这样设置
我等下换个统一的来试 一下
不懂啊?API文档都不是这样只的吧~~~(刚查了下)
什麽類型?this.pst.setLong(1, userNo);
this.pst.setString(2, password);
userNo最好給成long再設置進來,逐句類型保持一致。不知道你數據庫是什麽類型?
172我是从页面取出来的userNO
172我是USER对象的userNo
172我是USER对象的password
java.sql.SQLException: Column '172' not found.
红色这个是什么情况呢?
改成如下
System.out.println(rs.getString("userNo")+"我是从数据库里取出来的");
java.sql.SQLException: No value specified for parameter 1这个问题应该怎么样啊?
你把你最新修改后的代码,用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;
}
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;
}
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=?"; 应该好用。
这个问题比较奇怪。
试了select * from……的方法,但报错一样,有没有什么方法来判断返回值为void的方法是否执行成功的呀,如设置个boolean变量,来判断this.pst.setString(1, userNo);这句是否执行成功的……
1、没有看到你完整代码,不好确定原因。
2、你这样试试。使用普通的Statement代替PreparedStatement,试试,看看是否依旧报错、
一样会报错哦~~
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)
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;
}
挺感谢你的,能提供这么多见解~~
1、我给你说这么多,是想确定是不是你建表的问题,也就是,是数据库的问题,跟程序没有关系。
2、你把你改后的完整代码贴一下,注意用csdn标准的插入源代码编辑,像26楼我发的这样的格式。把你的注释测试代码全部删除掉。
3、另外把你的表结构贴出来
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 | | | |
+-----------------+-------------+------+-----+---------+-------+
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都不允许为null6、
String no = rs.getString("userNo");
改为
String no = rs.getString(1);
1、确实是改了
2、这样有什么好处不?
3、果真如此,等下得查下这是为什么,嘿嘿
4、有啊,看下表结构的第一句| userNo | varchar(20) | NO | PRI | | |
5、of course
6、用它们都是可以取出值来哦“昨日凡阳”,能不能加QQ好友啊?多向你讨教一下哦,我的QQ441288971
我贴出,看一咯:
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
我的电脑是Linux,而且不能装qq的。
http://topic.csdn.net/u/20120510/12/4bbd924d-7f92-4b83-b2aa-b26be9421974.html
是在配置ACTION的时候,CLASS的路径配置了哦,<action name="registValidate" class="bank.action.validate.LoginValidate">
我这里应该是registValidate了
java.sql.SQLException: No value specified for parameter 1
这个错也不清楚为什么也不报了,谢谢你这么给了这么多的帮助……