将BIT值传递给sql server存储过程



我有一个存储过程:

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

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

这是一个返回值的sp

CREATE PROCEDURE x AS
BEGIN
return 1
END

您必须在c#中添加一个方向为ReturnValue的参数并键入int(它只能是int(,然后在ExecuteNonQuery之后读取参数.Value,从而获得1

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


这是一个具有输出参数的sp

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

您必须在c#中添加一个名称为@y、方向为Output的参数,然后在ExecuteNonQuery之后读取参数值,从而获得1。如果您也使用该参数进行输入,则将方向声明为InputOutput


这是一个返回结果集的sp

CREATE PROCEDURE x
AS BEGIN
SELECT 1 AS y
END

你必须通过ExecuteScalarExecuteReader获得1

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


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

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

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

你需要这样的东西:

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

[LEN]是你需要的任何东西,我怀疑它是9999999,但如果你愿意,你可以做MAX。

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

SELECT @retVal = [YOUR RESULT]

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

尝试更改此项:

returnValue.Direction = ParameterDirection.Output;

到此:

returnValue.Direction = ParameterDirection.ReturnValue;

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

最新更新