调用带输出的存储过程
我一直在尝试从我的数据库中检索一些信息,并检索返回值。我知道存储过程正常工作。调用带输出的存储过程
我使用的代码是我用于注册用户的修改后的代码。它在我的代码的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
您提到的错误可能是由于您未指定参数VarChar
的大小所致。而不是有这样的台词:
SqlParameter nikParam = cmd.Parameters.Add("@memb_name", SqlDbType.VarChar, 15);
感谢您的帮助:)希望我自己看到了那个愚蠢的错误... – 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();
你@ac_status
被定义为参数整数。改变它的字符或字符串。
SqlParameter acsParam = cmd.Parameters.Add("@ac_status", SqlDbType.Int);
我的不好,但是将字符串[4]更改为字符串[3]错误:P – Raskaroth 2011-04-14 01:28:14
什么是运行'ExecuteReader'当你的错误:
试试这个? – Jacob 2011-04-14 01:18:05
有关字符串[4]的错误大小为0. – Raskaroth 2011-04-14 01:20:40
您的字符串参数需要有一个长度。 – 2011-04-14 01:32:47