Ошибка в создании сделки в SQL Server

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

Но я произвожу следующую ошибку:

Опись сделок после EXECUTE показывает не совпадающее число инструкций BEGIN и COMMIT. Предыдущая опись = 0, настоящая опись = 1.

Я новый осуществляя сделки, но в этой хранившейся процедуре я не требую контролирования никакой rollback, только делать простую сделку.

Это код моей хранившейся процедуры:

CREATE PROCEDURE ultIdCamp(@id int output)
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRANSACTION
    SELECT @id = MAX(id_campana) FROM campana;
    IF (@id IS NULL)
        BEGIN
        SET @id = 1;
        RETURN @id;
        END
    ELSE
        BEGIN
        SET @id = @id + 1;
        RETURN @id;
        END
COMMIT TRANSACTION
END

Это код моего метода, написанного в C#:

public void obtenUltimoRegistro()
        {
            cnn = new SqlConnection(strConnString);
            cmd = new SqlCommand();
            cmd.CommandType = store_procedure;
            cmd.CommandText = "ultIdCamp";
            cmd.Parameters.Add("@id", SqlDbType.Int).Direction = ParameterDirection.Output;
            cmd.Connection = cnn;
            try
            {
                cnn.Open();
                cmd.ExecuteNonQuery();
                id = (int)cmd.Parameters["@id"].Value;
                label3.Text = "" + id;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cnn.Close();
                cnn.Dispose();
                cmd.Dispose();
            }
        }
0
задан 12.10.2016, 21:49
2 ответа

Уже я смог решать это, не habГ - в понятый, что из-за каждого случая он, должно быть, существует уже, будьте один COMMIT или одним ROLLBACK. В этом случае в IF...ELSE, должно быть, есть один COMMIT:

CREATE PROCEDURE ultIdCamp(@id int output)
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRAN
SELECT @id = MAX(id_campana) FROM campana;
IF (@id IS NULL)
    BEGIN
    SET @id = 1;
    COMMIT TRAN
    RETURN @id;
    END
ELSE
    BEGIN
    SET @id = @id + 1;
    COMMIT TRAN
    RETURN @id;
    END
END
0
ответ дан 24.11.2019, 13:10
  • 1
    Открывать transacció n перед SELECT и закрывать ее despué s у него нет чувства / утилиты. В SQL назначенный по умолчанию Server transacció n только блокируй, когда есть modificació n данных. Ademá s сам SELECT имеет " transacció n implicita" что ты гарантирует, что с тех пор, как начинают делать SELECT до тех пор, пока он не заканчивается не было modificació n в данных. –  Victor Sanchez 20.02.2019, 11:35

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

Я сменил бы код на это:

CREATE PROCEDURE ultIdCamp(@id int output)
AS
BEGIN
    SET NOCOUNT ON;    
    SELECT @id = 1 + ISNULL(MAX(id_campana), 0) FROM campana;    
    RETURN @id;
END

Даже он пошел бы дальше и чтобы вычислять счетчик, использовал бы поле IDENTITY.

Я надеюсь помочь,

1
ответ дан 24.11.2019, 13:10

Теги

Похожие вопросы