/// <summary> /// 执行查询命令并返回执行上下文 /// </summary> /// <param name="command">查询命令</param> /// <param name="tracing">用于追踪查询过程的追踪器</param> /// <returns>查询执行上下文</returns> protected virtual IDbExecuteContext Execute(SqlCommand command, IDbTracing tracing = null) { try { TryExecuteTracing(tracing, t => t.OnExecuting(command)); var connection = new SqlConnection(ConnectionString); connection.Open(); command.Connection = connection; if (Configuration.QueryExecutingTimeout.HasValue) { command.CommandTimeout = (int)Configuration.QueryExecutingTimeout.Value.TotalSeconds; } var reader = command.ExecuteReader(); var context = new SqlDbExecuteContext(connection, reader, tracing); TryExecuteTracing(tracing, t => t.OnLoadingData(context)); return(context); } catch (DbException exception) { TryExecuteTracing(tracing, t => t.OnException(exception)); throw; } }
/// <summary> /// 异步执行查询命令并返回执行上下文 /// </summary> /// <param name="command">查询命令</param> /// <param name="token">取消指示</param> /// <param name="tracing">用于追踪查询过程的追踪器</param> /// <returns>查询执行上下文</returns> protected virtual async Task <IAsyncDbExecuteContext> ExecuteAsync(SqlCommand command, CancellationToken token, IDbTracing tracing = null) { try { TryExecuteTracing(tracing, t => t.OnExecuting(command)); var connection = new SqlConnection(ConnectionString); await connection.OpenAsync(token); command.Connection = connection; if (Configuration.QueryExecutingTimeout.HasValue) { command.CommandTimeout = (int)Configuration.QueryExecutingTimeout.Value.TotalSeconds; } var reader = await command.ExecuteReaderAsync(token); var context = new SqlDbExecuteContext(connection, reader, tracing); TryExecuteTracing(tracing, t => t.OnLoadingData(context)); return(context); } catch (DbException exception) { TryExecuteTracing(tracing, t => t.OnException(exception)); throw; } }