2016-08-24 2 views
1

У меня есть несколько неприятная проблема.Статус выполнения в INSERT и UPDATE - MS SQL Server

На нижнем уровне: я хочу знать, был ли запрос INSERT или UPDATE в proc успешным или нет. Я не уверен на 100%, если есть статус, который возвращается по всем запросам (кроме SELECT). Я знаю, что SQL Server дает тип возврата для всех сохраненных процессов, и в настоящее время все мои имеют возвращаемый тип Integer.

На среднем уровне: в моем репозитории я хочу использовать Entity Framework для вызова моих сохраненных процессов и возврата статуса как преобразованного (из int) логического из выполнения процесса в мою службу.

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

На самый важный уровень моего вопроса, у меня есть следующий код:

public virtual ObjectResult<int> Proc_AddApprovalProcessor(string userId, string approverId, int approvalOrder) 
{ 
    return ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery<int>(
     "EXECUTE [dbo].[Proc_AddApprovalProcessor] @userId, @approverId, @approvalOrder", 
      new SqlParameter { ParameterName = "userId", Value = userId }, 
      new SqlParameter { ParameterName = "approverId", Value = approverId }, 
      new SqlParameter { ParameterName = "approvalOrder", Value = approvalOrder }).FirstOrDefault(); 
} 

ответ

3

Убедитесь, что ваши вставки/обновления хранимые процедуры заканчиваются в следующей строке:

SELECT @@ROWCOUNT 

Затем изучить и проверьте, что это 1 (или сколько бы строк вы не ожидали вставить/обновить).

+0

Возможно, стоит упомянуть, что это может ввести в заблуждение, если на столе есть триггеры. –

+0

@Evaldas Buinauskas Вы уверены? Большинство моих операторов update/insert/delete запускают записи в архивных таблицах, и у меня никогда не было проблемы с @@ ROWCOUNT –

+0

Возможно, это относится к более сложным триггерам, но, возможно, вы правы. Этот вопрос, кажется, отвечает, что http://stackoverflow.com/questions/7005225/sql-server-does-trigger-affects-rowcount sory для путаницы :) –

3

Вы можете использовать переменную сервера @@ROWCOUNT сразу после запроса на вставку/обновление, чтобы проверить количество затронутых строк, используя операцию вставки/обновления.

declare @fName varchar(50) = 'my name', 
      @lName varchar(50) = 'your name' 
    INSERT INTO myTable(fName,lName) values(@fName,@lName) 

    SELECT @@ROWCOUNT --> 0 - means no rows affected/nothing inserted or updated 
        --> 1 - means row has been inserted or updated successfully 
+0

Спасибо за ваше время Sampath. Единственная проблема заключается в том, что печать ничего не возвращает исполняющему процессу и, следовательно, по-прежнему будет давать те же результаты, что и не помещать их туда. Я буду использовать для @@ ROWCOUNT. – codeshinobi

+0

@codeshinobi Конечно, нет проблем и спасибо за правильность моей ошибки :) – Sampath

0

Если вы используете транзакцию, тогда необходимо использовать приведенный ниже код, чтобы вернуть счет транзакции.

возвращение @@ TRANCOUNT;

+0

Я не использую транзакции, но спасибо за ваш комментарий. Я сделаю закладку для последующей ссылки – codeshinobi