mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 09:15:27 +08:00 
			
		
		
		
	- 修复 fsql.Ado.ExecuteDataTable 当记录不存在时,未返回 Columns 设置 403;
This commit is contained in:
		@@ -125,6 +125,13 @@
 | 
				
			|||||||
            清空状态数据
 | 
					            清空状态数据
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.DbSet`1.RemoveAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            根据 lambda 条件删除数据
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="predicate"></param>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.DbSet`1.Add(`0)">
 | 
					        <member name="M:FreeSql.DbSet`1.Add(`0)">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            添加
 | 
					            添加
 | 
				
			||||||
@@ -513,5 +520,14 @@
 | 
				
			|||||||
            <param name="that"></param>
 | 
					            <param name="that"></param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:Microsoft.Extensions.DependencyInjection.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{FreeSql.FluentDataFilter},System.Reflection.Assembly[])">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            批量注入 Repository,可以参考代码自行调整
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="services"></param>
 | 
				
			||||||
 | 
					            <param name="globalDataFilter"></param>
 | 
				
			||||||
 | 
					            <param name="assemblies"></param>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
    </members>
 | 
					    </members>
 | 
				
			||||||
</doc>
 | 
					</doc>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -188,7 +188,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                        ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, fetch.Object, 0, _util).Value);
 | 
					                        ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, fetch.Object, 0, _util).Value);
 | 
				
			||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }, cmdType, cmdText, cmdParms);
 | 
					            }, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
            return NativeTuple.Create(ret1, ret2);
 | 
					            return NativeTuple.Create(ret1, ret2);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -273,7 +273,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                        ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, fetch.Object, 0, _util).Value);
 | 
					                        ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(flag3, type3, indexes3, fetch.Object, 0, _util).Value);
 | 
				
			||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }, cmdType, cmdText, cmdParms);
 | 
					            }, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
            return NativeTuple.Create(ret1, ret2, ret3);
 | 
					            return NativeTuple.Create(ret1, ret2, ret3);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -381,7 +381,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                        ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(flag4, type4, indexes4, fetch.Object, 0, _util).Value);
 | 
					                        ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(flag4, type4, indexes4, fetch.Object, 0, _util).Value);
 | 
				
			||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }, cmdType, cmdText, cmdParms);
 | 
					            }, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
            return NativeTuple.Create(ret1, ret2, ret3, ret4);
 | 
					            return NativeTuple.Create(ret1, ret2, ret3, ret4);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -512,7 +512,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                        ret5.Add((T5)Utils.ExecuteArrayRowReadClassOrTuple(flag5, type5, indexes5, fetch.Object, 0, _util).Value);
 | 
					                        ret5.Add((T5)Utils.ExecuteArrayRowReadClassOrTuple(flag5, type5, indexes5, fetch.Object, 0, _util).Value);
 | 
				
			||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }, cmdType, cmdText, cmdParms);
 | 
					            }, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
            return NativeTuple.Create(ret1, ret2, ret3, ret4, ret5);
 | 
					            return NativeTuple.Create(ret1, ret2, ret3, ret4, ret5);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        #endregion
 | 
					        #endregion
 | 
				
			||||||
@@ -522,8 +522,8 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
        public void ExecuteReader(DbConnection connection, DbTransaction transaction, Action<FetchCallbackArgs<DbDataReader>> fetchHandler, string cmdText, object parms = null) => ExecuteReader(connection, transaction, fetchHandler, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public void ExecuteReader(DbConnection connection, DbTransaction transaction, Action<FetchCallbackArgs<DbDataReader>> fetchHandler, string cmdText, object parms = null) => ExecuteReader(connection, transaction, fetchHandler, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public void ExecuteReader(Action<FetchCallbackArgs<DbDataReader>> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReader(null, null, fetchHandler, cmdType, cmdText, cmdParms);
 | 
					        public void ExecuteReader(Action<FetchCallbackArgs<DbDataReader>> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReader(null, null, fetchHandler, cmdType, cmdText, cmdParms);
 | 
				
			||||||
        public void ExecuteReader(DbTransaction transaction, Action<FetchCallbackArgs<DbDataReader>> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReader(null, transaction, fetchHandler, cmdType, cmdText, cmdParms);
 | 
					        public void ExecuteReader(DbTransaction transaction, Action<FetchCallbackArgs<DbDataReader>> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReader(null, transaction, fetchHandler, cmdType, cmdText, cmdParms);
 | 
				
			||||||
        public void ExecuteReader(DbConnection connection, DbTransaction transaction, Action<FetchCallbackArgs<DbDataReader>> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderMultiple(1, connection, transaction, (fetch, result) => fetchHandler(fetch), cmdType, cmdText, cmdParms);
 | 
					        public void ExecuteReader(DbConnection connection, DbTransaction transaction, Action<FetchCallbackArgs<DbDataReader>> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderMultiple(1, connection, transaction, (fetch, result) => fetchHandler(fetch), null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
        void ExecuteReaderMultiple(int multipleResult, DbConnection connection, DbTransaction transaction, Action<FetchCallbackArgs<DbDataReader>, int> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
					        void ExecuteReaderMultiple(int multipleResult, DbConnection connection, DbTransaction transaction, Action<FetchCallbackArgs<DbDataReader>, int> fetchHandler, Action<DbDataReader, int> schemaHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (string.IsNullOrEmpty(cmdText)) return;
 | 
					            if (string.IsNullOrEmpty(cmdText)) return;
 | 
				
			||||||
            var dt = DateTime.Now;
 | 
					            var dt = DateTime.Now;
 | 
				
			||||||
@@ -586,7 +586,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                        LoggerException(pool, pc, new Exception($"连接失败,准备切换其他可用服务器"), dt, logtxt, false);
 | 
					                        LoggerException(pool, pc, new Exception($"连接失败,准备切换其他可用服务器"), dt, logtxt, false);
 | 
				
			||||||
                        pc.cmd.Parameters.Clear();
 | 
					                        pc.cmd.Parameters.Clear();
 | 
				
			||||||
                        if (DataType == DataType.Sqlite) pc.cmd.Dispose();
 | 
					                        if (DataType == DataType.Sqlite) pc.cmd.Dispose();
 | 
				
			||||||
                        ExecuteReaderMultiple(multipleResult, connection, transaction, fetchHandler, cmdType, cmdText, cmdParms);
 | 
					                        ExecuteReaderMultiple(multipleResult, connection, transaction, fetchHandler, schemaHandler, cmdType, cmdText, cmdParms);
 | 
				
			||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -606,9 +606,15 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                    var fetch = new FetchCallbackArgs<DbDataReader> { Object = dr };
 | 
					                    var fetch = new FetchCallbackArgs<DbDataReader> { Object = dr };
 | 
				
			||||||
                    while (true)
 | 
					                    while (true)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
 | 
					                        bool isfirst = true;
 | 
				
			||||||
                        while (true)
 | 
					                        while (true)
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            bool isread = dr.Read();
 | 
					                            bool isread = dr.Read();
 | 
				
			||||||
 | 
					                            if (schemaHandler != null && isfirst)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                isfirst = false;
 | 
				
			||||||
 | 
					                                schemaHandler(dr, resultIndex);
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
                            if (isread == false) break;
 | 
					                            if (isread == false) break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            if (fetchHandler != null)
 | 
					                            if (fetchHandler != null)
 | 
				
			||||||
@@ -676,19 +682,18 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
            DataTable dt = null;
 | 
					            DataTable dt = null;
 | 
				
			||||||
            ExecuteReaderMultiple(16, connection, transaction, (fetch, result) =>
 | 
					            ExecuteReaderMultiple(16, connection, transaction, (fetch, result) =>
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (ret.Tables.Count <= result)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    dt = ret.Tables.Add();
 | 
					 | 
				
			||||||
                    for (var a = 0; a < fetch.Object.FieldCount; a++)
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        var name = fetch.Object.GetName(a);
 | 
					 | 
				
			||||||
                        if (dt.Columns.Contains(name)) name = $"{name}_{Guid.NewGuid().ToString("N").Substring(0, 4)}";
 | 
					 | 
				
			||||||
                        dt.Columns.Add(name, fetch.Object.GetFieldType(a));
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                object[] values = new object[dt.Columns.Count];
 | 
					                object[] values = new object[dt.Columns.Count];
 | 
				
			||||||
                fetch.Object.GetValues(values);
 | 
					                fetch.Object.GetValues(values);
 | 
				
			||||||
                dt.Rows.Add(values);
 | 
					                dt.Rows.Add(values);
 | 
				
			||||||
 | 
					            }, (dr, result) =>
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                dt = ret.Tables.Add();
 | 
				
			||||||
 | 
					                for (var a = 0; a < dr.FieldCount; a++)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    var name = dr.GetName(a);
 | 
				
			||||||
 | 
					                    if (dt.Columns.Contains(name)) name = $"{name}_{Guid.NewGuid().ToString("N").Substring(0, 4)}";
 | 
				
			||||||
 | 
					                    dt.Columns.Add(name, dr.GetFieldType(a));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }, cmdType, cmdText, cmdParms);
 | 
					            }, cmdType, cmdText, cmdParms);
 | 
				
			||||||
            return ret;
 | 
					            return ret;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -700,18 +705,19 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
        public DataTable ExecuteDataTable(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
					        public DataTable ExecuteDataTable(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var ret = new DataTable();
 | 
					            var ret = new DataTable();
 | 
				
			||||||
            ExecuteReader(connection, transaction, fetch =>
 | 
					            ExecuteReaderMultiple(1, connection, transaction, (fetch, result) =>
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (ret.Columns.Count == 0)
 | 
					 | 
				
			||||||
                    for (var a = 0; a < fetch.Object.FieldCount; a++)
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        var name = fetch.Object.GetName(a);
 | 
					 | 
				
			||||||
                        if (ret.Columns.Contains(name)) name = $"{name}_{Guid.NewGuid().ToString("N").Substring(0, 4)}";
 | 
					 | 
				
			||||||
                        ret.Columns.Add(name, fetch.Object.GetFieldType(a));
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                object[] values = new object[ret.Columns.Count];
 | 
					                object[] values = new object[ret.Columns.Count];
 | 
				
			||||||
                fetch.Object.GetValues(values);
 | 
					                fetch.Object.GetValues(values);
 | 
				
			||||||
                ret.Rows.Add(values);
 | 
					                ret.Rows.Add(values);
 | 
				
			||||||
 | 
					            }, (dr, result) =>
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                for (var a = 0; a < dr.FieldCount; a++)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    var name = dr.GetName(a);
 | 
				
			||||||
 | 
					                    if (ret.Columns.Contains(name)) name = $"{name}_{Guid.NewGuid().ToString("N").Substring(0, 4)}";
 | 
				
			||||||
 | 
					                    ret.Columns.Add(name, dr.GetFieldType(a));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }, cmdType, cmdText, cmdParms);
 | 
					            }, cmdType, cmdText, cmdParms);
 | 
				
			||||||
            return ret;
 | 
					            return ret;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -110,7 +110,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                return Task.FromResult(false);
 | 
					                return Task.FromResult(false);
 | 
				
			||||||
            }, cmdType, cmdText, cmdParms);
 | 
					            }, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
            return NativeTuple.Create(ret1, ret2);
 | 
					            return NativeTuple.Create(ret1, ret2);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -196,7 +196,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                return Task.FromResult(false);
 | 
					                return Task.FromResult(false);
 | 
				
			||||||
            }, cmdType, cmdText, cmdParms);
 | 
					            }, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
            return NativeTuple.Create(ret1, ret2, ret3);
 | 
					            return NativeTuple.Create(ret1, ret2, ret3);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -305,7 +305,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                return Task.FromResult(false);
 | 
					                return Task.FromResult(false);
 | 
				
			||||||
            }, cmdType, cmdText, cmdParms);
 | 
					            }, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
            return NativeTuple.Create(ret1, ret2, ret3, ret4);
 | 
					            return NativeTuple.Create(ret1, ret2, ret3, ret4);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -437,7 +437,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                return Task.FromResult(false);
 | 
					                return Task.FromResult(false);
 | 
				
			||||||
            }, cmdType, cmdText, cmdParms);
 | 
					            }, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
            return NativeTuple.Create(ret1, ret2, ret3, ret4, ret5);
 | 
					            return NativeTuple.Create(ret1, ret2, ret3, ret4, ret5);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        #endregion
 | 
					        #endregion
 | 
				
			||||||
@@ -447,8 +447,8 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
        public Task ExecuteReaderAsync(DbConnection connection, DbTransaction transaction, Func<FetchCallbackArgs<DbDataReader>, Task> fetchHandler, string cmdText, object parms = null) => ExecuteReaderAsync(connection, transaction, fetchHandler, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
					        public Task ExecuteReaderAsync(DbConnection connection, DbTransaction transaction, Func<FetchCallbackArgs<DbDataReader>, Task> fetchHandler, string cmdText, object parms = null) => ExecuteReaderAsync(connection, transaction, fetchHandler, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
        public Task ExecuteReaderAsync(Func<FetchCallbackArgs<DbDataReader>, Task> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderAsync(null, null, fetchHandler, cmdType, cmdText, cmdParms);
 | 
					        public Task ExecuteReaderAsync(Func<FetchCallbackArgs<DbDataReader>, Task> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderAsync(null, null, fetchHandler, cmdType, cmdText, cmdParms);
 | 
				
			||||||
        public Task ExecuteReaderAsync(DbTransaction transaction, Func<FetchCallbackArgs<DbDataReader>, Task> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderAsync(null, transaction, fetchHandler, cmdType, cmdText, cmdParms);
 | 
					        public Task ExecuteReaderAsync(DbTransaction transaction, Func<FetchCallbackArgs<DbDataReader>, Task> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderAsync(null, transaction, fetchHandler, cmdType, cmdText, cmdParms);
 | 
				
			||||||
        public Task ExecuteReaderAsync(DbConnection connection, DbTransaction transaction, Func<FetchCallbackArgs<DbDataReader>, Task> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderMultipleAsync(1, connection, transaction, (fetch, result) => fetchHandler(fetch), cmdType, cmdText, cmdParms);
 | 
					        public Task ExecuteReaderAsync(DbConnection connection, DbTransaction transaction, Func<FetchCallbackArgs<DbDataReader>, Task> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderMultipleAsync(1, connection, transaction, (fetch, result) => fetchHandler(fetch), null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
        async Task ExecuteReaderMultipleAsync(int multipleResult, DbConnection connection, DbTransaction transaction, Func<FetchCallbackArgs<DbDataReader>, int, Task> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
					        async Task ExecuteReaderMultipleAsync(int multipleResult, DbConnection connection, DbTransaction transaction, Func<FetchCallbackArgs<DbDataReader>, int, Task> fetchHandler, Action<DbDataReader, int> schemaHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (string.IsNullOrEmpty(cmdText)) return;
 | 
					            if (string.IsNullOrEmpty(cmdText)) return;
 | 
				
			||||||
            var dt = DateTime.Now;
 | 
					            var dt = DateTime.Now;
 | 
				
			||||||
@@ -511,7 +511,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                        LoggerException(pool, pc, new Exception($"连接失败,准备切换其他可用服务器"), dt, logtxt, false);
 | 
					                        LoggerException(pool, pc, new Exception($"连接失败,准备切换其他可用服务器"), dt, logtxt, false);
 | 
				
			||||||
                        pc.cmd.Parameters.Clear();
 | 
					                        pc.cmd.Parameters.Clear();
 | 
				
			||||||
                        if (DataType == DataType.Sqlite) pc.cmd.Dispose();
 | 
					                        if (DataType == DataType.Sqlite) pc.cmd.Dispose();
 | 
				
			||||||
                        await ExecuteReaderMultipleAsync(multipleResult, connection, transaction, fetchHandler, cmdType, cmdText, cmdParms);
 | 
					                        await ExecuteReaderMultipleAsync(multipleResult, connection, transaction, fetchHandler, schemaHandler, cmdType, cmdText, cmdParms);
 | 
				
			||||||
                        return;
 | 
					                        return;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -531,9 +531,15 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
                    var fetch = new FetchCallbackArgs<DbDataReader> { Object = dr };
 | 
					                    var fetch = new FetchCallbackArgs<DbDataReader> { Object = dr };
 | 
				
			||||||
                    while (true)
 | 
					                    while (true)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
 | 
					                        bool isfirst = true;
 | 
				
			||||||
                        while (true)
 | 
					                        while (true)
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            bool isread = await dr.ReadAsync();
 | 
					                            bool isread = await dr.ReadAsync();
 | 
				
			||||||
 | 
					                            if (schemaHandler != null && isfirst)
 | 
				
			||||||
 | 
					                            {
 | 
				
			||||||
 | 
					                                isfirst = false;
 | 
				
			||||||
 | 
					                                schemaHandler(dr, resultIndex);
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
                            if (isread == false) break;
 | 
					                            if (isread == false) break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            if (fetchHandler != null)
 | 
					                            if (fetchHandler != null)
 | 
				
			||||||
@@ -599,19 +605,18 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
            DataTable dt = null;
 | 
					            DataTable dt = null;
 | 
				
			||||||
            await ExecuteReaderMultipleAsync(16, connection, transaction, async (fetch, result) =>
 | 
					            await ExecuteReaderMultipleAsync(16, connection, transaction, async (fetch, result) =>
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (ret.Tables.Count <= result)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    dt = ret.Tables.Add();
 | 
					 | 
				
			||||||
                    for (var a = 0; a < fetch.Object.FieldCount; a++)
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        var name = fetch.Object.GetName(a);
 | 
					 | 
				
			||||||
                        if (dt.Columns.Contains(name)) name = $"{name}_{Guid.NewGuid().ToString("N").Substring(0, 4)}";
 | 
					 | 
				
			||||||
                        dt.Columns.Add(name, fetch.Object.GetFieldType(a));
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                object[] values = new object[dt.Columns.Count];
 | 
					                object[] values = new object[dt.Columns.Count];
 | 
				
			||||||
                for (int a = 0; a < values.Length; a++) if (!await fetch.Object.IsDBNullAsync(a)) values[a] = await fetch.Object.GetFieldValueAsync<object>(a);
 | 
					                for (int a = 0; a < values.Length; a++) if (!await fetch.Object.IsDBNullAsync(a)) values[a] = await fetch.Object.GetFieldValueAsync<object>(a);
 | 
				
			||||||
                dt.Rows.Add(values);
 | 
					                dt.Rows.Add(values);
 | 
				
			||||||
 | 
					            }, (dr, result) =>
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                dt = ret.Tables.Add();
 | 
				
			||||||
 | 
					                for (var a = 0; a < dr.FieldCount; a++)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    var name = dr.GetName(a);
 | 
				
			||||||
 | 
					                    if (dt.Columns.Contains(name)) name = $"{name}_{Guid.NewGuid().ToString("N").Substring(0, 4)}";
 | 
				
			||||||
 | 
					                    dt.Columns.Add(name, dr.GetFieldType(a));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }, cmdType, cmdText, cmdParms);
 | 
					            }, cmdType, cmdText, cmdParms);
 | 
				
			||||||
            return ret;
 | 
					            return ret;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -623,18 +628,19 @@ namespace FreeSql.Internal.CommonProvider
 | 
				
			|||||||
        async public Task<DataTable> ExecuteDataTableAsync(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
					        async public Task<DataTable> ExecuteDataTableAsync(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var ret = new DataTable();
 | 
					            var ret = new DataTable();
 | 
				
			||||||
            await ExecuteReaderAsync(connection, transaction, async fetch =>
 | 
					            await ExecuteReaderMultipleAsync(1, connection, transaction, async (fetch, result) =>
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (ret.Columns.Count == 0)
 | 
					 | 
				
			||||||
                    for (var a = 0; a < fetch.Object.FieldCount; a++)
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        var name = fetch.Object.GetName(a);
 | 
					 | 
				
			||||||
                        if (ret.Columns.Contains(name)) name = $"{name}_{Guid.NewGuid().ToString("N").Substring(0, 4)}";
 | 
					 | 
				
			||||||
                        ret.Columns.Add(name, fetch.Object.GetFieldType(a));
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                object[] values = new object[ret.Columns.Count];
 | 
					                object[] values = new object[ret.Columns.Count];
 | 
				
			||||||
                for (int a = 0; a < values.Length; a++) if (!await fetch.Object.IsDBNullAsync(a)) values[a] = await fetch.Object.GetFieldValueAsync<object>(a);
 | 
					                for (int a = 0; a < values.Length; a++) if (!await fetch.Object.IsDBNullAsync(a)) values[a] = await fetch.Object.GetFieldValueAsync<object>(a);
 | 
				
			||||||
                ret.Rows.Add(values);
 | 
					                ret.Rows.Add(values);
 | 
				
			||||||
 | 
					            }, (dr, result) =>
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                for (var a = 0; a < dr.FieldCount; a++)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    var name = dr.GetName(a);
 | 
				
			||||||
 | 
					                    if (ret.Columns.Contains(name)) name = $"{name}_{Guid.NewGuid().ToString("N").Substring(0, 4)}";
 | 
				
			||||||
 | 
					                    ret.Columns.Add(name, dr.GetFieldType(a));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }, cmdType, cmdText, cmdParms);
 | 
					            }, cmdType, cmdText, cmdParms);
 | 
				
			||||||
            return ret;
 | 
					            return ret;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user