Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 返回空值的存储过程_C#_Sql Server - Fatal编程技术网

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();