2009-02-20 6 views
1

Добрый день, все,Параметр хранимой процедуры, вставляющий неправильное значение

У меня возникла проблема с хранимой процедурой, введя неправильное значение. Ниже приводится обобщение моей хранимой процедуры ...

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
go 
CREATE PROCEDURE [dbo].[InsertDifferential] 
    @differential int = null 
AS 
    BEGIN TRY 
     BEGIN TRANSACTION 
      UPDATE 
       DifferentialTable 
      SET 
       differential = @differential 
     COMMIT 
    END TRY 
    BEGIN CATCH 
     IF @@TRANCOUNT > 0 
     ROLLBACK 
     DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int, @ErrorState INT 
     SELECT @ErrMsg = ERROR_MESSAGE(), 
       @ErrSeverity = ERROR_SEVERITY(), 
       @ErrorState = ERROR_STATE(); 
     RAISERROR(@ErrMsg, @ErrSeverity, @ErrorState); 
    END CATCH 

Ниже приведен код, я использую для вызова хранимой процедуры ...

SqlConnection dbEngine = new SqlConnection(connectionString); 
SqlCommand dbCmd = new SqlCommand("InsertDifferential", dbEngine); 
SqlDataAdapter dataAdapter = new SqlDataAdapter(dbCmd); 

dbCmd.CommandType = CommandType.StoredProcedure; 

if (myobject.differential.HasValue) 
{ dbCmd.Parameters.AddWithValue("@differential", myobject.differential); } 
else 
{ dbCmd.Parameters.AddWithValue("@differential", DBNull.Value); } 

dbCmd.ExecuteNonQuery(); 

В таблице базы данных, дифференциальный столбец является обнуляемым int без значения по умолчанию.

Дифференциальное свойство «myobject» является int? по умолчанию тип данных установлен в значение null.

Проблема заключается в том, когда я запускаю хранимую процедуру, дифференциальный столбец завершается с 0 на месте. Даже если «myobject.differential» имеет значение null, и я передаю DBNull.Value, столбец все еще заканчивается с 0 на месте. Я пробовал не передавать @differential в хранимую процедуру, и он по-прежнему устанавливает столбец в 0.

Я пробовал несколько различных решений, и ничего не работало.

Спасибо заранее за любую помощь,

Скотт Vercuski

+0

Вместо того, чтобы суммировать хранимую процедуру, вы можете предоставить фактический код? Подобная проблема часто возникает из-за одной строки кода где-то, опечатки и т. Д. –

+0

Том Х. - К сожалению, мой работодатель не разрешит мне публиковать всю хранимую процедуру по причинам раскрытия, из-за этого мне жаль. Я могу вам сказать, что дифференциальное обновление является единственным обновлением в хранимой процедуре и единственным местом, где дифференциал затрагивается в этой хранимой процедуре. –

+0

Похоже, вы нашли свой ответ, но если вы не можете опубликовать исходный код, другой вариант - воспроизвести и подтвердить ошибку с уменьшенной версией. –

ответ

1

Я считаю, что, когда вы установите значение по умолчанию для параметра, как

@differential int = null 

Вам не нужно, чтобы добавить его вашей команды SQL.

Попробуйте код только с этим и не включают еще ...

if (myobject.differential.HasValue) 
{ 
    dbCmd.Parameters.AddWithValue("@differential", myobject.differential); 
} 
+0

RSolberg - Это одна из итераций, которые я пробовал, чтобы исправить эту проблему, к сожалению, она все еще не решила проблему. –

+0

Не имея возможности полностью воспроизвести, я просто угадываю ..... Каково значение параметра перед вызовом команды? Это 0 в этот момент? – RSolberg

+0

RSolberg - на самом деле это то, что я еще не проверил ... Я знаю, что VALUE передано, но это я не проверял параметр, как только он был установлен, позвольте мне проверить и отправить сообщение. Спасибо за предложение. –

0

Вы certian, что дифференциал столбец не имеет Значение по умолчанию Constraint на него ноль?

0

Кроме того, проверьте, есть ли триггер на таблице, установив нулевые значения в ноль.