передать MySqltransaction объекту соединения - PullRequest
0 голосов
/ 16 октября 2019

У меня есть Data Access Layer, который работает нормально, но для некоторого использования мне нужно передать ему объект Transaction.

Иногда я буду использовать транзакцию, но обычно операция должна работать без объекта Transaction ... ...... Любые идеи Как это должно работать?

Уровень доступа к данным

internal class DataAccessLayer
    {
        MySqlConnection mysqlconnection;        

        public DataAccessLayer()
        {
            mysqlconnection = new MySqlConnection("Connection String");            
        }

        public async Task Open()
        {
            if (mysqlconnection.State != ConnectionState.Open)
            {
                await mysqlconnection.OpenAsync();
            }
        }

        public void Close()
        {
            if (mysqlconnection.State == ConnectionState.Open)
            {
                mysqlconnection.Close();

            }
        }


        public async Task<DataTable> SelectData(string stored_procedure, MySqlParameter[] param)
        {
            MySqlCommand sqlcmd = new MySqlCommand();



            sqlcmd.Connection = mysqlconnection;
            sqlcmd.CommandType = CommandType.StoredProcedure;
            sqlcmd.CommandText = stored_procedure;

            if (param != null)
            {
                for (int i = 0; i < param.Length; i++)
                {
                    sqlcmd.Parameters.Add(param[i]);
                }
            }

            DataTable dt = new DataTable();
            using (sqlcmd)
            {
                await this.Open();
                MySqlDataAdapter da = new MySqlDataAdapter(sqlcmd);                
                await Task.Run(()=> da.Fill(dt));
            }

            return dt;

        }

        public async Task ExecuteCommand(String stored_procedure, MySqlParameter[] param)
        {
            MySqlCommand sqlcmd = new MySqlCommand();


            sqlcmd.Connection = mysqlconnection;
            sqlcmd.CommandType = CommandType.StoredProcedure;
            sqlcmd.CommandText = stored_procedure;

            if (param != null)
            {
                sqlcmd.Parameters.AddRange(param);
            }
            using (sqlcmd)
            {
                await this.Open();                
                await sqlcmd.ExecuteNonQueryAsync();                
            }
        }
    }

логический уровень, который реализует соединение, выглядит так

public static class CLS_TEST
    {
        public static async Task<int> test1() {
            DAL.DataAccessLayer DAL = new DAL.DataAccessLayer();
            MySqlParameter[] param = new MySqlParameter[0];

            try
            {
                DataTable Dt = new DataTable();
                Dt = await DAL.SelectData("SP_TEST", param);
                return Dt.Rows[0].Field<int>(0);
            }         
        }

       etc....
    } 

Есть еще один слой, который вызывает все это, мне нужен окончательный результат, чтобы выглядеть так

try 
    Mysql Transaction tr = null 
    operation1(tr);
    operation2(tr);
    operation3(tr);
    tr.commit 
catch 
    tr.Rollback
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...