代码如下 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语句里面的参数呢?

解决方案 »

  1.   

    userNo 实体类中的类型是什么、和数据库的一致么、
      

  2.   

    this.pst.setLong(0, userNo);
    this.pst.setString(1, password);这样设置
      

  3.   

    不是,数据库里的是bigint类型哦……这样有问题不?
    我等下换个统一的来试 一下
      

  4.   


    不懂啊?API文档都不是这样只的吧~~~(刚查了下)
      

  5.   

    确定好了Userno到底是什么类型的,设置参数就是从1开始的
      

  6.   

    數據庫中,userNO
    什麽類型?this.pst.setLong(1, userNo);
    this.pst.setString(2, password);
    userNo最好給成long再設置進來,逐句類型保持一致。不知道你數據庫是什麽類型?
      

  7.   

    用的是MYSQL ,类型是bigint,正要统一一下呢,刚打球赛去了,洗个澡( ⊙ o ⊙ )
      

  8.   

    补充下哈,当我输入的是数据库里面的内容 的时候:控制台显示有下
    172我是从页面取出来的userNO
    172我是USER对象的userNo
    172我是USER对象的password
    java.sql.SQLException: Column '172' not found.
    红色这个是什么情况呢?
      

  9.   

    System.out.println(rs.getString(userNo)+"我是从数据库里取出来的");这个不对。
    改成如下
    System.out.println(rs.getString("userNo")+"我是从数据库里取出来的");
      

  10.   

    确实应该如此呀……
    java.sql.SQLException: No value specified for parameter 1这个问题应该怎么样啊?
      

  11.   


    你把你最新修改后的代码,用csdn标准的代码输出格式发出来,我再给你看。
      

  12.   

    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;
    }
      

  13.   

    参考下面的格式。我已经修改了部分。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;
    }
      

  14.   


    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=?"; 应该好用。
    这个问题比较奇怪。
      

  15.   


    试了select * from……的方法,但报错一样,有没有什么方法来判断返回值为void的方法是否执行成功的呀,如设置个boolean变量,来判断this.pst.setString(1, userNo);这句是否执行成功的……
      

  16.   


    1、没有看到你完整代码,不好确定原因。
    2、你这样试试。使用普通的Statement代替PreparedStatement,试试,看看是否依旧报错、
      

  17.   


    一样会报错哦~~
    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)
      

  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;
        }上面这段代码你劝改了,改成直接获取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;
        }
      

  19.   

    26楼,还是报这样的错哦java.sql.SQLException: No value specified for parameter 1但是这你说的这样,和报这个错有什么关联不?
    挺感谢你的,能提供这么多见解~~
      

  20.   


    1、我给你说这么多,是想确定是不是你建表的问题,也就是,是数据库的问题,跟程序没有关系。
    2、你把你改后的完整代码贴一下,注意用csdn标准的插入源代码编辑,像26楼我发的这样的格式。把你的注释测试代码全部删除掉。
    3、另外把你的表结构贴出来
      

  21.   


    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   |     |         |       |
    +-----------------+-------------+------+-----+---------+-------+
      

  22.   

    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都不允许为null6、
    String no = rs.getString("userNo");
    改为
    String no = rs.getString(1);
      

  23.   

    回答:
    1、确实是改了
    2、这样有什么好处不?
    3、果真如此,等下得查下这是为什么,嘿嘿
    4、有啊,看下表结构的第一句| userNo | varchar(20) | NO | PRI | | |
    5、of course
    6、用它们都是可以取出值来哦“昨日凡阳”,能不能加QQ好友啊?多向你讨教一下哦,我的QQ441288971
      

  24.   

    是重装过MYSQL之后的默认的端口的
      

  25.   

    这个我也不是很清楚,和这有关系么?
    我贴出,看一咯:
    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
      

  26.   


    我的电脑是Linux,而且不能装qq的。
      

  27.   

    这样呀,那能不能帮我看看这个校验器的问题啊?这个也让我纠结了好久……我在下面的URL这里提了问
    http://topic.csdn.net/u/20120510/12/4bbd924d-7f92-4b83-b2aa-b26be9421974.html
      

  28.   


    是在配置ACTION的时候,CLASS的路径配置了哦,<action name="registValidate" class="bank.action.validate.LoginValidate">
    我这里应该是registValidate了
      

  29.   


    java.sql.SQLException: No value specified for parameter 1
    这个错也不清楚为什么也不报了,谢谢你这么给了这么多的帮助……