Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
Eyere
Member

Откуда:
Сообщений: 47
написала процедуру:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[Roles_CreateRole]

@IdGroupType int output,
@GroupName nvarchar(50)
AS
BEGIN

DECLARE @ErrorCode int
SET @ErrorCode = 0

DECLARE @TranStarted bit
SET @TranStarted = 0

IF( @@TRANCOUNT = 0 )
BEGIN
BEGIN TRANSACTION
SET @TranStarted = 1
END
ELSE
SET @TranStarted = 0


IF (EXISTS(SELECT IdGroupType FROM dbo.vcRoles WHERE GroupName = LOWER(@GroupName)))
BEGIN
SET @ErrorCode = 1
GOTO Cleanup
END

INSERT INTO dbo.vcRoles
(GroupName)
VALUES (@GroupName);

set @IdGroupType = 12

IF( @@ERROR <> 0 )
BEGIN
SET @ErrorCode = -1
GOTO Cleanup
END

IF( @TranStarted = 1 )
BEGIN
SET @TranStarted = 0
COMMIT TRANSACTION
END

RETURN(0)

Cleanup:

IF( @TranStarted = 1 )
BEGIN
SET @TranStarted = 0
ROLLBACK TRANSACTION
END

RETURN @ErrorCode

END
Но при попытке ее выполнить происходит ошибка: Сообщение 266, уровень 16, состояние 2, процедура Roles_CreateRole, строка 28
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 0, current count = 1.
Что тут делать, чтобы избавиться от нее?????
17 дек 09, 15:22    [8081313]     Ответить | Цитировать Сообщить модератору
 Re: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
Le Peace
Member

Откуда: Москва
Сообщений: 8969
Как Вы вызываете процедуру?
По какой ветке она идёт, когда возникает ошибка?
17 дек 09, 16:02    [8081633]     Ответить | Цитировать Сообщить модератору
 Re: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31220
Eyere
Но при попытке ее выполнить происходит ошибка: Сообщение 266, уровень 16, состояние 2, процедура Roles_CreateRole, строка 28
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 0, current count = 1.
Что тут делать, чтобы избавиться от нее?????
А нету ли на vcRoles триггера, написанного с ошибками?
17 дек 09, 16:04    [8081646]     Ответить | Цитировать Сообщить модератору
 Re: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
INSERT INTO dbo.vcRoles
(GroupName)
VALUES (@GroupName);

set @IdGroupType = 12 

IF( @@ERROR <> 0 )
BEGIN
SET @ErrorCode = -1
GOTO Cleanup
END

вот в етом куске может быть ошибка
после ошибки при инсерте идет сет,который проходит без ошибок и в иф не попадет
-------------------------------------
Jedem Das Seine
17 дек 09, 16:19    [8081748]     Ответить | Цитировать Сообщить модератору
 Re: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31220
Maxx
вот в етом куске может быть ошибка
после ошибки при инсерте идет сет,который проходит без ошибок и в иф не попадет
Но это ведь не может вызвать ту ошибку, о которой написал ТС?
17 дек 09, 16:22    [8081766]     Ответить | Цитировать Сообщить модератору
 Re: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
Eyere
Member

Откуда:
Сообщений: 47
Le Peace
Как Вы вызываете процедуру?
По какой ветке она идёт, когда возникает ошибка?

вызываю ее на сервере. путем нажатия правой кнопки мыши и далее "выполнить".
17 дек 09, 16:25    [8081788]     Ответить | Цитировать Сообщить модератору
 Re: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
Eyere
Member

Откуда:
Сообщений: 47
alexeyvg
Eyere
Но при попытке ее выполнить происходит ошибка: Сообщение 266, уровень 16, состояние 2, процедура Roles_CreateRole, строка 28
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 0, current count = 1.
Что тут делать, чтобы избавиться от нее?????
А нету ли на vcRoles триггера, написанного с ошибками?

Тригера точно нет. Эта таблица пустая (т.к. создала ее незадолго до этой процедуры)
17 дек 09, 16:27    [8081797]     Ответить | Цитировать Сообщить модератору
 Re: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
alexeyvg,

почему же.... проскочили откат транзакции на коммит не попали - и в результате ето сообщение,как я себе понимаю
17 дек 09, 16:29    [8081816]     Ответить | Цитировать Сообщить модератору
 Re: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

а select @@version что говорит?
больше никаких ошибок точно нет?

Posted via ActualForum NNTP Server 1.4

17 дек 09, 16:31    [8081846]     Ответить | Цитировать Сообщить модератору
 Re: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
IF (EXISTS(SELECT IdGroupType FROM dbo.vcRoles WHERE GroupName = LOWER(@GroupName)))
BEGIN
SET @ErrorCode = 1
GOTO Cleanup
END

INSERT INTO dbo.vcRoles
(GroupName)
VALUES (@GroupName);

