/// <summary> /// Prepare a command for communicate with database. /// </summary> /// <param name="sql"></param> /// <param name="type"></param> /// <param name="parameters"></param> /// <returns></returns> protected virtual IDbCommand PrepareCommand(string sql, CommandType type, IDbDataParameter[] parameters) { IDbCommand command = _factory.CreateCommand(); command.Connection = this._connection; command.CommandText = sql; command.CommandType = type; var pas = command.Parameters; foreach (var p in parameters) { pas.Add(p); } var tran = LocalTransactionBlock.GetCurrentTransaction(this._connectionSchema.Database); if (tran != null && tran.Connection == this._connection) { command.Transaction = tran; } //if (this._transaction != null) //{ // command.Transaction = this._transaction; //} Logger.LogDbAccessed(sql, parameters, this._connectionSchema); return(command); }
/// <summary> /// 构造一个本地事务代码块 /// </summary> /// <param name="dbSetting">数据库配置</param> /// <param name="level"> /// 此级别只在最外层的代码块中有效。 /// </param> public LocalTransactionBlock(DbSetting dbSetting, IsolationLevel level) : base(ContextItems) { this._dbSetting = dbSetting; this._level = level; var name = ContextWholeScopeKey(_dbSetting.Database); this.EnterScope(name); _parent = GetCurrentTransactionBlock(dbSetting); SetCurrentTransactionBlock(DbSetting, this); }
private static void SetCurrentTransactionBlock(DbSetting dbSetting, LocalTransactionBlock value) { var currentScopeItemKey = ContextCurrentScopeKey(dbSetting.Database); if (value == null) { ContextItems.Remove(currentScopeItemKey); } else { ContextItems[currentScopeItemKey] = value; } }