使用asp.net,C#,SQL Server 2008。
场景:用户尝试登录Web应用。应用程序根据列表检查用户名以获取UserID
。
如果此用户是已知用户,则页面打开正常。如果用户不是已知用户,则应该打开到页面,并通知联系管理员。
我无法编写SQL存储过程,因此它将返回值0(或其他任何内容),因此可用于触发控件。我已经将SQL作为测试执行了,它可以工作;但是每次在asp方面都会出错。
非常感谢任何和所有的帮助!
SQL Server存储过程代码:
ALTER PROCEDURE [dbo].[spGetUserID]
-- Add the parameters for the stored procedure here
(@Username as varchar(64))
AS
BEGIN
SET NOCOUNT ON;
DECLARE @X INT
SET @X = (SELECT COUNT(*) FROM Users WHERE (Username = @Username))
If @X > 0
RETURN
(SELECT UID FROM Users WHERE (UserName = @Username))
ELSE
RETURN 99999 --IVE ALSO TRIED USING 0 HERE.
END
ASP.NET存储过程调用
public int GetUserID(string Username)
{
try
{
SQLCON = new SqlConnection(connectionString);
SQLCON.Open();
SQLCmd = new SqlCommand("spGetUserID", SQLCON);
SQLCmd.CommandType = CommandType.StoredProcedure;
SQLCmd.Parameters.Add("@username", SqlDbType.VarChar).Value = Username;
int userID = (Int32)SQLCmd.ExecuteScalar();
return userID; //THIS ALWAYS JUMPS TO EXCEPTION
}
catch
{
return 0;
}
finally
{
SQLCON.Close();
}
}
答案 0 :(得分:5)
ExecuteScalar()
适用于返回一行一列的查询。
要获取存储过程的返回值,请使用方向为ReturnValue
的参数:
sqlcomm.Parameters.Add("@retVal", SqlDbType.Int).Direction =
ParameterDirection.ReturnValue;
SQLCmd.ExecuteNonQuery();
var result = (int) sqlcomm.Parameters["@retVal"].Value;
答案 1 :(得分:1)
尝试展开您的select语句。 ExecuteScalar命令检索结果集中第一行的第一列,如果结果集为空,则检索空引用。您的存储过程实际上不会返回结果集。尝试...
ALTER PROCEDURE [dbo].[spGetUserID]
-- Add the parameters for the stored procedure here
(@Username as varchar(64))
AS
BEGIN
If Exists(SELECT 1 FROM Users WHERE (Username = @Username))
SELECT UID FROM Users WHERE (UserName = @Username)
ELSE
SELECT 99999
END