Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.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# 此SqlParameterCollection函数不包含参数名为“@name”的SqlParameter_C#_Sql Server 2008 - Fatal编程技术网

C# 此SqlParameterCollection函数不包含参数名为“@name”的SqlParameter

C# 此SqlParameterCollection函数不包含参数名为“@name”的SqlParameter,c#,sql-server-2008,C#,Sql Server 2008,我试图从下面的代码中返回一个值,但得到一个错误,该错误表示: 此SqlParameterCollection不包含参数名为“@vRESULT”的SqlParameter c代码: public int userLogin() { string connStr = ConfigurationManager.ConnectionStrings["conn"].ToString(); string cmdStr = @"fucn_LOg"; using (SqlConnect

我试图从下面的代码中返回一个值,但得到一个错误,该错误表示:

此SqlParameterCollection不包含参数名为“@vRESULT”的SqlParameter

c代码:

public int userLogin()
{
    string connStr = ConfigurationManager.ConnectionStrings["conn"].ToString();
    string cmdStr = @"fucn_LOg";

    using (SqlConnection conn = new SqlConnection(connStr))
    using (SqlCommand cmd = new SqlCommand(cmdStr, conn))
    {
        try
        {
            conn.Open();
            cmd.CommandText = cmdStr;
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Clear();

            cmd.Parameters[":vResult"].Direction = ParameterDirection.Output;

            cmd.Parameters.Add(new SqlParameter("param1", SqlDbType.VarChar)).Value = TB_1.Text;
            cmd.Parameters.Add(new SqlParameter("param2", SqlDbType.VarChar)).Value = TB_2.Text;

            cmd.ExecuteScalar();

            return Int32.Parse(cmd.Parameters[":vResult"].Value.ToString());
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
            return -1;
        }
    }
}
下面的sql server函数代码返回参数DECLARE@vResult int


如果没有SP,这很难进行调试,但会出现一些问题

首先,您需要使用“@”字符作为参数名称的前缀,而不是冒号

其次,您应该如下定义输出参数:

SqlParameter outputParam = new SqlParameter("@vResult", SqlDbType.Int);
outputParam.Direction = ParameterDirection.Output;
cmd.Parameters.Add(outputParam);
var result = cmd.ExecuteScalar();
return Int32.Parse(result.ToString());
有几个问题

首先,您不需要cmd.Parameters.Clear;,因为你刚刚建立了一个新的cmd

第二,对SQL Server参数使用@

第三,未设置名为vResult的参数,因此cmd.Parameters[:vResult].Direction无效。您需要指定其类型和值。确保存储过程将此参数设置为正确的SQL数据类型

最后,我想您应该在存储过程中返回vResult,比如select@vResult;因此,将其设为一个新的vResult=函数vResult。但不,这不是SQL Server的工作方式。即使返回@vResult,它也不会更改您的输入参数。而ExecuteScaler则会。因此,只需通过var result=cmd.ExecuteScalar;返回结果即可

您是从存储过程中获取数据,而不是返回发送的参数。这应该是正确的方法

conn.Open();
cmd.CommandText = cmdStr;
cmd.CommandType = CommandType.StoredProcedure;

//Base on sql you provided, it is no need for this part.
/*
SqlParameter vResult = new SqlParameter();
vResult.ParameterName = "@vResult";
vResult.Direction = ParameterDirection.Output;
vResult.SqlDbType = System.Data.SqlDbType.???;
vResult.Value = ???;
cmd.Parameters.Add(vResult);
*/
cmd.Parameters.Add("@param1", SqlDbType.VarChar).Value = TB_1.Text;
cmd.Parameters.Add("@param2", SqlDbType.VarChar).Value = TB_2.Text;

var result = cmd.ExecuteScalar();

return Int32.Parse(result.ToString());

只需按照如下步骤从Stroed过程中获取结果:

