【问题标题】:Passing a BIT value to a sql server stored procedure将 BIT 值传递给 sql server 存储过程
【发布时间】:2020-03-25 16:29:10
【问题描述】:

我有一个存储过程:

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 参数?

【问题讨论】:

  • 您的存储过程没有定义输出参数。 @c 不是你的问题,问题是 @retVal
  • 我该怎么做?我在程序结束时有一个 SELECT @retVal
  • 我假设您的@retVal 被声明为@retVal [Data_Type] OUTPUT?在你的 sp
  • 声明 @retVal nvarchar(max);
  • 存储过程只能返回一个 int。在 SP 中选择某物与返回值不同

标签: c# sql-server sql-server-2012


【解决方案1】:

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

这是一个返回值的sp

CREATE PROCEDURE x AS
BEGIN
  return 1
END

你必须在你的c#中通过添加一个方向为ReturnValue的参数并输入int(它只能是一个int),并在你ExecuteNonQuery之后读取参数.Value来获得那个1

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


这是一个有输出参数的sp

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

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


这是一个返回结果集的 sp

CREATE PROCEDURE x
AS BEGIN
  SELECT 1 AS y
END

你必须通过 ExecuteScalarExecuteReader 得到那个 1

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


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

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

【讨论】:

    【解决方案2】:

    您的存储过程没有定义输出参数。 @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# 代码会正常运行。

    【讨论】:

    • 你需要给它赋值,而不是“选择”它
    • @HansKesting 是的,我写这篇文章时没有任何额外的 SP 代码......
    • 这个答案可能会让事情变得更加混乱
    • @CaiusJard 我的人生故事。
    【解决方案3】:

    尝试改变这一点:

        returnValue.Direction = ParameterDirection.Output;
    

    到这里:

        returnValue.Direction = ParameterDirection.ReturnValue;
    

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

    【讨论】:

      猜你喜欢
      • 2015-08-20
      • 2014-08-29
      • 1970-01-01
      • 2014-09-26
      • 1970-01-01
      • 2015-12-20
      • 2013-07-06
      • 1970-01-01
      相关资源
      最近更新 更多