У меня есть 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