Вернуть выходной параметр из SQL Server через хранимую процедуру и С#

У меня дьявольское время, когда я получаю выходное значение из SQL Server.

Вот моя хранимая процедура:

ALTER PROCEDURE [dbo].[Insert_UnknownCustomer_Quote_Document]
-- Add the parameters for the stored procedure here
@NewDocumentFileName nvarchar(100),
@NewDocumentWordCount int,
@NewQuoteAmount money,
@NewQuoteNumber int OUTPUT = 0

AS

DECLARE @Today datetime
SELECT @Today = GETDATE()

BEGIN TRANSACTION
BEGIN TRY

BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements.
SET NOCOUNT ON;


-- Insert statements for procedure here
INSERT INTO dbo.Customers(DateAdded)
VALUES (@Today)

INSERT INTO dbo.Quotes(CustomerID, QuoteAmount, QuoteDate)
VALUES (@@IDENTITY, @NewQuoteAmount, @Today)

SELECT @NewQuoteNumber = @@IDENTITY
INSERT INTO dbo.DocumentFiles(QuoteNumber, DocumentFileName, DocumentFileWordCount)
VALUES (@NewQuoteNumber, @NewDocumentFileName, @NewDocumentWordCount)

-- Return quote number
RETURN @NewQuoteNumber

END
COMMIT TRANSACTION
END TRY

BEGIN CATCH
ROLLBACK TRANSACTION
PRINT 'Transaction rolled back.'
END CATCH

А вот мой С#:

SqlParameter returnQuoteNumber = new SqlParameter("@NewQuoteNumber", SqlDbType.Int);
        returnQuoteNumber.Direction = ParameterDirection.ReturnValue;
        newSQLCommand.Parameters.Add(returnQuoteNumber);

Вот ошибка, которую я получаю сейчас:

Procedure or function 'Insert_UnknownCustomer_Quote_Document' expects parameter '@NewQuoteNumber', which was not supplied.

Я попытался взять @NewQuoteNumber с самого начала и поместить его после AS с помощью DECLARE, но это также приводит к ошибке.


person Darren    schedule 18.05.2012    source источник
comment
К вашему сведению: Scope_Identity() — гораздо более разумный выбор, чем @@IDENTITY.   -  person HABO    schedule 18.05.2012


Ответы (3)


ты хочешь ParameterDirection.Output, а не ParameterDirection.ReturnValue

Также уберите его из возвращаемой части, return следует использовать для возврата статуса, а не значения.

И если вы используете return, я бы сделал это после того, как транзакция будет совершена, а не раньше

person SQLMenace    schedule 18.05.2012
comment
Огромное спасибо за помощь. Я отмечу это как ответ, как только это позволит мне. - person Darren; 18.05.2012

SqlCommand.Parameters.Add("@NewQuoteNumber", SqlDbType.Int).Direction = ParameterDirection .Output ;

<SqlCommand>.ExecuteNonQuery();

int NewQuoteNumber = int.Parse(SqlCommand.Parameters["@NewQuoteNumber"].Value .ToString ());

теперь вы можете использовать это значение в своем коде.

person kuldeep verma    schedule 18.05.2012
comment
Добро пожаловать в StackOverflow: если вы публикуете образцы кода, XML или данных, пожалуйста, выделите эти строки в текстовом редакторе и нажмите кнопку образцов кода ( { } ) на панели инструментов редактора, чтобы красиво отформатировать и выделить синтаксис. ! - person marc_s; 18.05.2012

эта строка:

int NewQuoteNumber = int.Parse(SqlCommand.Parameters["@NewQuoteNumber"].Value .ToString ());<br />

должно быть:

int NewQuoteNumber = int.Parse(SqlCommand.Parameters["NewQuoteNumber"].Value .ToString ());
person Sorin Iancu    schedule 30.09.2015