В C# как получить возвращаемое значение из хранимой процедуры с помощью executenonquery
у меня есть следующий запрос:
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.
любая помощь с исходным кодом будет будьте благодарны.
спасибо,
Прадип
8 ответов
вам нужен параметр с Direction
значение 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
Я не вижу, что вы возвращаете значение. Добавьте оператор Return, чтобы вернуть любое значение из сохраненного proc.
ExecuteNonQuery
вернет количество затронутых строк, но не данные (вот почему его не запрос). Так что это ничего не вернет.
Это может быть полезно для чтения:
http://www.dreamincode.net/forums/topic/76434-executenonquery-with-output-parameters/
вам нужно будет использовать другой механизм, чтобы получить ваши данные - как насчет ExecuteReader С выходным параметром?
ExecuteNonQuery()
возвращает @@ROWCOUNT
который вы не можете установить. Поэтому вы не можете использовать его для возврата значений.
обычно результат возвращается в виде строки, как и обычный запрос select. Вы можете получить его с помощью считывателя или адаптера.
вы должны указать тип вывода в хранимых процедурах такой
@IDout [int] output
затем добавьте этот параметр
SPParamReturnCollection sp = new SPParamReturnCollection();
sp.Add(new SPParams { Name = "IDout", ParamDirection = ParameterDirection.Output, Type = SqlDbType.Int });
IF EXISTS(SELECT TransNo FROM [PARTABLE] WHERE TransNo = @TransNo and fpart = @fpart
BEGIN
DELETE FROM PARTABLE
WHERE TransNo = @TransNo and fpart = @fpart
SELECT @TransNo AS RETURNVAL
END
ELSE
BEGIN
SELECT 0 AS RETURNVAL
END
именование переменной "@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;
}