C# 在C中,如何使用ExecuteOnQuery从存储过程中获取返回值
我有以下疑问:C# 在C中,如何使用ExecuteOnQuery从存储过程中获取返回值,c#,ado.net,C#,Ado.net,我有以下疑问: create proc [dbo].[DeleteParts] @TransNo nvarchar (6), @fpart nvarchar(25) AS DECLARE @Returns BIT SET @Returns = 1 BEGIN TRY BEGIN TRANSACTION DELETE FROM PARTABLE WHERE TransN
create proc [dbo].[DeleteParts]
@TransNo nvarchar (6), @fpart nvarchar(25)
AS
DECLARE @Returns BIT
SET @Returns = 1
BEGIN
TRY
BEGIN TRANSACTION
DELETE FROM PARTABLE
WHERE TransNo = @TransNo and fpart = @fpart
COMMIT
END TRY
BEGIN CATCH
Print 'Delete failed'
SET @Returns = 0
-- Any Error Occurred during Transaction. Rollback
IF @@TRANCOUNT > 0
ROLLBACK -- Roll back
END CATCH
RETURN @Returns
这个编译得非常好
在C语言中,我想执行这个查询并获取返回值
我的代码如下:
using(System.Data.SqlClient.SqlCommand deletecommand = this._connection.CreateCommand())
{
deletecommand.CommandText = "DeleteParts";
deletecommand.CommandType = System.Data.CommandType.StoredProcedure;
deletecommand.Parameters.AddWithValue("@TransNo", ItemSODBOM.SONO);
deletecommand.Parameters.AddWithValue("@fpart", ItemSODBOM.fbompart);
string ReturnValue = deletecommand.ExecuteNonQuery().ToString();
}
它没有给我任何错误,但它返回的是受影响的行数,我想返回1或0
示例:如果删除操作成功,则返回1;如果删除操作失败,则返回0
如果您对源代码有任何帮助,我们将不胜感激
谢谢
Pradeep我看不出您正在返回值。请添加Return语句以返回存储过程中的任何值。您需要一个方向设置为ParameterDirection.ReturnValue的参数 比如:
SqlParameter returnParameter = deleteCommand.Parameters.Add("RetVal", SqlDbType.Int);
returnParameter.Direction = ParameterDirection.ReturnValue;
...
deleteCommand.ExecuteNonQuery();
...
int returnValue = (int) returnParameter.Value;
存储过程当然需要返回此返回值:
create proc [dbo].[DeleteParts]
@TransNo nvarchar (6),
@fpart nvarchar(25)
AS
DECLARE @Returns BIT
SET @Returns = 1
...
RETURN @Returns
ExecuteOnQuery返回无法设置的@@ROWCOUNT。因此,实际上您不能使用它返回值。通常结果作为行返回,就像普通的select查询一样。您可以使用读取器或适配器获取它。ExecuteOnQuery将返回受影响的行数,但不会返回数据,这就是为什么它是非查询。所以它不会带任何东西回来 这可能有助于阅读:
您需要使用另一种机制来获取数据-使用输出参数的ExecuteReader如何?您必须在存储过程中指定输出类型,如下所示
@IDout [int] output
然后添加此参数
SPParamReturnCollection sp = new SPParamReturnCollection();
sp.Add(new SPParams { Name = "IDout", ParamDirection = ParameterDirection.Output, Type = SqlDbType.Int });
将变量命名为@Returns不会神奇地返回其值,您必须实际返回该值 不能返回位值,返回值始终为整数。如果您想发回位值,则必须使用输出参数 将return语句添加到过程中:
create proc [dbo].[DeleteParts]
@TransNo nvarchar (6), @fpart nvarchar(25)
AS
DECLARE @Returns INT
SET @Returns = 1
BEGIN
TRY
BEGIN TRANSACTION
DELETE FROM PARTABLE
WHERE TransNo = @TransNo and fpart = @fpart
COMMIT
END TRY
BEGIN CATCH
Print 'Delete failed'
SET @Returns = 0
-- Any Error Occurred during Transaction. Rollback
IF @@TRANCOUNT > 0
ROLLBACK
END CATCH
RETURN @Returns
添加一个方向为ReturnValue的参数以接收返回值:
int returnValue;
using(System.Data.SqlClient.SqlCommand deletecommand = this._connection.CreateCommand())
{
deletecommand.CommandText = "DeleteParts";
deletecommand.CommandType = System.Data.CommandType.StoredProcedure;
deletecommand.Parameters.AddWithValue("@TransNo", ItemSODBOM.SONO);
deletecommand.Parameters.AddWithValue("@fpart", ItemSODBOM.fbompart);
var returnParameter = deletecommand.Parameters.Add("@ret", SqlDbType.Int);
returnParameter.Direction = ParameterDirection.ReturnValue;
deletecommand.ExecuteNonQuery();
returnValue = (int)returnParameter.Value;
}
正如RemoteSojourner所指出的;您没有返回任何内容如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮{},以很好地格式化和语法突出显示它!不要使用报价机制,那只会弄乱你的代码!!这是错过了从该程序,现在它是补充,没有什么不同于乔的post@Pradeep当前位置是的,Joe的帖子中的所有内容都在这个帖子中,但这并不意味着这个帖子中的所有内容都在Joe的帖子中。
int returnValue;
using(System.Data.SqlClient.SqlCommand deletecommand = this._connection.CreateCommand())
{
deletecommand.CommandText = "DeleteParts";
deletecommand.CommandType = System.Data.CommandType.StoredProcedure;
deletecommand.Parameters.AddWithValue("@TransNo", ItemSODBOM.SONO);
deletecommand.Parameters.AddWithValue("@fpart", ItemSODBOM.fbompart);
var returnParameter = deletecommand.Parameters.Add("@ret", SqlDbType.Int);
returnParameter.Direction = ParameterDirection.ReturnValue;
deletecommand.ExecuteNonQuery();
returnValue = (int)returnParameter.Value;
}