Member 11776570 Ответов: 1

Как откатить datatransaction в процедуре


Я использую этот код, но он дает ошибку, когда я вставляю данные. Эта ссылка на объект не задана.

Что я уже пробовал:

SqlTransaction tran=null;

try
            {              
                con.Open();                
               //tran = con.BeginTransaction();

----- процессуальный кодекс-----
cmd.ExecuteNonQuery();
                //tran.Commit();
}

catch
            {
tran.Rollback();
                throw;
            }

1 Ответов

Рейтинг:
5

OriginalGriff

Что ж... да, так и будет:

SqlTransaction tran=null;
Вы специально установили для него значение null, так что у него нет объекта!
Попробовать это:
SqlTransaction trans;
try
    {
    using (SqlConnection con = new SqlConnection(strConnect))
        {
        con.Open();
        trans = con.BeginTransaction();
        using (SqlCommand cmd = new SqlCommand("...", con))
            {
            ...
            }
        trans.Commit();
        }
    }
catch (Exception ex)
    {
    Console.WriteLine(ex.Message);
    trans.Rollback();
    }


Member 11776570

Это дает такую ошибку
ExecuteNonQuery требует, чтобы команда имела транзакцию...... команда находится в ожидающей транзакции местоположения.

OriginalGriff

Скопируйте и вставьте фактический код, который вы используете - полную транзакцию и лоток-улов, а не несколько строк из него.

Member 11776570

{ SqlTransaction tran;
против.Открыть();
Тран = кон.BeginTransaction();
пробовать
{


cmd = new SqlCommand("Insert_emp", con);

УМК.CommandType = CommandType.Хранимая процедура;
cmd.Parameters.Add("@firstname", SqlDbType.VarChar, 50).Value = obj.Имя;
cmd.Parameters.Add("@lastname", SqlDbType.VarChar, 50).Value = obj.Фамилия;
cmd.Parameters.Add("@address1", SqlDbType.VarChar, 50).Value = obj.Адрес1;
cmd.Parameters.Add("@address2", SqlDbType.VarChar, 50).Value = obj.Адрес2;
cmd.Parameters.Add("@city", SqlDbType.VarChar, 50).Value = obj.Город;
cmd.Parameters.Add("@mobile_no", SqlDbType.BigInt).Значение = объект.Mobile_No;
УМК.Параметры.Добавить("@почта", значения sqldbtype.Тип varchar, 50).Значение = объект.Электронной почты;

cmd.Parameters.Add("@created_by", SqlDbType.VarChar, 50).Value = obj.Created_By;
cmd.Parameters.Add("@created_date", SqlDbType.DateTime).Значение = объект.Created_Date;
cmd.Parameters.Add("@modified_by", SqlDbType.VarChar, 50).Value = obj.Modified_By;
cmd.Parameters.Add("@modified_date", SqlDbType.DateTime).Значение = объект.Дата изменения;
УМК.Параметры.Добавить("@метод isactive", значения sqldbtype.- Чуть).Значение = объект.Метод isactive;
УМК.Параметры.Добавить("@идентификатор emp_id", значения sqldbtype.Инт);
УМК.Параметры["@идентификатор emp_id"].Направление = ParameterDirection.Выход;
УМК.Метод executenonquery();
Тран.Совершать();
int result = Convert.ToInt32(cmd.Parameters["@emp_id"].Value);
если (результат > 0)
{
возвращаемый результат;
}
еще
{
возврат -1;
}
}
ловить
{
тран.Отмена();
бросать;
}
наконец
{
против.Закрывать();
}

OriginalGriff

Попробовать это:
cmd = new SqlCommand("Insert_emp", con, tran);

Member 11776570

Тай У... Сделано...

OriginalGriff

Всегда пожалуйста!