Вызов SP из asp.net выдает ошибку, тогда как он работает нормально из SSMS - PullRequest
0 голосов
/ 29 марта 2012

У меня есть две таблицы:

  1. Недвижимость
  2. Property_Localize

и SP для удаления записи из свойства:

  1. (Delete_SP)

У меня есть триггер, который срабатывает. Вместо удаления записей из свойства сначала удаляются связанные записи из таблицы Property_Localize, а затем удаляются записи из таблицы свойств.

Property table's первичный ключ также используется в некоторой другой таблице в качестве внешнего ключа.

Сейчас мы пытаемся удалить запись из Delete_SP.

Если с таблицей property связана запись в любой другой таблице, она выдает исключение, это исключение обрабатывается в try..catch block, поэтому в любом случае SP возвращает некоторое значение по умолчанию в выходном параметре и успешно выполняется.

Это работает абсолютно нормально, если мы запустим этот SP с сервера (SQL Server Management Studio).

Но когда мы запускаем этот SP с asp.net, он выдает следующую ошибку:

"В конце пакета обнаружена незафиксированная транзакция. транзакция откатывается. "

Хотя это дает правильный выходной параметр.

Мы также пытаемся добавить try catch и явный блок транзакции в триггер, но он по-прежнему выдает ту же ошибку.

Любая помощь будет оценена.

Я забыл упомянуть, я использую слой базы данных CodeSmith.

Ответы [ 3 ]

1 голос
/ 29 марта 2012

SQL Profiler

Это позволит вам отслеживать все фазы вашего запроса (запросов) во время запроса от ASP.Net к базе данных.


Ваша хранимая процедура должна быть такой ...

Create Proc ProcedureName 
@UserName Varchar(50), 
@Password Varchar(50), 
@Email Varchar(50) 
As 
SET NOCOUNT ON 
SET XACT_ABORT ON 

Begin Try 
    Begin Tran 
        //Your Code
    Commit Tran  
End Try 

Begin Catch 
    Rollback Tran 
End Catch 
0 голосов
/ 29 марта 2012

Может быть, это поможет. [Болдинг для упора шахты]

http://msdn.microsoft.com/en-us/library/ms175976.aspx

незафиксированные транзакции и XACT_STATE

Если ошибка, сгенерированная в блоке TRY, приводит к тому, что состояние текущей транзакции становится недействительным, транзакция классифицируется как незафиксированная транзакция. Ошибка, которая обычно завершает транзакцию вне блока TRY, приводит к тому, что транзакция переходит в состояние uncommittable, когда ошибка происходит внутри блока TRY. Нефиксированная транзакция может выполнять только операции чтения или ROLLBACK TRANSACTION. Транзакция не может выполнить какие-либо операторы Transact-SQL, которые бы генерировали операцию записи или COMMIT TRANSACTION. Функция XACT_STATE возвращает значение -1, если транзакция была классифицирована как незафиксированная транзакция. Когда пакет завершается, компонент Database Engine откатывает любые активные незафиксированные транзакции. Если сообщение об ошибке не было отправлено, когда транзакция вошла в состояние uncommittable, когда пакет завершается, клиентскому приложению будет отправлено сообщение об ошибке. Это означает, что была обнаружена и откатана незафиксированная транзакция. *

Для получения дополнительной информации о незафиксированных транзакциях и функции XACT_STATE см. XACT_STATE (Transact-SQL).

0 голосов
/ 29 марта 2012

SSMS может иметь свои собственные параметры конфигурации, которые используются при выполнении sproc, которые не обязательно совпадают с параметрами, используемыми при вызове хранимой процедуры из Ado.Net. По умолчанию соединение с Ado.Net должно использовать настройки сервера по умолчанию, и если между ними есть разница, это может объяснить разницу.

...