1

这是我的程序:如何从存储过程获得Windows窗体C#返回值

DECLARE @ReturnValue int 

SELECT @ReturnValue = idUser 
FROM Users 
WHERE Alias = @UserAlias AND Password = @UserPassword 

RETURN @ReturnValue 

这是我的C#代码,我倒是希望我可以检索的程序价值:

TeamPWSecureBD.Open(); //Open SQL Connection 

string alias = textBoxUsernameLogin.Text.Trim(); 
string pass = textBoxPasswordLogin.Text; 

SqlCommand LoginVerify = new SqlCommand("_spUserVerify", TeamPWSecureBD); 
LoginVerify.CommandType = CommandType.StoredProcedure; 

LoginVerify.Parameters.AddWithValue("@UserAlias", alias); 
LoginVerify.Parameters.AddWithValue("@UserPassword", pass); 

SqlDataReader UserVerify = LoginVerify.ExecuteReader(); 

//Se o valor retornado pelo sp for 0 significa que o user não existe. 
//O sp retorna o id do utilizador se o username e a password estiverem corretas. 
//O id de utilizador menor é o 7. 
if (Convert.ToInt32(UserVerify.GetSqlValue(0)) == 0) 
    MessageBox.Show("Invalid username/password.", "Login Failed", MessageBoxButtons.OK, MessageBoxIcon.Error); 
else 
{ 
    GlobalVariables.UserLoggedIn = Convert.ToInt32(UserVerify.GetSqlValue(0)); 
    PWLists MainForm = new PWLists(); 
    MainForm.ShowDialog(); 
    this.Close(); 
} 

当我在SQL Server中执行过程时,返回的值是正确的。

但是,一旦我尝试在它与错误崩溃的形式来阅读:如果你想赶上

RETURN @ReturnValue 

回答

0

invalid attempt to read when no data is present

+0

它工作得很好,感谢您的时间! – walkman

1

尝试:

SELECT @ReturnValue 

代替您存储的句柄执行的RETURN语句的值需要向SqlCommand添加另一个参数

SqlParameter r = LoginVerify.Parameters.Add("@return", SqlDbType.Int); 
r.Direction = ParameterDirection.ReturnValue; 
r.Value = 0; 
SqlDataReader UserVerify = LoginVerify.ExecuteReader(); 

// Now you need to complete the reading from the UserVerify reader and 
// finally you can catch the return value 
..... 

UserVerify.Close(); 
int result = (int)r.Value; 

然而,鉴于你的StoredProcedure的代码,我想你可以简单地避免声明另一个参数,也是因为SqlDataReader的你似乎有一个字段只返回一行。为的ExecuteScalar的确切范围......

SP现在只是一个选择

SELECT idUser FROM Users 
WHERE Alias = @UserAlias AND Password = @UserPassword 

和代码检索idUser

object result = LoginVerify.ExecuteScalar(); 

if (result == null) 
    MessageBox.Show("Invalid username/password.", "Login Failed", MessageBoxButtons.OK, MessageBoxIcon.Error); 
else 
{ 
    GlobalVariables.UserLoggedIn = Convert.ToInt32(result); 
    PWLists MainForm = new PWLists(); 
    MainForm.ShowDialog(); 
    this.Close(); 
}