Java sqlserver存储过程与jdbc

Java sqlserver存储过程与jdbc,java,sql-server-2005,stored-procedures,jdbc,Java,Sql Server 2005,Stored Procedures,Jdbc,我正在努力使用SQLServer2005和JDBC。我有一个存储过程: set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER proc [dbo].[sp_logincheck] @username as nvarchar(50), @password as nvarchar(50) as begin select * from users where user_name = @username

我正在努力使用SQLServer2005和JDBC。我有一个存储过程:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER proc [dbo].[sp_logincheck]
    @username as nvarchar(50),
    @password as nvarchar(50)
as
begin
    select * 
    from users 
    where user_name = @username 
      and password = @password 
      and is_active = 'Yes'
end
我的
用户
课程是:

import java.sql.*;

public class User {
    private String username;

    private User(String username){
        this.username = username;
    }

    public static User login(String username, char [] password) throws SQLException{
        if(username == null || password == null){
            throw new IllegalArgumentException("Illegal arguments passed to method");
        }
        if(login1(username, password)){
            return new User(username);
        }
        return null;
    }

    private static boolean login1(String username, char [] password) throws SQLException{
        Connection connection = null;
        CallableStatement statement = null;
        try{
            connection = DriverManager.getConnection(AppParameters.dbURL, AppParameters.dbUsername, AppParameters.dbPassword);
        }catch(SQLException e){
            throw e;
        }
        try{
            statement = connection.prepareCall("{ ? = call dbo.sp_logincheck(?,?) }");
            statement.registerOutParameter(1, Types.INTEGER);
            statement.setString(2, username);
            statement.setString(3, new String(password));
            statement.execute();
            if(statement.getInt(1) == 1){
                System.out.println("Login Successfull");
                return true;
            }
            System.out.println("Login Failed");
            return false;
        }catch(SQLException sqle){
            sqle.printStackTrace();
            throw sqle;
        }finally{
            try{
                statement.close();
            }catch(Exception e){
            }
            try{
                connection.close();
            }catch(Exception e){
            }
        }
    }

    public  String getUsername(){
        return username;
    }
}
调用
login()
方法总是打印
登录失败
。如何在SQL Server中使用存储过程并使用JDBC执行用户登录?还是使用原始SQL语句更好?请在这方面指导我

编辑:


我还想知道如何从上述存储过程中获取
ResultSet
,因为我在存储过程中有一个
select
查询。

尝试将sql语句中的
select*from users…
更改为存储过程中的
select count(*)from users…

否则,表达式
if(statement.getInt(1)==1){
没有任何意义。

if statement.getInt(1) 语句.getInt(1)等于生成的行数或至少有一行。那么这可能是数据不匹配的情况。未找到数据请尝试以下操作:

ResultSet rs = statement.executeQuery();
if (! rs.isLast()) {
    // match
} else {
    // no match
}

另外,我建议只选择计数(
select count(*)作为……
)中的cnt,并使用类似
int count=rs.next().getInt(“cnt”);

我这样做了,但输出相同:(在更改存储过程后是否重新启动了应用程序?请添加
System.out.println(statement.getInt(1))
语句之后执行();
并显示它打印出来的内容。@Meraman您是否尝试过
ResultSet rs=statement.executeQuery();
rs.next()
-如果您有行,密码匹配。另外,我建议只选择计数,并使用类似
int count=rs.getInt(“计数”);
@Andremoniy语句。getInt(1)总是为有效或无效用户返回0。从该语句读取没有意义,他可以得到他为查询的第一个参数设置的值,即if为int。您甚至可以在调用查询之前执行该操作,这肯定不会包含任何结果。它正在工作..而不是使用if(!rs.isLast()),我用的是return rs.next();会好的,对吗?