我有一个存储过程:
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
你必须通过ExecuteScalar
或ExecuteReader
获得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
参数。