IF( @@ERROR <> 0 )
BEGIN
SET @ErrorCode = -1
GOTO Cleanup
END

set @IdGroupType = 12 

IF( @@ERROR <> 0 )
BEGIN
SET @ErrorCode = -1
GOTO Cleanup
END

IF( @TranStarted = 1 )
BEGIN
SET @TranStarted = 0
COMMIT TRANSACTION
END

RETURN(0)

как по мне, код должен иметь вот такой вид..в даном варианте, не смотря натто ,что наличие транзакции все таки яб проверял @@trancount'ом
-------------------------------------
Jedem Das Seine
17 дек 09, 16:32    [8081853]     Ответить | Цитировать Сообщить модератору
 Re: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
Eyere
Member

Откуда:
Сообщений: 47
Так, вот что выдается сейчас:
Сообщение 208, уровень 16, состояние 1, процедура Roles_CreateRole, строка 30
Invalid object name 'dbo.vcRoles'.
Сообщение 266, уровень 16, состояние 2, процедура Roles_CreateRole, строка 30
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 0, current count = 1.
17 дек 09, 16:45    [8082001]     Ответить | Цитировать Сообщить модератору
 Re: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Invalid object name 'dbo.vcRoles'.

ну дык. оно есть? схема точно dbo?

Posted via ActualForum NNTP Server 1.4

17 дек 09, 16:49    [8082049]     Ответить | Цитировать Сообщить модератору
 Re: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Eyere

Invalid object name 'dbo.vcRoles'.


чет у вас там савсем плохо , или БД другая или такой таблиці нет
17 дек 09, 16:49    [8082050]     Ответить | Цитировать Сообщить модератору
 Re: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Eyere,

и что вы поменяли в процедуре то?
17 дек 09, 16:51    [8082071]     Ответить | Цитировать Сообщить модератору
 Re: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31220
Eyere
Так, вот что выдается сейчас:
Сообщение 208, уровень 16, состояние 1, процедура Roles_CreateRole, строка 30
Invalid object name 'dbo.vcRoles'.
Сообщение 266, уровень 16, состояние 2, процедура Roles_CreateRole, строка 30
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 0, current count = 1.
Ну, тогда понятно.
Объекта dbo.vcRoles нет, далеее (при этом виде ошибке) процедура не выполняется, вот и вторая ошибка №266
17 дек 09, 16:52    [8082079]     Ответить | Цитировать Сообщить модератору
 Re: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31220
Maxx
alexeyvg,

почему же.... проскочили откат транзакции на коммит не попали - и в результате ето сообщение,как я себе понимаю
Нет, не получается так.

Если мы попадаем на метку Cleanup:, то роллбак, если не попадаем, то коммит. Независимо от какого-либо другого кода.
17 дек 09, 16:54    [8082106]     Ответить | Цитировать Сообщить модератору
 Re: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
Eyere
Member

Откуда:
Сообщений: 47
Я поменяла следующее: IF (EXISTS(SELECT IdGroupType FROM dbo.vcRoles WHERE GroupName = LOWER(@GroupName)))
заменила (@GroupName) на ('администратор'), чтобы посмотреть, что он выдаст. Результатом стало возвращенное значение 1 (в этой таблице у IdGroup 1 GroupName администратор) и все сработала без единой ошибочки. Вернулось то что нужно. А вот с параметром @GroupName эти ошибки обе появляются... Я не понимаю, в чем тут дело...
17 дек 09, 17:01    [8082161]     Ответить | Цитировать Сообщить модератору
 Re: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
Eyere
Member

Откуда:
Сообщений: 47
Давайте по порядку разберемся:
Итак, есть таблица с двумя столбцами IdGroup и GroupName. В ней две роли: 1 - Админ, 2 - Юзер. Я пишу процедуру, которая бы добавляла новую роль, проверяла, а нет ли такой уже в базе. Для этого задаю 2 переменные @IdGroupType int output, @GroupName nvarchar(50). Правильно? Далее декларирую ошибку (ну чтобы он писал что там к чему) и определяю началась ли транзакция. Правильно?
AS
BEGIN

DECLARE @ErrorCode int
SET @ErrorCode = 0

DECLARE @TranStarted bit
SET @TranStarted = 0
Теперь считаю сколько транзакций открыто
IF( @@TRANCOUNT = 0 )
BEGIN
BEGIN TRANSACTION
SET @TranStarted = 1
END
ELSE
SET @TranStarted = 0

Теперь проверяю нет ли нового значения в базе
IF (EXISTS(SELECT IdGroupType FROM dbo.vcRoles WHERE GroupName = LOWER(@GroupName)))
BEGIN
SET @ErrorCode = 1
GOTO Cleanup
END
Если все ок, то добавляю новые
INSERT INTO dbo.vcRoles
(GroupName)
VALUES (@GroupName);

