C# 返回空值的存储过程
我有一个存储过程:C# 返回空值的存储过程,c#,sql-server,C#,Sql Server,我有一个存储过程: ALTER PROCEDURE usp_ins_usr_mst @USR_NAME VARCHAR(max), @USR_MAIL VARCHAR(max), @USR_CODE INT OUTPUT AS BEGIN SET NOCOUNT ON; IF NOT EXISTS (SELECT * FROM USR_MST WHERE [USR
ALTER PROCEDURE usp_ins_usr_mst
@USR_NAME VARCHAR(max),
@USR_MAIL VARCHAR(max),
@USR_CODE INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS (SELECT * FROM USR_MST WHERE [USR_mail] = @USR_MAIL )
BEGIN
INSERT INTO USR_MST([USR_NAME], USR_MAIL)
VALUES(@USR_NAME, @USR_MAIL);
END
SET @USR_CODE = (SELECT USR_CODE FROM USR_MST WHERE USR_MAIL = @USR_MAIL) ;
select @USR_CODE ;
END
C代码如下所示:
using (SqlConnection cn = new SqlConnection(cm.sqlCnnString))
{
cn.Open();
SqlCommand cmd = new SqlCommand("exec usp_ins_usr_mst @user, @email, @USR_CODE", cn);
cmd.Parameters.AddWithValue("@user", " ");
cmd.Parameters.AddWithValue("@email", HttpContext.Current.Session["uid"].ToString());
cmd.Parameters.Add("@USR_CODE", SqlDbType.Int);
cmd.Parameters["@USR_CODE"].Direction = ParameterDirection.Output;
cmd.CommandTimeout = 15000;
cmd.ExecuteNonQuery();
cn.Close();
HttpContext.Current.Session["USR_CODE"] = cmd.Parameters["@USR_CODE"].Value.ToString();
}
但是这个cmd.Parameters[@USR\u CODE].Value.ToString正在返回空字符串。。。我想不出我遗漏了什么地方。试着替换这个
SqlCommand cmd = new SqlCommand("exec usp_ins_usr_mst @user,@email,@USR_CODE", cn);
将此输出子句添加到exec
SqlCommand cmd = new SqlCommand("exec usp_ins_usr_mst @user,@email,@USR_CODE OUTPUT", cn);
首先,将您的过程更改为使用SCOPE_IDENTITY,而不是
ALTER PROCEDURE usp_ins_usr_mst
@USR_NAME VARCHAR(max),
@USR_MAIL VARCHAR(max),
@USR_CODE INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS (SELECT * FROM USR_MST WHERE [USR_mail] = @USR_MAIL )
BEGIN
INSERT INTO USR_MST([USR_NAME],USR_MAIL) VALUES(@USR_NAME,@USR_MAIL);
END
SELECT @USR_CODE = SCOPE_IDENTITY();
END
请尝试保持参数名称与过程中的相同。你犯了一个错误;您正试图在关闭连接后获取输出参数值,如下所示;而您应该在关闭连接之前获取它
cn.Close();
Session["USR_CODE"] = cmd.Parameters["@USR_CODE"].Value.ToString();
如下所示修改代码
SqlCommand cmd = new SqlCommand("dbo.usp_ins_usr_mst", cn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@USR_NAME", " ");
cmd.Parameters.AddWithValue("@USR_MAIL", Session["uid"].ToString());
cmd.Parameters.Add("@USR_CODE", SqlDbType.Int);
cmd.Parameters["@USR_CODE"].Direction = ParameterDirection.Output;
cmd.CommandTimeout = 15000;
cmd.ExecuteNonQuery();
Session["USR_CODE"] = cmd.Parameters["@USR_CODE"].Value.ToString();
cn.Close();
空字符串与空值不同。但是也许这会有帮助,USR_代码是一个身份栏吗?是的,它是身份栏column@Rahul我认为只有当CommandType=CommandType.StoredProcedure时,方向才有意义,但在我们的例子中使用了exec表达式,因此它必须满足存储过程执行规则。。。
SqlCommand cmd = new SqlCommand("dbo.usp_ins_usr_mst", cn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@USR_NAME", " ");
cmd.Parameters.AddWithValue("@USR_MAIL", Session["uid"].ToString());
cmd.Parameters.Add("@USR_CODE", SqlDbType.Int);
cmd.Parameters["@USR_CODE"].Direction = ParameterDirection.Output;
cmd.CommandTimeout = 15000;
cmd.ExecuteNonQuery();
Session["USR_CODE"] = cmd.Parameters["@USR_CODE"].Value.ToString();
cn.Close();