C# 此SqlParameterCollection函数不包含参数名为“@name”的SqlParameter
我试图从下面的代码中返回一个值,但得到一个错误,该错误表示: 此SqlParameterCollection不包含参数名为“@vRESULT”的SqlParameter c代码: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
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代码,所以认为它们真的完全不同