From 78ac7ab6aedfc56f3456e197745e7786cd5651c2 Mon Sep 17 00:00:00 2001
From: 28810 <28810@YEXIANGQIN>
Date: Mon, 3 Aug 2020 15:28:51 +0800
Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20fsql.Ado.ExecuteDataTa?=
=?UTF-8?q?ble=20=E5=BD=93=E8=AE=B0=E5=BD=95=E4=B8=8D=E5=AD=98=E5=9C=A8?=
=?UTF-8?q?=E6=97=B6=EF=BC=8C=E6=9C=AA=E8=BF=94=E5=9B=9E=20Columns=20?=
=?UTF-8?q?=E8=AE=BE=E7=BD=AE=20403=EF=BC=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
FreeSql.DbContext/FreeSql.DbContext.xml | 16 ++++++
.../CommonProvider/AdoProvider/AdoProvider.cs | 56 ++++++++++---------
.../AdoProvider/AdoProviderAsync.cs | 56 ++++++++++---------
3 files changed, 78 insertions(+), 50 deletions(-)
diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml
index 65c54b71..e76e3740 100644
--- a/FreeSql.DbContext/FreeSql.DbContext.xml
+++ b/FreeSql.DbContext/FreeSql.DbContext.xml
@@ -125,6 +125,13 @@
清空状态数据
+
+
+ 根据 lambda 条件删除数据
+
+
+
+
添加
@@ -513,5 +520,14 @@
+
+
+ 批量注入 Repository,可以参考代码自行调整
+
+
+
+
+
+
diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs
index 840faa80..977621fd 100644
--- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs
+++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs
@@ -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> fetchHandler, string cmdText, object parms = null) => ExecuteReader(connection, transaction, fetchHandler, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
public void ExecuteReader(Action> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReader(null, null, fetchHandler, cmdType, cmdText, cmdParms);
public void ExecuteReader(DbTransaction transaction, Action> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReader(null, transaction, fetchHandler, cmdType, cmdText, cmdParms);
- public void ExecuteReader(DbConnection connection, DbTransaction transaction, Action> 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, int> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
+ public void ExecuteReader(DbConnection connection, DbTransaction transaction, Action> 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, int> fetchHandler, Action 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 { 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;
}
diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs
index 264ac27e..a16381b2 100644
--- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs
+++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs
@@ -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, Task> fetchHandler, string cmdText, object parms = null) => ExecuteReaderAsync(connection, transaction, fetchHandler, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
public Task ExecuteReaderAsync(Func, Task> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderAsync(null, null, fetchHandler, cmdType, cmdText, cmdParms);
public Task ExecuteReaderAsync(DbTransaction transaction, Func, Task> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderAsync(null, transaction, fetchHandler, cmdType, cmdText, cmdParms);
- public Task ExecuteReaderAsync(DbConnection connection, DbTransaction transaction, Func, 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, int, Task> fetchHandler, CommandType cmdType, string cmdText, params DbParameter[] cmdParms)
+ public Task ExecuteReaderAsync(DbConnection connection, DbTransaction transaction, Func, 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, int, Task> fetchHandler, Action 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 { 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