Exemplo n.º 1
0
        /// <summary>
        /// 执行查询文本并返回一个 <see cref="IDataReader"/>。
        /// </summary>
        /// <param name="queryCommand">查询命令。</param>
        /// <param name="segment">数据分段对象。</param>
        /// <param name="parameters">查询参数集合。</param>
        /// <returns>一个 <see cref="IDataReader"/> 对象。</returns>
        public virtual IDataReader ExecuteReader(IQueryCommand queryCommand, IDataSegment segment = null, ParameterCollection parameters = null, CommandBehavior?behavior = null)
        {
            Guard.ArgumentNull(queryCommand, nameof(queryCommand));

            var connection = GetConnection(DistributedMode.Slave);

            var command = new InternalDbCommand(CreateDbCommand(connection, queryCommand, parameters), _readerLocker);

            try
            {
                var context = new CommandContext(this, command, segment, parameters);
                HandleSegmentCommand(context);
                return(HandleCommandExecuted(command, parameters, behavior ?? CommandBehavior.Default, (command, behavior) => command.ExecuteReader(behavior)));
            }
            catch (DbException exp)
            {
                throw HandleException(command, exp);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// 异步的,执行查询文本并返回一个 <see cref="IDataReader"/>。
        /// </summary>
        /// <param name="queryCommand">查询命令。</param>
        /// <param name="segment">数据分段对象。</param>
        /// <param name="parameters">查询参数集合。</param>
        /// <param name="cancellationToken">取消操作的通知。</param>
        /// <returns>一个 <see cref="IDataReader"/> 对象。</returns>
        public async virtual Task <IDataReader> ExecuteReaderAsync(IQueryCommand queryCommand, IDataSegment segment = null, ParameterCollection parameters = null, CommandBehavior?behavior = null, CancellationToken cancellationToken = default)
        {
            Guard.ArgumentNull(queryCommand, nameof(queryCommand));
            cancellationToken.ThrowIfCancellationRequested();

            var connection = GetConnection(DistributedMode.Slave);

            var command = new InternalDbCommand(CreateDbCommand(connection, queryCommand, parameters), _readerLocker);

            try
            {
                var context = new CommandContext(this, command, segment, parameters);
                await HandleSegmentCommandAsync(context, cancellationToken);

                return(await HandleCommandExecutedAsync(command, parameters, behavior ?? CommandBehavior.Default,
                                                        (command, behavior, cancelToken) => command.ExecuteReaderAsync(behavior, cancelToken), cancellationToken));
            }
            catch (DbException exp)
            {
                throw await HandleExceptionAsync(command, exp, cancellationToken);
            }
        }