2012-05-18 3 views
2

У меня чертовски время получения выходного значения из SQL Server.Возврат выходного параметра из SQL Server с помощью хранимой процедуры и C#

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

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 

А вот мой C#:

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, но это также создает ошибку.

+4

FYI: 'scope_identity()' гораздо разумнее, чем выбор '@@ IDENTITY'. – HABO

ответ

4

вы хотите ParameterDirection.Output не ParameterDirection.ReturnValue

также взять его из возвратной части, возврат должен быть использован, чтобы вернуть статус не значение

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

+0

Большое спасибо за помощь. Я буду отмечать это как ответ, как только это позволит мне. – Darren

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

<SqlCommand>.ExecuteNonQuery(); 

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

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

+1

Добро пожаловать в StackOverflow: если вы отправляете код, XML или образцы данных **, пожалуйста ** выделите эти строки в текстовом редакторе и нажмите кнопку «образцы кода» ('{}') на панели инструментов редактора, чтобы красиво отформатировать и синтаксис выделить его! –

0

эта линия:

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

должно быть:

int NewQuoteNumber = int.Parse(SqlCommand.Parameters["NewQuoteNumber"].Value .ToString()); 
Смежные вопросы