1

使用 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();
        }
    }
4

2 回答 2

5

ExecuteScalar()用于返回一行一列的查询。

要获取存储过程的返回值,请使用带方向的参数ReturnValue

sqlcomm.Parameters.Add("@retVal", SqlDbType.Int).Direction = 
    ParameterDirection.ReturnValue;
SQLCmd.ExecuteNonQuery();
var result = (int) sqlcomm.Parameters["@retVal"].Value;
于 2013-05-06T20:23:32.110 回答
1

尝试解开您的选择语句。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
于 2013-05-06T20:27:52.970 回答