Я стараюсь осуществлять сделки в хранившейся процедуре, в одинокой которой он получает последний реестр таблицы, это число это перемещает как параметр вывода.
Но я произвожу следующую ошибку:
Опись сделок после 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();
}
}
Уже я смог решать это, не 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
Я не знаю конечную цель кода, но я не использовал бы сделки для такого простого процесса. Если ты обходишься без них, ты можешь получать тот же результат, так как консультации - связаны со сделкой.
Я сменил бы код на это:
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.
Я надеюсь помочь,