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:
		@@ -188,7 +188,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                        ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(flag2, type2, indexes2, fetch.Object, 0, _util).Value);
 | 
			
		||||
                        break;
 | 
			
		||||
                }
 | 
			
		||||
            }, cmdType, cmdText, cmdParms);
 | 
			
		||||
            }, null, cmdType, cmdText, cmdParms);
 | 
			
		||||
            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);
 | 
			
		||||
                        break;
 | 
			
		||||
                }
 | 
			
		||||
            }, cmdType, cmdText, cmdParms);
 | 
			
		||||
            }, null, cmdType, cmdText, cmdParms);
 | 
			
		||||
            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);
 | 
			
		||||
                        break;
 | 
			
		||||
                }
 | 
			
		||||
            }, cmdType, cmdText, cmdParms);
 | 
			
		||||
            }, null, cmdType, cmdText, cmdParms);
 | 
			
		||||
            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);
 | 
			
		||||
                        break;
 | 
			
		||||
                }
 | 
			
		||||
            }, cmdType, cmdText, cmdParms);
 | 
			
		||||
            }, null, cmdType, cmdText, cmdParms);
 | 
			
		||||
            return NativeTuple.Create(ret1, ret2, ret3, ret4, ret5);
 | 
			
		||||
        }
 | 
			
		||||
        #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(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(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);
 | 
			
		||||
        void ExecuteReaderMultiple(int multipleResult, DbConnection connection, DbTransaction transaction, Action<FetchCallbackArgs<DbDataReader>, int> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] 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, Action<DbDataReader, int> schemaHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
			
		||||
        {
 | 
			
		||||
            if (string.IsNullOrEmpty(cmdText)) return;
 | 
			
		||||
            var dt = DateTime.Now;
 | 
			
		||||
@@ -586,7 +586,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                        LoggerException(pool, pc, new Exception($"连接失败,准备切换其他可用服务器"), dt, logtxt, false);
 | 
			
		||||
                        pc.cmd.Parameters.Clear();
 | 
			
		||||
                        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;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
@@ -606,9 +606,15 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                    var fetch = new FetchCallbackArgs<DbDataReader> { Object = dr };
 | 
			
		||||
                    while (true)
 | 
			
		||||
                    {
 | 
			
		||||
                        bool isfirst = true;
 | 
			
		||||
                        while (true)
 | 
			
		||||
                        {
 | 
			
		||||
                            bool isread = dr.Read();
 | 
			
		||||
                            if (schemaHandler != null && isfirst)
 | 
			
		||||
                            {
 | 
			
		||||
                                isfirst = false;
 | 
			
		||||
                                schemaHandler(dr, resultIndex);
 | 
			
		||||
                            }
 | 
			
		||||
                            if (isread == false) break;
 | 
			
		||||
 | 
			
		||||
                            if (fetchHandler != null)
 | 
			
		||||
@@ -676,19 +682,18 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
            DataTable dt = null;
 | 
			
		||||
            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];
 | 
			
		||||
                fetch.Object.GetValues(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);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
@@ -700,18 +705,19 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
        public DataTable ExecuteDataTable(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
			
		||||
        {
 | 
			
		||||
            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];
 | 
			
		||||
                fetch.Object.GetValues(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);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -110,7 +110,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                        break;
 | 
			
		||||
                }
 | 
			
		||||
                return Task.FromResult(false);
 | 
			
		||||
            }, cmdType, cmdText, cmdParms);
 | 
			
		||||
            }, null, cmdType, cmdText, cmdParms);
 | 
			
		||||
            return NativeTuple.Create(ret1, ret2);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -196,7 +196,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                        break;
 | 
			
		||||
                }
 | 
			
		||||
                return Task.FromResult(false);
 | 
			
		||||
            }, cmdType, cmdText, cmdParms);
 | 
			
		||||
            }, null, cmdType, cmdText, cmdParms);
 | 
			
		||||
            return NativeTuple.Create(ret1, ret2, ret3);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -305,7 +305,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                        break;
 | 
			
		||||
                }
 | 
			
		||||
                return Task.FromResult(false);
 | 
			
		||||
            }, cmdType, cmdText, cmdParms);
 | 
			
		||||
            }, null, cmdType, cmdText, cmdParms);
 | 
			
		||||
            return NativeTuple.Create(ret1, ret2, ret3, ret4);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -437,7 +437,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                        break;
 | 
			
		||||
                }
 | 
			
		||||
                return Task.FromResult(false);
 | 
			
		||||
            }, cmdType, cmdText, cmdParms);
 | 
			
		||||
            }, null, cmdType, cmdText, cmdParms);
 | 
			
		||||
            return NativeTuple.Create(ret1, ret2, ret3, ret4, ret5);
 | 
			
		||||
        }
 | 
			
		||||
        #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(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(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);
 | 
			
		||||
        async Task ExecuteReaderMultipleAsync(int multipleResult, DbConnection connection, DbTransaction transaction, Func<FetchCallbackArgs<DbDataReader>, int, Task> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] 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, Action<DbDataReader, int> schemaHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
 | 
			
		||||
        {
 | 
			
		||||
            if (string.IsNullOrEmpty(cmdText)) return;
 | 
			
		||||
            var dt = DateTime.Now;
 | 
			
		||||
@@ -511,7 +511,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                        LoggerException(pool, pc, new Exception($"连接失败,准备切换其他可用服务器"), dt, logtxt, false);
 | 
			
		||||
                        pc.cmd.Parameters.Clear();
 | 
			
		||||
                        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;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
@@ -531,9 +531,15 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                    var fetch = new FetchCallbackArgs<DbDataReader> { Object = dr };
 | 
			
		||||
                    while (true)
 | 
			
		||||
                    {
 | 
			
		||||
                        bool isfirst = true;
 | 
			
		||||
                        while (true)
 | 
			
		||||
                        {
 | 
			
		||||
                            bool isread = await dr.ReadAsync();
 | 
			
		||||
                            if (schemaHandler != null && isfirst)
 | 
			
		||||
                            {
 | 
			
		||||
                                isfirst = false;
 | 
			
		||||
                                schemaHandler(dr, resultIndex);
 | 
			
		||||
                            }
 | 
			
		||||
                            if (isread == false) break;
 | 
			
		||||
 | 
			
		||||
                            if (fetchHandler != null)
 | 
			
		||||
@@ -599,19 +605,18 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
            DataTable dt = null;
 | 
			
		||||
            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];
 | 
			
		||||
                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);
 | 
			
		||||
            }, (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);
 | 
			
		||||
            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)
 | 
			
		||||
        {
 | 
			
		||||
            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];
 | 
			
		||||
                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);
 | 
			
		||||
            }, (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);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user