set @IdGroupType = 12 (ну тут я пока 12 поставила, а потом планирую идентити записывать в этот столбец)
Теперь если какие-то ошибки получились нужно все поотменять
IF( @@ERROR <> 0 )
BEGIN
SET @ErrorCode = -1
GOTO Cleanup
END
если все ок, то продолжить
IF( @TranStarted = 1 )
BEGIN
SET @TranStarted = 0
COMMIT TRANSACTION
END

RETURN(0)

Cleanup:

IF( @TranStarted = 1 )
BEGIN
SET @TranStarted = 0
ROLLBACK TRANSACTION
END

RETURN @ErrorCode

END
Или я не правильно процедуру составила???????
17 дек 09, 17:11    [8082272]     Ответить | Цитировать Сообщить модератору
 Re: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
alexeyvg
Maxx
alexeyvg,

почему же.... проскочили откат транзакции на коммит не попали - и в результате ето сообщение,как я себе понимаю
Нет, не получается так.

Если мы попадаем на метку Cleanup:, то роллбак, если не попадаем, то коммит. Независимо от какого-либо другого кода.


недосмотрел,согласен
17 дек 09, 17:13    [8082282]     Ответить | Цитировать Сообщить модератору
 Re: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31220
Eyere
Я поменяла следующее: IF (EXISTS(SELECT IdGroupType FROM dbo.vcRoles WHERE GroupName = LOWER(@GroupName)))
заменила (@GroupName) на ('администратор'), чтобы посмотреть, что он выдаст. Результатом стало возвращенное значение 1 (в этой таблице у IdGroup 1 GroupName администратор) и все сработала без единой ошибочки. Вернулось то что нужно. А вот с параметром @GroupName эти ошибки обе появляются... Я не понимаю, в чем тут дело...
Ошибка говорит, что dbo.vcRoles нету.

Вам просто повнимательнее нужно всё проверить.

Вот у вас там сначала ошибка в 28-й строке, потом в 30-й; значит, что-то меняете, что-то по разному выпоняете...

Деляайте полный скрипт:
drop procedure ...
go
create procedure ...
...
go
exec ...

выполняйте и смотрите результат
17 дек 09, 17:13    [8082283]     Ответить | Цитировать Сообщить модератору
 Re: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
I
NSERT INTO dbo.vcRoles
(GroupName)
VALUES (@GroupName);  -- допустим здесь ошибка

set @IdGroupType = 12 --  здесь ошибки нет
IF( @@ERROR <> 0 )
BEGIN
SET @ErrorCode = -1
GOTO Cleanup
END
@@ERROR  - содержит ошибку ПОСЛЕДНЕЙ перед ним скл команды
-------------------------------------
Jedem Das Seine
17 дек 09, 17:15    [8082308]     Ответить | Цитировать Сообщить модератору
 Re: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
Supra93
Member

Откуда:
Сообщений: 8174
Eyere

IF (EXISTS(SELECT IdGroupType FROM dbo.vcRoles WHERE GroupName = LOWER(@GroupName)))
INSERT INTO dbo.vcRoles
(GroupName)
VALUES (@GroupName);


Я чет не понял. А зачем тут LOWER?
17 дек 09, 17:23    [8082359]     Ответить | Цитировать Сообщить модератору
 Re: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31220
Eyere
INSERT INTO dbo.vcRoles
(GroupName)
VALUES (@GroupName);

set @IdGroupType = 12 

IF( @@ERROR <> 0 )
BEGIN
SET @ErrorCode = -1
GOTO Cleanup
END
Или я не правильно процедуру составила???????
Неправильно, вам уже говорили.

set @IdGroupType = 12 перенесите перед INSERT INTO dbo.vcRoles
17 дек 09, 17:27    [8082391]     Ответить | Цитировать Сообщить модератору
 Re: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
Eyere
Member

Откуда:
Сообщений: 47
Maxx,

Спасибо, вы были правы, в том, что тут ошибка... Я увидела и исправила.
17 дек 09, 17:31    [8082418]     Ответить | Цитировать Сообщить модератору
 Re: Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement  [new]
Eyere
Member

Откуда:
Сообщений: 47
alexeyvg
Eyere
INSERT INTO dbo.vcRoles
(GroupName)
VALUES (@GroupName);

set @IdGroupType = 12 

IF( @@ERROR <> 0 )
BEGIN
SET @ErrorCode = -1
GOTO Cleanup
END
Или я не правильно процедуру составила???????
Неправильно, вам уже говорили.

set @IdGroupType = 12 перенесите перед INSERT INTO dbo.vcRoles

Перенесла и вот теперь такая ошибка получается:
Сообщение 515, уровень 16, состояние 2, процедура Roles_CreateRole, строка 36
Cannot insert the value NULL into column 'IdGroupType', table 'Support.dbo.vcRole'; column does not allow nulls. INSERT fails.
The statement has been terminated.
17 дек 09, 17:33    [8082436]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить