使用输出调用存储过程

时间:2011-04-14 00:53:03

标签: c# sql-server stored-procedures

我一直在尝试从我的数据库中检索一些信息,并检索返回值。我知道存储过程工作正常。

我使用的代码是我用来注册用户的修改过的部分。我的代码的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();
                }

            }
        }
    }
}

当我只想接收返回值时,我只使用cmd.ExecuteScalar();我知道如何在将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中可能的异常时,它给了我: String [4]:Size属性的大小无效0

3 个答案:

答案 0 :(得分:6)

您提到的错误可能是由于您没有指定VarChar参数的大小。而不是像这样的行:

SqlParameter nikParam = cmd.Parameters.Add("@memb_name", SqlDbType.VarChar);

试试这个:

SqlParameter nikParam = cmd.Parameters.Add("@memb_name", SqlDbType.VarChar, 15);

答案 1 :(得分:0)

您需要创建一个SqlDataReader。

来自Ins and Outs of using Stored Procedures in C#

  

SqlDataReader类用于   读取仅向前的记录流   从数据库返回。该   SqlDataReader对象不是   通过直接实例化   构造函数(因此缺少新的   关键词)而是通过   SqlCommand的ExecuteReader方法   宾语。在打电话之前   ExecuteReader方法连接到   数据库是使用   打开SqlConnection的方法   对象

尝试

SqlDataReader drLogins;
Conn.Open();
drLogins = cmd.ExecuteReader();

答案 2 :(得分:0)

您的@ac_status在参数中定义为整数。改变它的字符或字符串。

SqlParameter acsParam = cmd.Parameters.Add("@ac_status", SqlDbType.Int);