diff --git a/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/DbBindAccessory.cs b/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/DbBindAccessory.cs index 9b98eaccf..c3abe44f8 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/DbBindAccessory.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/DbBindAccessory.cs @@ -82,7 +82,7 @@ namespace SqlSugar try { if (dataReader == null) return result; - while (await((DbDataReader)dataReader).ReadAsync()) + while (await GetReadAsync(dataReader,context)) { //try //{ @@ -116,6 +116,18 @@ namespace SqlSugar return result; } + private Task GetReadAsync(IDataReader dataReader, SqlSugarProvider context) + { + if (this.QueryBuilder?.Builder?.SupportReadToken==true&&context.Ado.CancellationToken!=null) + { + return this.QueryBuilder.Builder.GetReaderByToken(dataReader, context.Ado.CancellationToken.Value); + } + else + { + return ((DbDataReader)dataReader).ReadAsync(); + } + } + private void SetOwnsOne(object addItem, bool isOwnsOne, EntityInfo entityInfo, IDataReader dataReader) { if (isOwnsOne) diff --git a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/SqlBuilderProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/SqlBuilderProvider.cs index fe5ad2a19..96b007d8e 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/SqlBuilderProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/SqlBuilderProvider.cs @@ -1,9 +1,11 @@ using System; using System.Collections.Generic; using System.Data; +using System.Data.Common; using System.Linq; using System.Text; using System.Text.RegularExpressions; +using System.Threading; using System.Threading.Tasks; namespace SqlSugar { @@ -28,6 +30,13 @@ namespace SqlSugar #endregion #region abstract Methods + + public virtual bool SupportReadToken { get; set; } + + public virtual Task GetReaderByToken(IDataReader dataReader, CancellationToken cancellationToken) + { + return ((DbDataReader)dataReader).ReadAsync(); + } public virtual void ChangeJsonType(SugarParameter paramter) { diff --git a/Src/Asp.Net/SqlSugar/Interface/ISqlBuilder.cs b/Src/Asp.Net/SqlSugar/Interface/ISqlBuilder.cs index 88189210a..f1428dce3 100644 --- a/Src/Asp.Net/SqlSugar/Interface/ISqlBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Interface/ISqlBuilder.cs @@ -5,6 +5,7 @@ using System.Dynamic; using System.Linq; using System.Linq.Expressions; using System.Text; +using System.Threading; using System.Threading.Tasks; namespace SqlSugar { @@ -47,5 +48,9 @@ namespace SqlSugar string RemoveParentheses(string sql); string RemoveN(string sql); void FormatSaveQueueSql(StringBuilder sqlBuilder); + + bool SupportReadToken { get; set; } + Task GetReaderByToken(IDataReader dataReader, CancellationToken cancellationToken); + } } diff --git a/Src/Asp.Net/SqlSugar/Realization/SqlServer/SqlBuilder/SqlServerBuilder.cs b/Src/Asp.Net/SqlSugar/Realization/SqlServer/SqlBuilder/SqlServerBuilder.cs index 8da0420d9..17cca5765 100644 --- a/Src/Asp.Net/SqlSugar/Realization/SqlServer/SqlBuilder/SqlServerBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Realization/SqlServer/SqlBuilder/SqlServerBuilder.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Data.SqlClient; using System.Linq; using System.Text; using System.Text.RegularExpressions; @@ -11,6 +12,7 @@ namespace SqlSugar { public override string SqlTranslationLeft { get { return "["; } } public override string SqlTranslationRight { get { return "]"; } } + public override bool SupportReadToken { get; set; } = true; public override string RemoveParentheses(string sql) { @@ -31,5 +33,9 @@ namespace SqlSugar paramter.DbType = System.Data.DbType.String; } } + public override Task GetReaderByToken(System.Data.IDataReader dataReader, System.Threading.CancellationToken cancellationToken) + { + return((SqlDataReader)dataReader).ReadAsync(this.Context.Ado.CancellationToken.Value); + } } }