Exemple #1
0
        /// <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;
            }
        }