调用输出的存储过程

| 我一直在尝试从数据库中检索一些信息,并且还检索返回值。我知道存储过程可以正常工作。 我使用的代码是修改后的代码,用于注册用户。我的代码的cmd.ExecuteReader部分出了问题。
protected void btn_login_Click(object sender, ImageClickEventArgs e)
{
    //Actions after Submit button is clicked
    Page.Validate(((ImageButton)sender).ValidationGroup);

    if (Page.IsValid)
    {
        using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings[\"DbConnectString\"].ConnectionString))
        {
            SqlCommand cmd = new SqlCommand(\"usp_validateUsers\", conn);
            //Input Values
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue(\"username\", Uname.Text);
            cmd.Parameters.AddWithValue(\"password\", pwd.Text);
            //Return Values
            SqlParameter retParam = cmd.Parameters.Add(\"@RetVal\", SqlDbType.Int);
            retParam.Direction = ParameterDirection.ReturnValue;
            SqlParameter acsParam = cmd.Parameters.Add(\"@ac_status\", SqlDbType.Int);
            acsParam.Direction = ParameterDirection.Output;
            SqlParameter nikParam = cmd.Parameters.Add(\"@memb_name\", SqlDbType.VarChar);
            nikParam.Direction = ParameterDirection.Output;

            try
            {
                // Open Connection and execute Stored Proc
                conn.Open();
                ///////////SOMETHING GOES WRONG HERE///////////////
                cmd.ExecuteReader();

                //Retrieve Data
                int retVal = (int)retParam.Value;
                string nickname = nikParam.Value.ToString();
                string ac_stats = acsParam.Value.ToString();

                if (retVal != 0)
                {
                    //Invalid Username or password
                }
                else
                {
                    //Login User
                }
            }

            catch (Exception Error)
            {
                lbl_login.Text = \"An error occured, please try again later\";
                debug.Text = Error.Message;
            }

            finally
            {
                debug.Text = \"\\n Clossing Connection\";
                if (conn.State == System.Data.ConnectionState.Open)
                {
                    conn.Close();
                }

            }
        }
    }
}
当我只想接收返回值时,我仅使用ѭ1,我知道将SQL查询传递到SQL数据库时如何接收数据,但是使用存储过程时似乎有所不同。 编辑 可能可以进一步改善此代码,但它确实做了应做的事情。
ALTER PROCEDURE dbo.usp_validateUsers

@username varchar(10),
@password varchar(10),
@ac_status char(1) OUTPUT,
@memb_name varchar(15) OUTPUT

AS
IF EXISTS(SELECT * FROM MEMB_INFO WHERE (memb___id = @username))
BEGIN
    SELECT @ac_status = ac_status, @memb_name = memb_name
    FROM MEMB_INFO
    WHERE (memb___id = @username) AND (memb__pwd = @password)
    RETURN 0
END

ELSE
BEGIN
    return 1
END
当我使用断点捕获Visual Studio中的可能异常时,它给了我: 字符串[4]:Size属性的大小无效为0     
已邀请:
您提到的错误可能是由于您未指定
VarChar
参数的大小而引起的。而不是像这样的行:
SqlParameter nikParam = cmd.Parameters.Add(\"@memb_name\", SqlDbType.VarChar);
尝试这个:
SqlParameter nikParam = cmd.Parameters.Add(\"@memb_name\", SqlDbType.VarChar, 15);
    
您需要创建一个SqlDataReader。 在C#中使用存储过程的来龙去脉   SqlDataReader类用于   读取仅向前的记录流   从数据库返回。的   SqlDataReader对象不是   通过一个实例直接实例化   构造函数(因此缺少New   关键字),而是通过   SqlCommand的ExecuteReader方法   宾语。致电之前   ExecuteReader方法连接到   该数据库是使用   SqlConnection的打开方法   宾语。 尝试
SqlDataReader drLogins;
Conn.Open();
drLogins = cmd.ExecuteReader();
    
您的“ 7”在参数中定义为整数。更改它的字符或字符串。
SqlParameter acsParam = cmd.Parameters.Add(\"@ac_status\", SqlDbType.Int);
    

要回复问题请先登录注册