- 修复 fsql.Ado.ExecuteDataTable 当记录不存在时,未返回 Columns 设置 403;

This commit is contained in:
28810 2020-08-03 15:28:51 +08:00
parent c7cd1cda3b
commit 78ac7ab6ae
3 changed files with 78 additions and 50 deletions

View File

@ -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>

View File

@ -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;
} }

View File

@ -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;
} }