Могу ли я использовать TransactionScope на бизнес-уровне вместо SQLiteTransaction в поставщике данных? - PullRequest
1 голос
/ 25 июня 2011

Я хотел бы использовать класс TransactionScope в своем бизнес-уровне:

В классе AdminService:

public void DeleteSchoolclass(Schoolclass schoolclass)
{
    using (var trans = new TransactionScope())
    {
        adminProvider.DeleteSchoolclass(schoolclass.SchoolclassId);
        timetableProvider.DeleteTimeTableEntry(schoolclass.SchoolclassCode);

        trans.Complete();
    }             
}

Когда я отлаживаю оба метода Delete, для свойства Transaction каждого объекта команды Delete внутри поставщика данных устанавливается значение NULL, поэтому кажется, что транзакции нет ... Как узнать, используется транзакция или нет?

Когда я отлаживаю объект транзакции, я не могу найти никакого соединения ...

TransactionScope выглядит как волшебство ...

Это метод в моем классе DataAccess:

public static SQLiteConnection ConnectionManager
{
    get
    {
        if (_con == null)
        {     
            _con = new SQLiteConnection(@"Data Source=C:\TBM\Database\dev.db");
            _con.Open();

            SQLiteCommand command = new SQLiteCommand(sqlString, _con);
            command.ExecuteNonQuery();
        }

        return _con;
    } 
 }

мое соединение всегда открыто, так как не имеет смысла закрывать его для каждой команды sql, имеющей одно поточное приложение.

UPDATE:

public void AddPupil(int schoolclassCodeID, Pupil pupil)
        {
            using (SQLiteTransaction trans = DataAccess.ConnectionManager.BeginTransaction())
            {               
                using (SQLiteCommand com = new SQLiteCommand(DataAccess.ConnectionManager))
                {
                    com.Parameters.Add(new SQLiteParameter("@FirstName", pupil.FirstName));
                    com.Parameters.Add(new SQLiteParameter("@LastName", pupil.LastName));
                    com.Parameters.Add(new SQLiteParameter("@Gender", pupil.Gender));
                    com.Parameters.Add(new SQLiteParameter("@Street", pupil.Street));
                    com.Parameters.Add(new SQLiteParameter("@City", pupil.City));
                    com.Parameters.Add(new SQLiteParameter("@Postal", pupil.Postal));
                    com.Parameters.Add(new SQLiteParameter("@Phone", pupil.Phone));
                    com.Parameters.Add(new SQLiteParameter("@SchoolclassId", schoolclassCodeID));

                    com.CommandText = "INSERT INTO PUPIL (Firstname,LastName,Gender,Street,City,Postal,Phone,SchoolclassId_FK)" +
                                        " VALUES(@FirstName,@LastName,@Gender,@Street,@City,@Postal,@Phone,@SchoolclassId)";
                    com.ExecuteNonQuery();

                    com.CommandText = "SELECT last_insert_rowid() as lastID";
                    pupil.Id = Convert.ToInt32(com.ExecuteScalar());
                }
                trans.Commit();               
            }
        }

Ответы [ 2 ]

1 голос
/ 25 июня 2011

Transaction.Current сообщит вам, существует ли активная транзакция.

Только после открытия соединения в пределах область транзакции будет включена в транзакцию.

НТН

0 голосов
/ 25 июня 2011

IIRC, TransactionScope тесно связан с координатором транзакций распределения (MSDTC).Так что будьте внимательны, особенно если вы используете SQLite.

Все, поэтому смотрите ряд других вопросов по SO, например, this .

...