/// <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); } }
/// <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); } }