将 BIT 值传递给 sql 服务器存储过程

Passing a BIT value to a sql server stored procedure

我有一个存储过程:

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

如何传递 BIT 参数?

尝试改变这个:

    returnValue.Direction = ParameterDirection.Output;

对此:

    returnValue.Direction = ParameterDirection.ReturnValue;

好的,如果@retVal不是整数,那么你不能使用ParameterDirection.ReturnValue。保留 SELECT @retVal,但将 cmd.ExecuteNonQuery() 更改为 var result = Convert.ToString(cmd.ExecuteScalar());,并且不要在 C# 中定义 @retVal 参数。

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

你需要这样的东西:

CREATE PROCEDURE myproc(@a nvarchar(50), @b nvarchar(100), @c bit, @retVal NVARCHAR([LEN]) OUTPUT)
AS...

...其中 [LEN] 是您需要的任何值,我怀疑它是 9,999,999,但如果您愿意,可以使用 MAX。

然后将 [YOUR RESULT] 存储在你闪亮的新输出参数中:

SELECT @retVal = [YOUR RESULT]

...此时我相信您的 C# 代码会正确运行。

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

这是一个 return 值

的 sp
CREATE PROCEDURE x AS
BEGIN
  return 1
END

您必须通过添加方向为 ReturnValue 和类型为 int 的参数(它只能是一个 int),并在您 ExecuteNonQuery

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


这是一个有输出参数的sp

CREATE PROCEDURE x
    @y INT OUTPUT
AS BEGIN
  SET @y = 1
END

您必须在 c# 中通过添加名称为 @y 和方向为 Output 的参数来获取 1,并在 ExecuteNonQuery 之后读取参数值。如果您也使用参数作为输入,请将方向声明为 InputOutput


这是一个return结果集

的sp
CREATE PROCEDURE x
AS BEGIN
  SELECT 1 AS y
END

您必须通过 ExecuteScalarExecuteReader

获得 1

ExecuteScalar returns 结果集左上角的单元格;这个例子很好。如果您计划 return 设置更多的行和列,而不仅仅是一个值,请使用 ExecuteReader


听起来你把事情搞混了;决定您的 sp 如何 return 它的值并相应地对 c# 进行编码。

您可以混合搭配这些,并拥有一个具有输出参数、return 值并选择结果集的存储过程,但您应该清楚 c# 的哪些位从哪些位收集哪些数据存储过程