我可以在业务层中使用TransactionScope而不是在数据提供程序中使用SQLiteTransaction吗

本文关键字:程序 SQLiteTransaction 数据 业务 TransactionScope 我可以 | 更新日期: 2023-09-27 18:00:17

我想在我的业务层中使用TransactionScope类:

在AdminService类中:

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

当我在上面调试两个Delete方法时,数据提供程序中每个Delete命令对象的Transaction属性都为NULL,所以似乎没有事务。。。如何了解交易是否被使用?

Wen我调试了transactionscope对象,我找不到任何Connection。。。

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命令关闭它是没有意义的。

更新:

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();               
            }
        }

我可以在业务层中使用TransactionScope而不是在数据提供程序中使用SQLiteTransaction吗

Transaction.Current将告诉您是否存在活动事务。

只有在事务范围内打开连接后,该连接才会包含在事务中。

HTH

IIRC,TransactionScope与分布式事务协调器(MSDTC)紧密绑定。所以要注意,尤其是当您使用SQLite时。

所有这些都可以看到so上的许多其他问题,例如这个。