mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 02:32:50 +08:00
- 增加 IAdo.Query<T1, T2 ...> 多结果集查询;
- 增加 IAdo.ExecuteDataSet 多结果集查询;
This commit is contained in:
parent
6c64eac419
commit
1da596db01
@ -93,6 +93,23 @@ namespace FreeSql {
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="cmdText"></param>
|
/// <param name="cmdText"></param>
|
||||||
/// <param name="cmdParms"></param>
|
/// <param name="cmdParms"></param>
|
||||||
|
DataSet ExecuteDataSet(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
DataSet ExecuteDataSet(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
DataSet ExecuteDataSet(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
/// <summary>
|
||||||
|
/// 查询,ExecuteDataSet("select * from user where age > @age; select 2", new { age = 25 })
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="cmdText"></param>
|
||||||
|
/// <param name="parms"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
DataSet ExecuteDataSet(string cmdText, object parms = null);
|
||||||
|
DataSet ExecuteDataSet(DbTransaction transaction, string cmdText, object parms = null);
|
||||||
|
DataSet ExecuteDataSet(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
|
||||||
|
/// <summary>
|
||||||
|
/// 查询
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="cmdText"></param>
|
||||||
|
/// <param name="cmdParms"></param>
|
||||||
DataTable ExecuteDataTable(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
DataTable ExecuteDataTable(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
DataTable ExecuteDataTable(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
DataTable ExecuteDataTable(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
DataTable ExecuteDataTable(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
DataTable ExecuteDataTable(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
@ -145,7 +162,7 @@ namespace FreeSql {
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 执行SQL返回对象集合,Query<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 })
|
/// 执行SQL返回对象集合,Query<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 })
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="T"></typeparam>
|
/// <typeparam name="T1"></typeparam>
|
||||||
/// <param name="cmdType"></param>
|
/// <param name="cmdType"></param>
|
||||||
/// <param name="cmdText"></param>
|
/// <param name="cmdText"></param>
|
||||||
/// <param name="cmdParms"></param>
|
/// <param name="cmdParms"></param>
|
||||||
@ -156,7 +173,7 @@ namespace FreeSql {
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 执行SQL返回对象集合,Query<User>("select * from user where age > @age", new { age = 25 })
|
/// 执行SQL返回对象集合,Query<User>("select * from user where age > @age", new { age = 25 })
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="T"></typeparam>
|
/// <typeparam name="T1"></typeparam>
|
||||||
/// <param name="cmdText"></param>
|
/// <param name="cmdText"></param>
|
||||||
/// <param name="parms"></param>
|
/// <param name="parms"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
@ -164,6 +181,47 @@ namespace FreeSql {
|
|||||||
List<T> Query<T>(DbTransaction transaction, string cmdText, object parms = null);
|
List<T> Query<T>(DbTransaction transaction, string cmdText, object parms = null);
|
||||||
List<T> Query<T>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
|
List<T> Query<T>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 })
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T1"></typeparam>
|
||||||
|
/// <param name="cmdType"></param>
|
||||||
|
/// <param name="cmdText"></param>
|
||||||
|
/// <param name="cmdParms"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
(List<T1>, List<T2>) Query<T1, T2>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
(List<T1>, List<T2>) Query<T1, T2>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
(List<T1>, List<T2>) Query<T1, T2>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
/// <summary>
|
||||||
|
/// 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new { age = 25 })
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T1"></typeparam>
|
||||||
|
/// <param name="cmdText"></param>
|
||||||
|
/// <param name="parms"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
(List<T1>, List<T2>) Query<T1, T2>(string cmdText, object parms = null);
|
||||||
|
(List<T1>, List<T2>) Query<T1, T2>(DbTransaction transaction, string cmdText, object parms = null);
|
||||||
|
(List<T1>, List<T2>) Query<T1, T2>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
|
||||||
|
|
||||||
|
(List<T1>, List<T2>, List<T3>) Query<T1, T2, T3>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
(List<T1>, List<T2>, List<T3>) Query<T1, T2, T3>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
(List<T1>, List<T2>, List<T3>) Query<T1, T2, T3>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
(List<T1>, List<T2>, List<T3>) Query<T1, T2, T3>(string cmdText, object parms = null);
|
||||||
|
(List<T1>, List<T2>, List<T3>) Query<T1, T2, T3>(DbTransaction transaction, string cmdText, object parms = null);
|
||||||
|
(List<T1>, List<T2>, List<T3>) Query<T1, T2, T3>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
|
||||||
|
(List<T1>, List<T2>, List<T3>, List<T4>) Query<T1, T2, T3, T4>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
(List<T1>, List<T2>, List<T3>, List<T4>) Query<T1, T2, T3, T4>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
(List<T1>, List<T2>, List<T3>, List<T4>) Query<T1, T2, T3, T4>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
(List<T1>, List<T2>, List<T3>, List<T4>) Query<T1, T2, T3, T4>(string cmdText, object parms = null);
|
||||||
|
(List<T1>, List<T2>, List<T3>, List<T4>) Query<T1, T2, T3, T4>(DbTransaction transaction, string cmdText, object parms = null);
|
||||||
|
(List<T1>, List<T2>, List<T3>, List<T4>) Query<T1, T2, T3, T4>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
|
||||||
|
(List<T1>, List<T2>, List<T3>, List<T4>, List<T5>) Query<T1, T2, T3, T4, T5>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
(List<T1>, List<T2>, List<T3>, List<T4>, List<T5>) Query<T1, T2, T3, T4, T5>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
(List<T1>, List<T2>, List<T3>, List<T4>, List<T5>) Query<T1, T2, T3, T4, T5>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
(List<T1>, List<T2>, List<T3>, List<T4>, List<T5>) Query<T1, T2, T3, T4, T5>(string cmdText, object parms = null);
|
||||||
|
(List<T1>, List<T2>, List<T3>, List<T4>, List<T5>) Query<T1, T2, T3, T4, T5>(DbTransaction transaction, string cmdText, object parms = null);
|
||||||
|
(List<T1>, List<T2>, List<T3>, List<T4>, List<T5>) Query<T1, T2, T3, T4, T5>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
|
||||||
|
|
||||||
#region async
|
#region async
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】
|
/// 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】
|
||||||
@ -205,6 +263,23 @@ namespace FreeSql {
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="cmdText"></param>
|
/// <param name="cmdText"></param>
|
||||||
/// <param name="cmdParms"></param>
|
/// <param name="cmdParms"></param>
|
||||||
|
Task<DataSet> ExecuteDataSetAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
Task<DataSet> ExecuteDataSetAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
Task<DataSet> ExecuteDataSetAsync(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
/// <summary>
|
||||||
|
/// 查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 })
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="cmdText"></param>
|
||||||
|
/// <param name="parms"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<DataSet> ExecuteDataSetAsync(string cmdText, object parms = null);
|
||||||
|
Task<DataSet> ExecuteDataSetAsync(DbTransaction transaction, string cmdText, object parms = null);
|
||||||
|
Task<DataSet> ExecuteDataSetAsync(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
|
||||||
|
/// <summary>
|
||||||
|
/// 查询
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="cmdText"></param>
|
||||||
|
/// <param name="cmdParms"></param>
|
||||||
Task<DataTable> ExecuteDataTableAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
Task<DataTable> ExecuteDataTableAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
Task<DataTable> ExecuteDataTableAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
Task<DataTable> ExecuteDataTableAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
Task<DataTable> ExecuteDataTableAsync(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
Task<DataTable> ExecuteDataTableAsync(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
@ -275,6 +350,47 @@ namespace FreeSql {
|
|||||||
Task<List<T>> QueryAsync<T>(string cmdText, object parms = null);
|
Task<List<T>> QueryAsync<T>(string cmdText, object parms = null);
|
||||||
Task<List<T>> QueryAsync<T>(DbTransaction transaction, string cmdText, object parms = null);
|
Task<List<T>> QueryAsync<T>(DbTransaction transaction, string cmdText, object parms = null);
|
||||||
Task<List<T>> QueryAsync<T>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
|
Task<List<T>> QueryAsync<T>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 })
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T1"></typeparam>
|
||||||
|
/// <param name="cmdType"></param>
|
||||||
|
/// <param name="cmdText"></param>
|
||||||
|
/// <param name="cmdParms"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<(List<T1>, List<T2>)> QueryAsync<T1, T2>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
Task<(List<T1>, List<T2>)> QueryAsync<T1, T2>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
Task<(List<T1>, List<T2>)> QueryAsync<T1, T2>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
/// <summary>
|
||||||
|
/// 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new { age = 25 })
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T1"></typeparam>
|
||||||
|
/// <param name="cmdText"></param>
|
||||||
|
/// <param name="parms"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<(List<T1>, List<T2>)> QueryAsync<T1, T2>(string cmdText, object parms = null);
|
||||||
|
Task<(List<T1>, List<T2>)> QueryAsync<T1, T2>(DbTransaction transaction, string cmdText, object parms = null);
|
||||||
|
Task<(List<T1>, List<T2>)> QueryAsync<T1, T2>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
|
||||||
|
|
||||||
|
Task<(List<T1>, List<T2>, List<T3>)> QueryAsync<T1, T2, T3>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
Task<(List<T1>, List<T2>, List<T3>)> QueryAsync<T1, T2, T3>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
Task<(List<T1>, List<T2>, List<T3>)> QueryAsync<T1, T2, T3>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
Task<(List<T1>, List<T2>, List<T3>)> QueryAsync<T1, T2, T3>(string cmdText, object parms = null);
|
||||||
|
Task<(List<T1>, List<T2>, List<T3>)> QueryAsync<T1, T2, T3>(DbTransaction transaction, string cmdText, object parms = null);
|
||||||
|
Task<(List<T1>, List<T2>, List<T3>)> QueryAsync<T1, T2, T3>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
|
||||||
|
Task<(List<T1>, List<T2>, List<T3>, List<T4>)> QueryAsync<T1, T2, T3, T4>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
Task<(List<T1>, List<T2>, List<T3>, List<T4>)> QueryAsync<T1, T2, T3, T4>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
Task<(List<T1>, List<T2>, List<T3>, List<T4>)> QueryAsync<T1, T2, T3, T4>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
Task<(List<T1>, List<T2>, List<T3>, List<T4>)> QueryAsync<T1, T2, T3, T4>(string cmdText, object parms = null);
|
||||||
|
Task<(List<T1>, List<T2>, List<T3>, List<T4>)> QueryAsync<T1, T2, T3, T4>(DbTransaction transaction, string cmdText, object parms = null);
|
||||||
|
Task<(List<T1>, List<T2>, List<T3>, List<T4>)> QueryAsync<T1, T2, T3, T4>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
|
||||||
|
Task<(List<T1>, List<T2>, List<T3>, List<T4>, List<T5>)> QueryAsync<T1, T2, T3, T4, T5>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
Task<(List<T1>, List<T2>, List<T3>, List<T4>, List<T5>)> QueryAsync<T1, T2, T3, T4, T5>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
Task<(List<T1>, List<T2>, List<T3>, List<T4>, List<T5>)> QueryAsync<T1, T2, T3, T4, T5>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
|
||||||
|
Task<(List<T1>, List<T2>, List<T3>, List<T4>, List<T5>)> QueryAsync<T1, T2, T3, T4, T5>(string cmdText, object parms = null);
|
||||||
|
Task<(List<T1>, List<T2>, List<T3>, List<T4>, List<T5>)> QueryAsync<T1, T2, T3, T4, T5>(DbTransaction transaction, string cmdText, object parms = null);
|
||||||
|
Task<(List<T1>, List<T2>, List<T3>, List<T4>, List<T5>)> QueryAsync<T1, T2, T3, T4, T5>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null);
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -98,12 +98,263 @@ namespace FreeSql.Internal.CommonProvider {
|
|||||||
}, cmdType, cmdText, cmdParms);
|
}, cmdType, cmdText, cmdParms);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
#region query multi
|
||||||
|
public (List<T1>, List<T2>) Query<T1, T2>(string cmdText, object parms = null) => Query<T1, T2>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public (List<T1>, List<T2>) Query<T1, T2>(DbTransaction transaction, string cmdText, object parms = null) => Query<T1, T2>(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public (List<T1>, List<T2>) Query<T1, T2>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => Query<T1, T2>(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public (List<T1>, List<T2>) Query<T1, T2>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T1, T2>(null, null, cmdType, cmdText, cmdParms);
|
||||||
|
public (List<T1>, List<T2>) Query<T1, T2>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T1, T2>(null, transaction, cmdType, cmdText, cmdParms);
|
||||||
|
public (List<T1>, List<T2>) Query<T1, T2>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
|
||||||
|
if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>());
|
||||||
|
var ret1 = new List<T1>();
|
||||||
|
var type1 = typeof(T1);
|
||||||
|
int[] indexes1 = null;
|
||||||
|
var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
|
||||||
|
|
||||||
|
var ret2 = new List<T2>();
|
||||||
|
var type2 = typeof(T2);
|
||||||
|
int[] indexes2 = null;
|
||||||
|
var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
|
||||||
|
ExecuteReaderMultiple(2, connection, transaction, (dr, result) => {
|
||||||
|
switch(result) {
|
||||||
|
case 0:
|
||||||
|
if (indexes1 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(type1, indexes1, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if (indexes2 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(type2, indexes2, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}, cmdType, cmdText, cmdParms);
|
||||||
|
return (ret1, ret2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public (List<T1>, List<T2>, List<T3>) Query<T1, T2, T3>(string cmdText, object parms = null) => Query<T1, T2, T3>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public (List<T1>, List<T2>, List<T3>) Query<T1, T2, T3>(DbTransaction transaction, string cmdText, object parms = null) => Query<T1, T2, T3>(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public (List<T1>, List<T2>, List<T3>) Query<T1, T2, T3>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => Query<T1, T2, T3>(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public (List<T1>, List<T2>, List<T3>) Query<T1, T2, T3>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T1, T2, T3>(null, null, cmdType, cmdText, cmdParms);
|
||||||
|
public (List<T1>, List<T2>, List<T3>) Query<T1, T2, T3>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T1, T2, T3>(null, transaction, cmdType, cmdText, cmdParms);
|
||||||
|
public (List<T1>, List<T2>, List<T3>) Query<T1, T2, T3>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
|
||||||
|
if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>());
|
||||||
|
var ret1 = new List<T1>();
|
||||||
|
var type1 = typeof(T1);
|
||||||
|
int[] indexes1 = null;
|
||||||
|
var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
|
||||||
|
|
||||||
|
var ret2 = new List<T2>();
|
||||||
|
var type2 = typeof(T2);
|
||||||
|
int[] indexes2 = null;
|
||||||
|
var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
|
||||||
|
|
||||||
|
var ret3 = new List<T3>();
|
||||||
|
var type3 = typeof(T3);
|
||||||
|
int[] indexes3 = null;
|
||||||
|
var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
|
||||||
|
ExecuteReaderMultiple(3, connection, transaction, (dr, result) => {
|
||||||
|
switch (result) {
|
||||||
|
case 0:
|
||||||
|
if (indexes1 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(type1, indexes1, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if (indexes2 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(type2, indexes2, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if (indexes3 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes3 = props3.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(type3, indexes3, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}, cmdType, cmdText, cmdParms);
|
||||||
|
return (ret1, ret2, ret3);
|
||||||
|
}
|
||||||
|
|
||||||
|
public (List<T1>, List<T2>, List<T3>, List<T4>) Query<T1, T2, T3, T4>(string cmdText, object parms = null) => Query<T1, T2, T3, T4>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public (List<T1>, List<T2>, List<T3>, List<T4>) Query<T1, T2, T3, T4>(DbTransaction transaction, string cmdText, object parms = null) => Query<T1, T2, T3, T4>(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public (List<T1>, List<T2>, List<T3>, List<T4>) Query<T1, T2, T3, T4>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => Query<T1, T2, T3, T4>(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public (List<T1>, List<T2>, List<T3>, List<T4>) Query<T1, T2, T3, T4>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T1, T2, T3, T4>(null, null, cmdType, cmdText, cmdParms);
|
||||||
|
public (List<T1>, List<T2>, List<T3>, List<T4>) Query<T1, T2, T3, T4>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T1, T2, T3, T4>(null, transaction, cmdType, cmdText, cmdParms);
|
||||||
|
public (List<T1>, List<T2>, List<T3>, List<T4>) Query<T1, T2, T3, T4>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
|
||||||
|
if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>());
|
||||||
|
var ret1 = new List<T1>();
|
||||||
|
var type1 = typeof(T1);
|
||||||
|
int[] indexes1 = null;
|
||||||
|
var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
|
||||||
|
|
||||||
|
var ret2 = new List<T2>();
|
||||||
|
var type2 = typeof(T2);
|
||||||
|
int[] indexes2 = null;
|
||||||
|
var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
|
||||||
|
|
||||||
|
var ret3 = new List<T3>();
|
||||||
|
var type3 = typeof(T3);
|
||||||
|
int[] indexes3 = null;
|
||||||
|
var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
|
||||||
|
|
||||||
|
var ret4 = new List<T4>();
|
||||||
|
var type4 = typeof(T4);
|
||||||
|
int[] indexes4 = null;
|
||||||
|
var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties());
|
||||||
|
ExecuteReaderMultiple(4, connection, transaction, (dr, result) => {
|
||||||
|
switch (result) {
|
||||||
|
case 0:
|
||||||
|
if (indexes1 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(type1, indexes1, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if (indexes2 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(type2, indexes2, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if (indexes3 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes3 = props3.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(type3, indexes3, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if (indexes4 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes4 = props4.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(type4, indexes4, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}, cmdType, cmdText, cmdParms);
|
||||||
|
return (ret1, ret2, ret3, ret4);
|
||||||
|
}
|
||||||
|
|
||||||
|
public (List<T1>, List<T2>, List<T3>, List<T4>, List<T5>) Query<T1, T2, T3, T4, T5>(string cmdText, object parms = null) => Query<T1, T2, T3, T4, T5>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public (List<T1>, List<T2>, List<T3>, List<T4>, List<T5>) Query<T1, T2, T3, T4, T5>(DbTransaction transaction, string cmdText, object parms = null) => Query<T1, T2, T3, T4, T5>(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public (List<T1>, List<T2>, List<T3>, List<T4>, List<T5>) Query<T1, T2, T3, T4, T5>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => Query<T1, T2, T3, T4, T5>(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public (List<T1>, List<T2>, List<T3>, List<T4>, List<T5>) Query<T1, T2, T3, T4, T5>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T1, T2, T3, T4, T5>(null, null, cmdType, cmdText, cmdParms);
|
||||||
|
public (List<T1>, List<T2>, List<T3>, List<T4>, List<T5>) Query<T1, T2, T3, T4, T5>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T1, T2, T3, T4, T5>(null, transaction, cmdType, cmdText, cmdParms);
|
||||||
|
public (List<T1>, List<T2>, List<T3>, List<T4>, List<T5>) Query<T1, T2, T3, T4, T5>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
|
||||||
|
if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>(), new List<T5>());
|
||||||
|
var ret1 = new List<T1>();
|
||||||
|
var type1 = typeof(T1);
|
||||||
|
int[] indexes1 = null;
|
||||||
|
var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
|
||||||
|
|
||||||
|
var ret2 = new List<T2>();
|
||||||
|
var type2 = typeof(T2);
|
||||||
|
int[] indexes2 = null;
|
||||||
|
var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
|
||||||
|
|
||||||
|
var ret3 = new List<T3>();
|
||||||
|
var type3 = typeof(T3);
|
||||||
|
int[] indexes3 = null;
|
||||||
|
var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
|
||||||
|
|
||||||
|
var ret4 = new List<T4>();
|
||||||
|
var type4 = typeof(T4);
|
||||||
|
int[] indexes4 = null;
|
||||||
|
var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties());
|
||||||
|
|
||||||
|
var ret5 = new List<T5>();
|
||||||
|
var type5 = typeof(T5);
|
||||||
|
int[] indexes5 = null;
|
||||||
|
var props5 = dicQueryTypeGetProperties.GetOrAdd(type5, k => type1.GetProperties());
|
||||||
|
ExecuteReaderMultiple(5, connection, transaction, (dr, result) => {
|
||||||
|
switch (result) {
|
||||||
|
case 0:
|
||||||
|
if (indexes1 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(type1, indexes1, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if (indexes2 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(type2, indexes2, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if (indexes3 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes3 = props3.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(type3, indexes3, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if (indexes4 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes4 = props4.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(type4, indexes4, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
if (indexes5 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes5 = props5.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret5.Add((T5)Utils.ExecuteArrayRowReadClassOrTuple(type5, indexes5, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}, cmdType, cmdText, cmdParms);
|
||||||
|
return (ret1, ret2, ret3, ret4, ret5);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
public void ExecuteReader(Action<DbDataReader> readerHander, string cmdText, object parms = null) => ExecuteReader(null, null, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
public void ExecuteReader(Action<DbDataReader> readerHander, string cmdText, object parms = null) => ExecuteReader(null, null, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
public void ExecuteReader(DbTransaction transaction, Action<DbDataReader> readerHander, string cmdText, object parms = null) => ExecuteReader(null, transaction, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
public void ExecuteReader(DbTransaction transaction, Action<DbDataReader> readerHander, string cmdText, object parms = null) => ExecuteReader(null, transaction, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
public void ExecuteReader(DbConnection connection, DbTransaction transaction, Action<DbDataReader> readerHander, string cmdText, object parms = null) => ExecuteReader(connection, transaction, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
public void ExecuteReader(DbConnection connection, DbTransaction transaction, Action<DbDataReader> readerHander, string cmdText, object parms = null) => ExecuteReader(connection, transaction, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
public void ExecuteReader(Action<DbDataReader> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReader(null, null, readerHander, cmdType, cmdText, cmdParms);
|
public void ExecuteReader(Action<DbDataReader> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReader(null, null, readerHander, cmdType, cmdText, cmdParms);
|
||||||
public void ExecuteReader(DbTransaction transaction, Action<DbDataReader> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReader(null, transaction, readerHander, cmdType, cmdText, cmdParms);
|
public void ExecuteReader(DbTransaction transaction, Action<DbDataReader> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReader(null, transaction, readerHander, cmdType, cmdText, cmdParms);
|
||||||
public void ExecuteReader(DbConnection connection, DbTransaction transaction, Action<DbDataReader> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
|
public void ExecuteReader(DbConnection connection, DbTransaction transaction, Action<DbDataReader> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderMultiple(1, connection, transaction, (dr, result) => readerHander(dr), cmdType, cmdText, cmdParms);
|
||||||
|
void ExecuteReaderMultiple(int multipleResult, DbConnection connection, DbTransaction transaction, Action<DbDataReader, int> readerHander, 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;
|
||||||
var logtxt = new StringBuilder();
|
var logtxt = new StringBuilder();
|
||||||
@ -151,7 +402,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();
|
||||||
ExecuteReader(readerHander, cmdType, cmdText, cmdParms);
|
ExecuteReaderMultiple(multipleResult, connection, transaction, readerHander, cmdType, cmdText, cmdParms);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -164,24 +415,28 @@ namespace FreeSql.Internal.CommonProvider {
|
|||||||
}
|
}
|
||||||
using (var dr = pc.cmd.ExecuteReader()) {
|
using (var dr = pc.cmd.ExecuteReader()) {
|
||||||
if (IsTracePerformance) logtxt.Append("ExecuteReader: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms\r\n");
|
if (IsTracePerformance) logtxt.Append("ExecuteReader: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms\r\n");
|
||||||
|
int resultIndex = 0;
|
||||||
while (true) {
|
while (true) {
|
||||||
if (IsTracePerformance) logtxt_dt = DateTime.Now;
|
while (true) {
|
||||||
bool isread = dr.Read();
|
if (IsTracePerformance) logtxt_dt = DateTime.Now;
|
||||||
if (IsTracePerformance) logtxt.Append(" dr.Read: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms\r\n");
|
bool isread = dr.Read();
|
||||||
if (isread == false) break;
|
if (IsTracePerformance) logtxt.Append(" dr.Read: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms\r\n");
|
||||||
|
if (isread == false) break;
|
||||||
|
|
||||||
if (readerHander != null) {
|
if (readerHander != null) {
|
||||||
object[] values = null;
|
object[] values = null;
|
||||||
if (IsTracePerformance) {
|
if (IsTracePerformance) {
|
||||||
logtxt_dt = DateTime.Now;
|
logtxt_dt = DateTime.Now;
|
||||||
values = new object[dr.FieldCount];
|
values = new object[dr.FieldCount];
|
||||||
dr.GetValues(values);
|
dr.GetValues(values);
|
||||||
logtxt.Append(" dr.GetValues: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms\r\n");
|
logtxt.Append(" dr.GetValues: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms\r\n");
|
||||||
logtxt_dt = DateTime.Now;
|
logtxt_dt = DateTime.Now;
|
||||||
|
}
|
||||||
|
readerHander(dr, resultIndex);
|
||||||
|
if (IsTracePerformance) logtxt.Append(" readerHander: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms (").Append(string.Join(", ", values)).Append(")\r\n");
|
||||||
}
|
}
|
||||||
readerHander(dr);
|
|
||||||
if (IsTracePerformance) logtxt.Append(" readerHander: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms (").Append(string.Join(", ", values)).Append(")\r\n");
|
|
||||||
}
|
}
|
||||||
|
if (++resultIndex >= multipleResult || dr.NextResult() == false) break;
|
||||||
}
|
}
|
||||||
if (IsTracePerformance) logtxt_dt = DateTime.Now;
|
if (IsTracePerformance) logtxt_dt = DateTime.Now;
|
||||||
dr.Close();
|
dr.Close();
|
||||||
@ -213,6 +468,25 @@ namespace FreeSql.Internal.CommonProvider {
|
|||||||
}, cmdType, cmdText, cmdParms);
|
}, cmdType, cmdText, cmdParms);
|
||||||
return ret.ToArray();
|
return ret.ToArray();
|
||||||
}
|
}
|
||||||
|
public DataSet ExecuteDataSet(string cmdText, object parms = null) => ExecuteDataSet(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public DataSet ExecuteDataSet(DbTransaction transaction, string cmdText, object parms = null) => ExecuteDataSet(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public DataSet ExecuteDataSet(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => ExecuteDataSet(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public DataSet ExecuteDataSet(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteDataSet(null, null, cmdType, cmdText, cmdParms);
|
||||||
|
public DataSet ExecuteDataSet(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteDataSet(null, transaction, cmdType, cmdText, cmdParms);
|
||||||
|
public DataSet ExecuteDataSet(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
|
||||||
|
var ret = new DataSet();
|
||||||
|
DataTable dt = null;
|
||||||
|
ExecuteReaderMultiple(16, connection, transaction, (dr, result) => {
|
||||||
|
if (ret.Tables.Count <= result) {
|
||||||
|
dt = ret.Tables.Add();
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++) dt.Columns.Add(dr.GetName(a));
|
||||||
|
}
|
||||||
|
object[] values = new object[dt.Columns.Count];
|
||||||
|
dr.GetValues(values);
|
||||||
|
dt.Rows.Add(values);
|
||||||
|
}, cmdType, cmdText, cmdParms);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
public DataTable ExecuteDataTable(string cmdText, object parms = null) => ExecuteDataTable(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
public DataTable ExecuteDataTable(string cmdText, object parms = null) => ExecuteDataTable(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
public DataTable ExecuteDataTable(DbTransaction transaction, string cmdText, object parms = null) => ExecuteDataTable(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
public DataTable ExecuteDataTable(DbTransaction transaction, string cmdText, object parms = null) => ExecuteDataTable(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
public DataTable ExecuteDataTable(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => ExecuteDataTable(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
public DataTable ExecuteDataTable(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => ExecuteDataTable(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
@ -323,7 +597,7 @@ namespace FreeSql.Internal.CommonProvider {
|
|||||||
isclose = true;
|
isclose = true;
|
||||||
}
|
}
|
||||||
cmd.Connection = connection;
|
cmd.Connection = connection;
|
||||||
if (transaction.Connection == connection)
|
if (transaction?.Connection == connection)
|
||||||
cmd.Transaction = transaction;
|
cmd.Transaction = transaction;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,12 +32,267 @@ namespace FreeSql.Internal.CommonProvider {
|
|||||||
}, cmdType, cmdText, cmdParms);
|
}, cmdType, cmdText, cmdParms);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
#region QueryAsync multi
|
||||||
|
public Task<(List<T1>, List<T2>)> QueryAsync<T1, T2>(string cmdText, object parms = null) => QueryAsync<T1, T2>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public Task<(List<T1>, List<T2>)> QueryAsync<T1, T2>(DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T1, T2>(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public Task<(List<T1>, List<T2>)> QueryAsync<T1, T2>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T1, T2>(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public Task<(List<T1>, List<T2>)> QueryAsync<T1, T2>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T1, T2>(null, null, cmdType, cmdText, cmdParms);
|
||||||
|
public Task<(List<T1>, List<T2>)> QueryAsync<T1, T2>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T1, T2>(null, transaction, cmdType, cmdText, cmdParms);
|
||||||
|
async public Task<(List<T1>, List<T2>)> QueryAsync<T1, T2>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
|
||||||
|
if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>());
|
||||||
|
var ret1 = new List<T1>();
|
||||||
|
var type1 = typeof(T1);
|
||||||
|
int[] indexes1 = null;
|
||||||
|
var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
|
||||||
|
|
||||||
|
var ret2 = new List<T2>();
|
||||||
|
var type2 = typeof(T2);
|
||||||
|
int[] indexes2 = null;
|
||||||
|
var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
|
||||||
|
await ExecuteReaderMultipleAsync(2, connection, transaction, (dr, result) => {
|
||||||
|
switch (result) {
|
||||||
|
case 0:
|
||||||
|
if (indexes1 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(type1, indexes1, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if (indexes2 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(type2, indexes2, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}, cmdType, cmdText, cmdParms);
|
||||||
|
return (ret1, ret2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<(List<T1>, List<T2>, List<T3>)> QueryAsync<T1, T2, T3>(string cmdText, object parms = null) => QueryAsync<T1, T2, T3>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public Task<(List<T1>, List<T2>, List<T3>)> QueryAsync<T1, T2, T3>(DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T1, T2, T3>(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public Task<(List<T1>, List<T2>, List<T3>)> QueryAsync<T1, T2, T3>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T1, T2, T3>(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public Task<(List<T1>, List<T2>, List<T3>)> QueryAsync<T1, T2, T3>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T1, T2, T3>(null, null, cmdType, cmdText, cmdParms);
|
||||||
|
public Task<(List<T1>, List<T2>, List<T3>)> QueryAsync<T1, T2, T3>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T1, T2, T3>(null, transaction, cmdType, cmdText, cmdParms);
|
||||||
|
async public Task<(List<T1>, List<T2>, List<T3>)> QueryAsync<T1, T2, T3>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
|
||||||
|
if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>());
|
||||||
|
var ret1 = new List<T1>();
|
||||||
|
var type1 = typeof(T1);
|
||||||
|
int[] indexes1 = null;
|
||||||
|
var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
|
||||||
|
|
||||||
|
var ret2 = new List<T2>();
|
||||||
|
var type2 = typeof(T2);
|
||||||
|
int[] indexes2 = null;
|
||||||
|
var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
|
||||||
|
|
||||||
|
var ret3 = new List<T3>();
|
||||||
|
var type3 = typeof(T3);
|
||||||
|
int[] indexes3 = null;
|
||||||
|
var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
|
||||||
|
await ExecuteReaderMultipleAsync(3, connection, transaction, (dr, result) => {
|
||||||
|
switch (result) {
|
||||||
|
case 0:
|
||||||
|
if (indexes1 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(type1, indexes1, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if (indexes2 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(type2, indexes2, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if (indexes3 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes3 = props3.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(type3, indexes3, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}, cmdType, cmdText, cmdParms);
|
||||||
|
return (ret1, ret2, ret3);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<(List<T1>, List<T2>, List<T3>, List<T4>)> QueryAsync<T1, T2, T3, T4>(string cmdText, object parms = null) => QueryAsync<T1, T2, T3, T4>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public Task<(List<T1>, List<T2>, List<T3>, List<T4>)> QueryAsync<T1, T2, T3, T4>(DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T1, T2, T3, T4>(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public Task<(List<T1>, List<T2>, List<T3>, List<T4>)> QueryAsync<T1, T2, T3, T4>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T1, T2, T3, T4>(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public Task<(List<T1>, List<T2>, List<T3>, List<T4>)> QueryAsync<T1, T2, T3, T4>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T1, T2, T3, T4>(null, null, cmdType, cmdText, cmdParms);
|
||||||
|
public Task<(List<T1>, List<T2>, List<T3>, List<T4>)> QueryAsync<T1, T2, T3, T4>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T1, T2, T3, T4>(null, transaction, cmdType, cmdText, cmdParms);
|
||||||
|
async public Task<(List<T1>, List<T2>, List<T3>, List<T4>)> QueryAsync<T1, T2, T3, T4>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
|
||||||
|
if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>());
|
||||||
|
var ret1 = new List<T1>();
|
||||||
|
var type1 = typeof(T1);
|
||||||
|
int[] indexes1 = null;
|
||||||
|
var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
|
||||||
|
|
||||||
|
var ret2 = new List<T2>();
|
||||||
|
var type2 = typeof(T2);
|
||||||
|
int[] indexes2 = null;
|
||||||
|
var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
|
||||||
|
|
||||||
|
var ret3 = new List<T3>();
|
||||||
|
var type3 = typeof(T3);
|
||||||
|
int[] indexes3 = null;
|
||||||
|
var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
|
||||||
|
|
||||||
|
var ret4 = new List<T4>();
|
||||||
|
var type4 = typeof(T4);
|
||||||
|
int[] indexes4 = null;
|
||||||
|
var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties());
|
||||||
|
await ExecuteReaderMultipleAsync(4, connection, transaction, (dr, result) => {
|
||||||
|
switch (result) {
|
||||||
|
case 0:
|
||||||
|
if (indexes1 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(type1, indexes1, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if (indexes2 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(type2, indexes2, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if (indexes3 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes3 = props3.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(type3, indexes3, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if (indexes4 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes4 = props4.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(type4, indexes4, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}, cmdType, cmdText, cmdParms);
|
||||||
|
return (ret1, ret2, ret3, ret4);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<(List<T1>, List<T2>, List<T3>, List<T4>, List<T5>)> QueryAsync<T1, T2, T3, T4, T5>(string cmdText, object parms = null) => QueryAsync<T1, T2, T3, T4, T5>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public Task<(List<T1>, List<T2>, List<T3>, List<T4>, List<T5>)> QueryAsync<T1, T2, T3, T4, T5>(DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T1, T2, T3, T4, T5>(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public Task<(List<T1>, List<T2>, List<T3>, List<T4>, List<T5>)> QueryAsync<T1, T2, T3, T4, T5>(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T1, T2, T3, T4, T5>(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public Task<(List<T1>, List<T2>, List<T3>, List<T4>, List<T5>)> QueryAsync<T1, T2, T3, T4, T5>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T1, T2, T3, T4, T5>(null, null, cmdType, cmdText, cmdParms);
|
||||||
|
public Task<(List<T1>, List<T2>, List<T3>, List<T4>, List<T5>)> QueryAsync<T1, T2, T3, T4, T5>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T1, T2, T3, T4, T5>(null, transaction, cmdType, cmdText, cmdParms);
|
||||||
|
async public Task<(List<T1>, List<T2>, List<T3>, List<T4>, List<T5>)> QueryAsync<T1, T2, T3, T4, T5>(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
|
||||||
|
if (string.IsNullOrEmpty(cmdText)) return (new List<T1>(), new List<T2>(), new List<T3>(), new List<T4>(), new List<T5>());
|
||||||
|
var ret1 = new List<T1>();
|
||||||
|
var type1 = typeof(T1);
|
||||||
|
int[] indexes1 = null;
|
||||||
|
var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties());
|
||||||
|
|
||||||
|
var ret2 = new List<T2>();
|
||||||
|
var type2 = typeof(T2);
|
||||||
|
int[] indexes2 = null;
|
||||||
|
var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties());
|
||||||
|
|
||||||
|
var ret3 = new List<T3>();
|
||||||
|
var type3 = typeof(T3);
|
||||||
|
int[] indexes3 = null;
|
||||||
|
var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties());
|
||||||
|
|
||||||
|
var ret4 = new List<T4>();
|
||||||
|
var type4 = typeof(T4);
|
||||||
|
int[] indexes4 = null;
|
||||||
|
var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties());
|
||||||
|
|
||||||
|
var ret5 = new List<T5>();
|
||||||
|
var type5 = typeof(T5);
|
||||||
|
int[] indexes5 = null;
|
||||||
|
var props5 = dicQueryTypeGetProperties.GetOrAdd(type5, k => type1.GetProperties());
|
||||||
|
await ExecuteReaderMultipleAsync(5, connection, transaction, (dr, result) => {
|
||||||
|
switch (result) {
|
||||||
|
case 0:
|
||||||
|
if (indexes1 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes1 = props1.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret1.Add((T1)Utils.ExecuteArrayRowReadClassOrTuple(type1, indexes1, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if (indexes2 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes2 = props2.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret2.Add((T2)Utils.ExecuteArrayRowReadClassOrTuple(type2, indexes2, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if (indexes3 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes3 = props3.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret3.Add((T3)Utils.ExecuteArrayRowReadClassOrTuple(type3, indexes3, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if (indexes4 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes4 = props4.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret4.Add((T4)Utils.ExecuteArrayRowReadClassOrTuple(type4, indexes4, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
if (indexes5 == null) {
|
||||||
|
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++)
|
||||||
|
dic.Add(dr.GetName(a), a);
|
||||||
|
indexes5 = props5.Select(a => dic.TryGetValue(a.Name, out var tryint) ? tryint : -1).ToArray();
|
||||||
|
}
|
||||||
|
ret5.Add((T5)Utils.ExecuteArrayRowReadClassOrTuple(type5, indexes5, dr, 0, _util).Value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}, cmdType, cmdText, cmdParms);
|
||||||
|
return (ret1, ret2, ret3, ret4, ret5);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
public Task ExecuteReaderAsync(Func<DbDataReader, Task> readerHander, string cmdText, object parms = null) => ExecuteReaderAsync(null, null, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
public Task ExecuteReaderAsync(Func<DbDataReader, Task> readerHander, string cmdText, object parms = null) => ExecuteReaderAsync(null, null, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
public Task ExecuteReaderAsync(DbTransaction transaction, Func<DbDataReader, Task> readerHander, string cmdText, object parms = null) => ExecuteReaderAsync(null, transaction, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
public Task ExecuteReaderAsync(DbTransaction transaction, Func<DbDataReader, Task> readerHander, string cmdText, object parms = null) => ExecuteReaderAsync(null, transaction, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
public Task ExecuteReaderAsync(DbConnection connection, DbTransaction transaction, Func<DbDataReader, Task> readerHander, string cmdText, object parms = null) => ExecuteReaderAsync(connection, transaction, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
public Task ExecuteReaderAsync(DbConnection connection, DbTransaction transaction, Func<DbDataReader, Task> readerHander, string cmdText, object parms = null) => ExecuteReaderAsync(connection, transaction, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
public Task ExecuteReaderAsync(Func<DbDataReader, Task> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderAsync(null, null, readerHander, cmdType, cmdText, cmdParms);
|
public Task ExecuteReaderAsync(Func<DbDataReader, Task> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderAsync(null, null, readerHander, cmdType, cmdText, cmdParms);
|
||||||
public Task ExecuteReaderAsync(DbTransaction transaction, Func<DbDataReader, Task> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderAsync(null, transaction, readerHander, cmdType, cmdText, cmdParms);
|
public Task ExecuteReaderAsync(DbTransaction transaction, Func<DbDataReader, Task> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderAsync(null, transaction, readerHander, cmdType, cmdText, cmdParms);
|
||||||
async public Task ExecuteReaderAsync(DbConnection connection, DbTransaction transaction, Func<DbDataReader, Task> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
|
public Task ExecuteReaderAsync(DbConnection connection, DbTransaction transaction, Func<DbDataReader, Task> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderMultipleAsync(1, connection, transaction, (dr, result) => readerHander(dr), cmdType, cmdText, cmdParms);
|
||||||
|
async Task ExecuteReaderMultipleAsync(int multipleResult, DbConnection connection, DbTransaction transaction, Func<DbDataReader, int, Task> readerHander, 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;
|
||||||
var logtxt = new StringBuilder();
|
var logtxt = new StringBuilder();
|
||||||
@ -85,7 +340,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();
|
||||||
await ExecuteReaderAsync(readerHander, cmdType, cmdText, cmdParms);
|
await ExecuteReaderMultipleAsync(multipleResult, connection, transaction, readerHander, cmdType, cmdText, cmdParms);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -98,24 +353,28 @@ namespace FreeSql.Internal.CommonProvider {
|
|||||||
}
|
}
|
||||||
using (var dr = await pc.cmd.ExecuteReaderAsync()) {
|
using (var dr = await pc.cmd.ExecuteReaderAsync()) {
|
||||||
if (IsTracePerformance) logtxt.Append("ExecuteReaderAsync: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms\r\n");
|
if (IsTracePerformance) logtxt.Append("ExecuteReaderAsync: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms\r\n");
|
||||||
|
int resultIndex = 0;
|
||||||
while (true) {
|
while (true) {
|
||||||
if (IsTracePerformance) logtxt_dt = DateTime.Now;
|
while (true) {
|
||||||
bool isread = await dr.ReadAsync();
|
if (IsTracePerformance) logtxt_dt = DateTime.Now;
|
||||||
if (IsTracePerformance) logtxt.Append(" dr.ReadAsync: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms\r\n");
|
bool isread = await dr.ReadAsync();
|
||||||
if (isread == false) break;
|
if (IsTracePerformance) logtxt.Append(" dr.ReadAsync: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms\r\n");
|
||||||
|
if (isread == false) break;
|
||||||
|
|
||||||
if (readerHander != null) {
|
if (readerHander != null) {
|
||||||
object[] values = null;
|
object[] values = null;
|
||||||
if (IsTracePerformance) {
|
if (IsTracePerformance) {
|
||||||
logtxt_dt = DateTime.Now;
|
logtxt_dt = DateTime.Now;
|
||||||
values = new object[dr.FieldCount];
|
values = new object[dr.FieldCount];
|
||||||
for (int a = 0; a < values.Length; a++) if (!await dr.IsDBNullAsync(a)) values[a] = await dr.GetFieldValueAsync<object>(a);
|
for (int a = 0; a < values.Length; a++) if (!await dr.IsDBNullAsync(a)) values[a] = await dr.GetFieldValueAsync<object>(a);
|
||||||
logtxt.Append(" dr.GetValues: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms\r\n");
|
logtxt.Append(" dr.GetValues: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms\r\n");
|
||||||
logtxt_dt = DateTime.Now;
|
logtxt_dt = DateTime.Now;
|
||||||
|
}
|
||||||
|
await readerHander(dr, resultIndex);
|
||||||
|
if (IsTracePerformance) logtxt.Append(" readerHanderAsync: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms (").Append(string.Join(", ", values)).Append(")\r\n");
|
||||||
}
|
}
|
||||||
await readerHander(dr);
|
|
||||||
if (IsTracePerformance) logtxt.Append(" readerHanderAsync: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms (").Append(string.Join(", ", values)).Append(")\r\n");
|
|
||||||
}
|
}
|
||||||
|
if (++resultIndex >= multipleResult || dr.NextResult() == false) break;
|
||||||
}
|
}
|
||||||
if (IsTracePerformance) logtxt_dt = DateTime.Now;
|
if (IsTracePerformance) logtxt_dt = DateTime.Now;
|
||||||
dr.Close();
|
dr.Close();
|
||||||
@ -147,6 +406,26 @@ namespace FreeSql.Internal.CommonProvider {
|
|||||||
}, cmdType, cmdText, cmdParms);
|
}, cmdType, cmdText, cmdParms);
|
||||||
return ret.ToArray();
|
return ret.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Task<DataSet> ExecuteDataSetAsync(string cmdText, object parms = null) => ExecuteDataSetAsync(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public Task<DataSet> ExecuteDataSetAsync(DbTransaction transaction, string cmdText, object parms = null) => ExecuteDataSetAsync(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public Task<DataSet> ExecuteDataSetAsync(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => ExecuteDataSetAsync(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
|
public Task<DataSet> ExecuteDataSetAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteDataSetAsync(null, null, cmdType, cmdText, cmdParms);
|
||||||
|
public Task<DataSet> ExecuteDataSetAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteDataSetAsync(null, transaction, cmdType, cmdText, cmdParms);
|
||||||
|
async public Task<DataSet> ExecuteDataSetAsync(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
|
||||||
|
var ret = new DataSet();
|
||||||
|
DataTable dt = null;
|
||||||
|
await ExecuteReaderMultipleAsync(16, connection, transaction, async (dr, result) => {
|
||||||
|
if (ret.Tables.Count <= result) {
|
||||||
|
dt = ret.Tables.Add();
|
||||||
|
for (var a = 0; a < dr.FieldCount; a++) dt.Columns.Add(dr.GetName(a));
|
||||||
|
}
|
||||||
|
object[] values = new object[dt.Columns.Count];
|
||||||
|
for (int a = 0; a < values.Length; a++) if (!await dr.IsDBNullAsync(a)) values[a] = await dr.GetFieldValueAsync<object>(a);
|
||||||
|
dt.Rows.Add(values);
|
||||||
|
}, cmdType, cmdText, cmdParms);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
public Task<DataTable> ExecuteDataTableAsync(string cmdText, object parms = null) => ExecuteDataTableAsync(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
public Task<DataTable> ExecuteDataTableAsync(string cmdText, object parms = null) => ExecuteDataTableAsync(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
public Task<DataTable> ExecuteDataTableAsync(DbTransaction transaction, string cmdText, object parms = null) => ExecuteDataTableAsync(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
public Task<DataTable> ExecuteDataTableAsync(DbTransaction transaction, string cmdText, object parms = null) => ExecuteDataTableAsync(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
public Task<DataTable> ExecuteDataTableAsync(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => ExecuteDataTableAsync(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
public Task<DataTable> ExecuteDataTableAsync(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => ExecuteDataTableAsync(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
|
||||||
@ -256,6 +535,8 @@ namespace FreeSql.Internal.CommonProvider {
|
|||||||
isclose = true;
|
isclose = true;
|
||||||
}
|
}
|
||||||
cmd.Connection = connection;
|
cmd.Connection = connection;
|
||||||
|
if (transaction?.Connection == connection)
|
||||||
|
cmd.Transaction = transaction;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsTracePerformance) logtxt.Append(" PrepareCommandAsync ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms cmdParms: ").Append(cmd.Parameters.Count).Append("\r\n");
|
if (IsTracePerformance) logtxt.Append(" PrepareCommandAsync ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms cmdParms: ").Append(cmd.Parameters.Count).Append("\r\n");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user