2012-01-22 47 views
3

我有一个验证的登录过程或函数“ValidateUserLogin”需要参数“@UserName”,但未提供

ALTER PROCEDURE ValidateUserLogin 
(
@UserName varchar (50), 
@Password varchar (50) 
) 
AS 
BEGIN 
if EXISTS(SELECT * FROM AdminLogin WHERE [email protected] AND [email protected]) 
select 0/*returns 0 on success*/ 
ELSE 
select 1/*non zero otherwise*/ 

END 

,我使用下面的代码调用它,但我得到下面的异常此存储过程“过程或函数'ValidateUserLogin'期望参数'@UserName',它没有提供。”

bool boolReturnValue = true; 

    SqlCommand command = new SqlCommand(); 
    command.Connection = sqlConnection; 
    command.CommandType = CommandType.StoredProcedure; 
    command.CommandText = "ValidateUserLogin"; 
    command.Parameters.Add(@username,SqlDbType.VarChar,50).Value=username; 
    command.Parameters.Add(@password, SqlDbType.VarChar,50).Value=password; 
    sqlConnection.Open(); 
    try 
    { 
    command.ExecuteScalar(); 
     boolReturnValue=Convert.ToBoolean(command.ExecuteScalar()); 
    } 
    catch (Exception ex) 
    { 
     Response.Write(ex.Message); 
    } 

,当我尝试了为空我得到的用户名和密码设置的默认值例外 @admin不是程序ValidateUserLogin //管理参数是为用户名

回答

3

更改以下两行:

command.Parameters.Add(@username,SqlDbType.VarChar,50).Value=username; 
command.Parameters.Add(@password, SqlDbType.VarChar,50).Value=password; 

有:

command.Parameters.Add("@Username",SqlDbType.VarChar,50).Value=username; 
command.Parameters.Add("@Password", SqlDbType.VarChar,50).Value=password; 
+0

您是否建议SQL存储过程是区分大小写?我认为不是 – Mubarek

+2

@nuux - 这取决于数据库的默认排序规则。大多数人没有CS排序规则。但是第一个版本缺乏引号肯定会引起一个问题,因为它会尝试提交以变量的值为准的名字命名的参数。这应该有''@UserName“'来解决这两个可能的问题。 –

+0

@马丁史密斯 - 对不起,我注意到了这个问题。什么时候可以有人拥有CS排序规则 – Mubarek

2

值您需要将您的参数名称放入Add方法的引号中。换句话说,用引号“@username”。

+2

+1没有引号,它不是一个字符串,只是引用了变量'username'(可选地允许'@'前缀允许保留字作为变量名IIRC) –

1

如果你的数据库的情况下比参数敏感有大小写

command.Parameters.Add(@username,SqlDbType.VarChar,50).Value=username; 

应该有@UserName参数以符合程序的情况。

当然也适用于密码。

+0

这是非常有用的,它实际上解决了我的问题..我一直认为@变量是我的变量的参考.Thanx很多 – smrpm

相关问题