Я надеюсь, что это не один из тех вопросов, когда я ударил себя потом, но это действительно смущает меня.У меня есть это работает для другой из моих хранимых процедур, поэтому это так сбивает с толку.Это в основном одинаковые настройки в обоих.Вот что происходит.
Вот пример моей хранимой процедуры:
ALTER PROCEDURE [dbo].[CreateRecord]
-- Add the parameters for the stored procedure here
@Link1Id INT = NULL,
@Link2Id INT = NULL,
@Amount MONEY,
@Output int out
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
SET @Output = 0
-- Insert statements for procedure here
IF @Link1Id = NULL
BEGIN
IF NOT EXISTS(SELECT * FROM dbo.Records WHERE Link2Id = @Link2Id)
INSERT INTO [dbo].[Records]
([Link1Id]
,[Link2Id])
VALUES
(@Link1Id
,@Link2Id)
SET @Output = (SELECT RecordId FROM dbo.Records WHERE Link2Id = @Link2Id)
END
ELSE
BEGIN
IF NOT EXISTS(SELECT * FROM dbo.Records WHERE Link1Id = @Link1Id)
INSERT INTO [dbo].[Records]
([Link1Id]
,[Link2Id])
VALUES
(@Link1Id
,@Link2Id)
SET @Output = (SELECT RecordId FROM dbo.Records WHERE Link1Id = @Link1Id)
END
END
Теперь я создал модульный тест, который в основном выполняет эту процедуру, и пытается Assert
вернуть@Output
больше 0, но параметр @Output
никогда не имеет значения SqlCommand
в коде.Вот часть кода C #:
private int ExecuteNonQueryWithOutput(string procedureName, SqlParameter[] parameters)
{
SqlCommand command = this.GenerateCommand(procedureName, parameters);
connection.Open();
command.ExecuteNonQuery();
int retval = (int)command.Parameters[OUTPUT].Value;
connection.Close();
return retval;
}
Теперь я могу перешагнуть строку, которая вызывает ExecuteNonQuery()
, и проверить в базе данных, что новая (и правильная) запись есть, но затем нана следующей строке он вызывает исключение, когда вызывает (int)command.Parameters[OUTPUT].Value;
, поскольку Value
не существует.
Это отлично работает для другой процедуры, которая у меня есть, которая настроена точно так же.Вы знаете, почему это не сработало бы здесь?
Спасибо, я немного озадачен.Некоторое время я отлаживал безуспешно.
Редактировать:
Код, который генерирует массив параметров:
List<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter { ParameterName = "@Link1Id", SqlDbType = SqlDbType.Int, Direction = ParameterDirection.Input, Value = link1Val });
parameters.Add(new SqlParameter { ParameterName = "@Link2Id", SqlDbType = SqlDbType.Int, Direction = ParameterDirection.Input, Value = link2Val });
parameters.Add(new SqlParameter { ParameterName = OUTPUT, SqlDbType = SqlDbType.Int, Direction = ParameterDirection.Output });
return this.ExecuteNonQueryWithOutput("CreateRecord", parameters.ToArray());