调用带输出的存储过程

问题描述:

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

我使用的代码是我用于注册用户的修改后的代码。它在我的代码的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中可能的例外,它给了我: 字符串[4]:Size属性为0

+0

什么是运行'ExecuteReader'当你的错误:

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

试试这个? – Jacob 2011-04-14 01:18:05

+0

有关字符串[4]的错误大小为0. – Raskaroth 2011-04-14 01:20:40

+1

您的字符串参数需要有一个长度。 – 2011-04-14 01:32:47

您提到的错误可能是由于您未指定参数VarChar的大小所致。而不是有这样的台词:

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

感谢您的帮助:)希望我自己看到了那个愚蠢的错误... – Raskaroth 2011-04-14 01:45:20

无效大小您需要创建一个SqlDataReader。

Ins and Outs of using Stored Procedures in C#

的SqlDataReader类是用来读取 记录 从数据库返回的只进流。所述 SqlDataReader对象不是 直接通过 构造(因此缺乏新 键字的),而是通过的SqlCommand 对象的 ExecuteReader方法实例化。在调用 ExecuteReader方法之前,连接到 的数据库是使用SqlConnection对象的 Open方法建立的。

尝试

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

我仍然得到相同的错误.. – Raskaroth 2011-04-14 01:34:15

+0

这根本不是问题,但无论如何,谢谢! – Raskaroth 2011-04-14 01:41:56

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

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

我的不好,但是将字符串[4]更改为字符串[3]错误:P – Raskaroth 2011-04-14 01:28:14