gpt4 book ai didi

c# - 调用带输出的存储过程

转载 作者:太空狗 更新时间:2023-10-30 00:57:17 24 4
gpt4 key购买 nike

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

我使用的代码是我用来注册用户的修改版。我的代码的 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

最佳答案

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

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

试试这个:

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

关于c# - 调用带输出的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5657404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com