SqlParameter outputParam = new SqlParameter("@vResult", SqlDbType.Int);
outputParam.Direction = ParameterDirection.Output;
cmd.Parameters.Add(outputParam);
var result = cmd.ExecuteScalar();
return Int32.Parse(result.ToString());
这将从存储过程中获取第一个也是唯一一个结果

还建议您简化代码,如下所示:

public int userLogin() {
    string connStr = ConfigurationManager.ConnectionStrings["conn"].ToString();

    using (SqlConnection conn = new SqlConnection(connStr))
    using (SqlCommand cmd = new SqlCommand("fucn_LOg", conn)) {
        try {
            cmd.Connection.Open();
            cmd.CommandType = System.Data.CommandType.StoredProcedure;

            cmd.Parameters.AddWithValue("@param1", TB_1.Text);
            cmd.Parameters.AddWithValue("@param2", TB_2.Text);

            var result = cmd.ExecuteScalar();
            return Int32.Parse(result.ToString());
        }
        catch (Exception ex) {
            MessageBox.Show(ex.ToString());
            return -1;
        }
        finally {
            if (cmd.Connection.State != ConnectionState.Closed) cmd.Connection.Close();
        }
    }
}
CREATE PROCEDURE fucn_LOg 
(
    @param1         nvarchar(max),
    @param2         nvarchar(max)
)
AS
BEGIN
    SET NOCOUNT ON;

    if (exists(select * from tbUsers where flLogin = @param1 and flPassword = @param2))
    begin
        return 1;
    end
    else
    begin
        return 0;
    end
END
GO
您的存储过程应该如下所示:

public int userLogin() {
    string connStr = ConfigurationManager.ConnectionStrings["conn"].ToString();

    using (SqlConnection conn = new SqlConnection(connStr))
    using (SqlCommand cmd = new SqlCommand("fucn_LOg", conn)) {
        try {
            cmd.Connection.Open();
            cmd.CommandType = System.Data.CommandType.StoredProcedure;

            cmd.Parameters.AddWithValue("@param1", TB_1.Text);
            cmd.Parameters.AddWithValue("@param2", TB_2.Text);

            var result = cmd.ExecuteScalar();
            return Int32.Parse(result.ToString());
        }
        catch (Exception ex) {
            MessageBox.Show(ex.ToString());
            return -1;
        }
        finally {
            if (cmd.Connection.State != ConnectionState.Closed) cmd.Connection.Close();
        }
    }
}
CREATE PROCEDURE fucn_LOg 
(
    @param1         nvarchar(max),
    @param2         nvarchar(max)
)
AS
BEGIN
    SET NOCOUNT ON;

    if (exists(select * from tbUsers where flLogin = @param1 and flPassword = @param2))
    begin
        return 1;
    end
    else
    begin
        return 0;
    end
END
GO


您不能设置任何名为:vResult的参数。您如何分配方向?@Matrixta请您向我进一步解释告诉我们fucn_LOg存储过程的参数。您现在更改了问题中的代码,使其与标题中的错误消息不匹配。由于已有基于前面的答案,请不要这样做。如果没有答案,那也没关系,但是你应该确保你的问题仍然是一致的。我在oracle中使用这种方式,所以我从oracle函数中获取返回值。如果我错了,请更正我SqlParameter vResult=new SqlParameter;相当于cmd.Parameters.Clear;但是它清除了所有参数,不仅仅是返回的参数@vResult,我修改了我的代码,更新了我的问题,并添加了sql server函数。。。谢谢您的帮助,请等待您的回复comments@sam,当您编写SqlCommand cmd=new SqlCommandcmdStr,conn时,您将启动一个在容器参数中没有SqlParameter的SqlCommand。所以你根本没有理由要清除它。正如您所展示的sql部分,您不需要向其中传递任何@vResult,因为它是在sql中创建的。嗯,谢谢,我将使用该代码重试。。。因为我熟悉oracle代码,所以认为它们真的完全不同