C# 向sql server存储过程传递位值

C# 向sql server存储过程传递位值,c#,sql-server,sql-server-2012,C#,Sql Server,Sql Server 2012,我有一个存储过程: CREATE PROCEDURE myproc(@a nvarchar(50), @b nvarchar(100), @c bit) AS ... SELECT @retVal; 我有以下aspx代码: SqlCommand cmd = new SqlCommand("myproc", conn); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@a", a);

我有一个存储过程:

CREATE PROCEDURE myproc(@a nvarchar(50), @b nvarchar(100), @c bit)
AS ...

   SELECT @retVal;
我有以下aspx代码:

SqlCommand cmd = new SqlCommand("myproc", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@a", a);
cmd.Parameters.AddWithValue("@b", b);
cmd.Parameters.Add("@c", SqlDbType.Bit).Value = false;

SqlParameter returnValue = new SqlParameter("@retVal", SqlDbType.NVarChar, 9999999);
returnValue.Direction = ParameterDirection.Output;
cmd.Parameters.Add(returnValue);
conn.Open();
cmd.ExecuteNonQuery();
retVal = (string)cmd.Parameters["@retVal"].Value;   
conn.Close();
这给了我一个错误:

Procedure or function myproc has too many arguments specified.
如果我删除该行:

cmd.Parameters.Add("@c", SqlDbType.Bit).Value = false;
我得到这个错误:

Procedure or function 'myproc' expects parameter '@c', which was not supplied
我在这一行尝试了以下替代方案:

cmd.Parameters.AddWithValue("@c", 0);
cmd.Parameters.AddWithValue("@c", false);
如何传递该位参数?

尝试更改此设置:

    returnValue.Direction = ParameterDirection.Output;
为此:

    returnValue.Direction = ParameterDirection.ReturnValue;

好的,如果@retVal不是整数,那么就不能使用ParameterDirection.ReturnValue。继续选择@retVal,但将cmd.ExecuteNonQuery更改为var result=Convert.ToStringcmd.ExecuteScalar;并且也不要在C中定义@retVal参数。

您的存储过程没有定义输出参数@c不是你的问题,问题是@retVal

你需要这样的东西:

CREATE PROCEDURE myproc(@a nvarchar(50), @b nvarchar(100), @c bit, @retVal NVARCHAR([LEN]) OUTPUT)
AS...
…如果[LEN]是您所需要的,我怀疑它是9999999,但如果您愿意,您可以使用MAX

然后将[结果]存储在新的输出参数中:

SELECT @retVal = [YOUR RESULT]

…在这一点上,我相信您的C代码将正确运行。

我介绍了从过程中获取数据的3种方法:

CREATE PROCEDURE myproc(@a nvarchar(50), @b nvarchar(100), @c bit)
AS ...

   SELECT @retVal;
这是一个返回值的sp 您必须在c中添加一个带有direction ReturnValue的参数并键入int,然后在ExecuteOnQuery之后读取参数.Value,从而获得1

通常,我们使用returnvalue来指示操作的状态,而不是表中的某些数据。例如,AddUser proc返回0表示成功,1表示失败,因为用户存在,2表示失败,因为密码太弱等等,我们不会使用returnvalue返回新添加用户的userid

这是一个具有输出参数的sp 您必须在c中通过添加名为@y和direction Output的参数来获得1,并在执行ExecuteOnQuery后读取参数值。如果您也将参数用于输入,请将方向声明为InputOutput

这是一个返回结果集的sp 你必须通过做ExecuteScalar或ExecuteReader得到1

ExecuteScalar返回结果集的左上角单元格;这个例子很好。如果计划返回的行和列多于单个值,请使用ExecuteReader

听起来你把事情搞混了;决定sp将如何返回其值,并相应地对c进行编码


您可以混合和匹配这些数据,并拥有一个存储过程,该存储过程具有一个输出参数、一个返回值并选择一个结果集,但您应该清楚c的哪些位收集哪些数据,存储过程的哪些位不定义输出参数@c不是你的问题,问题是@retVal。我该怎么做?我在程序末尾有一个SELECT@retVal我假设您的@retVal被声明为@retVal[Data_Type]输出?在您的spDECLARE@retVal nvarcharmax中;存储过程只能返回int。在SP中选择某个内容与返回值不同,您需要为其赋值,而不是选择it@HansKesting是的,我写这篇文章时没有任何附加的SP代码……这个答案可能会让事情变得更糟confusing@CaiusJard我的生活故事。
CREATE PROCEDURE x
    @y INT OUTPUT
AS BEGIN
  SET @y = 1
END
CREATE PROCEDURE x
AS BEGIN
  SELECT 1 AS y
END