private static I_DBHelper GetDBHelper(DatabaseInformation database) { I_DBHelper dbHelper = System.Runtime.Remoting.Messaging.CallContext.GetData(database.Name) as I_DBHelper; if (dbHelper == null) { var dbProvider = GetDatabaseProvider(database); if (dbProvider == DatabaseProvider.SQLServer) { var connection = new SqlConnection(database.ConnectionString); dbHelper = new SQLHelper(connection); System.Runtime.Remoting.Messaging.CallContext.SetData(database.Name, dbHelper); } else if (dbProvider == DatabaseProvider.Oracle) { } } return(dbHelper); }
public static TransactionResult ExecuteTransactionalQueryItems(List <QueryItem> queryItems) { TransactionResult result = new MyConnectionManager.TransactionResult(); foreach (var queryItem in queryItems) { TransactionQueryResult queryResult = new MyConnectionManager.TransactionQueryResult(queryItem); result.QueryItems.Add(queryResult); } List <Tuple <int, I_DBHelper> > dbHelpers = new List <Tuple <int, MyConnectionManager.I_DBHelper> >(); //بهتره ایدی دیتابیس در انتیت قرار گیرد //List<Tuple<int, DatabaseInformation>> entityDatabaseIDs = new List<Tuple<int, DatabaseInformation>>(); //using (var context = new MyProjectEntities()) //{ // foreach (var queryResult in result.QueryItems) // { // var queryItem = queryResult.QueryItem; // if (!entityDatabaseIDs.Any(x => x.Item1 == queryItem.TargetEntityID)) // { // var entityID = 0; // if (queryItem.DataItem != null) // entityID = queryItem.DataItem.TargetEntityID; // else // entityID = queryItem.TargetEntityID; // var database = context.TableDrivedEntity.First(x => x.ID == entityID).Table.DBSchema.DatabaseInformation; // entityDatabaseIDs.Add(new Tuple<int, DatabaseInformation>(entityID, database)); // } // } //} try { foreach (var queryResult in result.QueryItems) { try { var queryItem = queryResult.QueryItem; //var entityID = 0; //if (queryItem.DataItem != null) // entityID = queryItem.TargetEntity.ID; //else // entityID = queryItem.TargetEntityID; //var database = entityDatabaseIDs.First(x => x.Item1 == entityID).Item2; I_DBHelper dbHelper = null; if (!dbHelpers.Any(x => x.Item1 == queryItem.TargetEntity.DatabaseID)) { dbHelper = GetDBHelper(queryItem.TargetEntity.DatabaseID, true); dbHelpers.Add(new Tuple <int, I_DBHelper>(queryItem.TargetEntity.DatabaseID, dbHelper)); } else { dbHelper = dbHelpers.First(x => x.Item1 == queryItem.TargetEntity.DatabaseID).Item2; } dbHelper.ExecuteNonQuery(queryItem.Query); if (queryItem.DataItem != null && queryItem.DataItem.GetProperties().Any(x => x.IsIdentity)) { if (queryItem.DataItem.IsNewItem) { var identity = dbHelper.ExecuteScalar("select scope_identity()"); foreach (var identityProperty in queryItem.DataItem.GetProperties().Where(x => x.IsIdentity)) { //ایونت باید اینجا ریز بشه queryItem.DataItem.GetProperty(identityProperty.ColumnID).Value = identity.ToString(); } //if (queryItem.SetIdentities.Any()) //{ // foreach (var identityItem in queryItem.SetIdentities) // { // identityItem.TargetQueryItem.DataItem.GetProperty(identityItem.TargetColumnID).Value = identity.ToString(); // identityItem.TargetQueryItem.Query = string.Format(identityItem.TargetQueryItem.Query, identity.ToString()); // } //} } } } catch (Exception ex) { queryResult.Exception = ex; throw ex; } } foreach (var dbHelper in dbHelpers) { dbHelper.Item2.GetDBTransaction().Commit(); } result.Successful = true; } catch (Exception ex) { foreach (var dbHelper in dbHelpers) { dbHelper.Item2.GetDBTransaction().Rollback(); } result.Message = ex.Message; result.Successful = false; } finally { foreach (var dbHelper in dbHelpers) { dbHelper.Item2.GetDBConnection().Close(); } } return(result); }