将 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
您必须通过 ExecuteScalar
或 ExecuteReader
获得 1
ExecuteScalar
returns 结果集左上角的单元格;这个例子很好。如果您计划 return 设置更多的行和列,而不仅仅是一个值,请使用 ExecuteReader
听起来你把事情搞混了;决定您的 sp 如何 return 它的值并相应地对 c# 进行编码。
您可以混合搭配这些,并拥有一个具有输出参数、return 值并选择结果集的存储过程,但您应该清楚 c# 的哪些位从哪些位收集哪些数据存储过程
我有一个存储过程:
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 值
的 spCREATE 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结果集
的spCREATE PROCEDURE x
AS BEGIN
SELECT 1 AS y
END
您必须通过 ExecuteScalar
或 ExecuteReader
ExecuteScalar
returns 结果集左上角的单元格;这个例子很好。如果您计划 return 设置更多的行和列,而不仅仅是一个值,请使用 ExecuteReader
听起来你把事情搞混了;决定您的 sp 如何 return 它的值并相应地对 c# 进行编码。
您可以混合搭配这些,并拥有一个具有输出参数、return 值并选择结果集的存储过程,但您应该清楚 c# 的哪些位从哪些位收集哪些数据存储过程