Java sqlserver存储过程与jdbc
我正在努力使用SQLServer2005和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
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();会好的,对吗?