diff --git a/FreeSql/Interface/IAdo.cs b/FreeSql/Interface/IAdo.cs index d27b9f24..744245d7 100644 --- a/FreeSql/Interface/IAdo.cs +++ b/FreeSql/Interface/IAdo.cs @@ -93,6 +93,23 @@ namespace FreeSql { /// /// /// + 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); + /// + /// 查询,ExecuteDataSet("select * from user where age > @age; select 2", new { age = 25 }) + /// + /// + /// + /// + 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); + /// + /// 查询 + /// + /// + /// DataTable ExecuteDataTable(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); @@ -145,7 +162,7 @@ namespace FreeSql { /// /// 执行SQL返回对象集合,Query<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 }) /// - /// + /// /// /// /// @@ -156,7 +173,7 @@ namespace FreeSql { /// /// 执行SQL返回对象集合,Query<User>("select * from user where age > @age", new { age = 25 }) /// - /// + /// /// /// /// @@ -164,6 +181,47 @@ namespace FreeSql { List Query(DbTransaction transaction, string cmdText, object parms = null); List Query(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null); + /// + /// 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 }) + /// + /// + /// + /// + /// + /// + (List, List) Query(CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + (List, List) Query(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + (List, List) Query(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + /// + /// 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new { age = 25 }) + /// + /// + /// + /// + /// + (List, List) Query(string cmdText, object parms = null); + (List, List) Query(DbTransaction transaction, string cmdText, object parms = null); + (List, List) Query(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null); + + (List, List, List) Query(CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + (List, List, List) Query(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + (List, List, List) Query(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + (List, List, List) Query(string cmdText, object parms = null); + (List, List, List) Query(DbTransaction transaction, string cmdText, object parms = null); + (List, List, List) Query(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null); + (List, List, List, List) Query(CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + (List, List, List, List) Query(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + (List, List, List, List) Query(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + (List, List, List, List) Query(string cmdText, object parms = null); + (List, List, List, List) Query(DbTransaction transaction, string cmdText, object parms = null); + (List, List, List, List) Query(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null); + (List, List, List, List, List) Query(CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + (List, List, List, List, List) Query(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + (List, List, List, List, List) Query(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + (List, List, List, List, List) Query(string cmdText, object parms = null); + (List, List, List, List, List) Query(DbTransaction transaction, string cmdText, object parms = null); + (List, List, List, List, List) Query(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null); + #region async /// /// 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 @@ -205,6 +263,23 @@ namespace FreeSql { /// /// /// + Task ExecuteDataSetAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + Task ExecuteDataSetAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + Task ExecuteDataSetAsync(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + /// + /// 查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 }) + /// + /// + /// + /// + Task ExecuteDataSetAsync(string cmdText, object parms = null); + Task ExecuteDataSetAsync(DbTransaction transaction, string cmdText, object parms = null); + Task ExecuteDataSetAsync(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null); + /// + /// 查询 + /// + /// + /// Task ExecuteDataTableAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms); Task ExecuteDataTableAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms); Task ExecuteDataTableAsync(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms); @@ -275,6 +350,47 @@ namespace FreeSql { Task> QueryAsync(string cmdText, object parms = null); Task> QueryAsync(DbTransaction transaction, string cmdText, object parms = null); Task> QueryAsync(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null); + + /// + /// 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 }) + /// + /// + /// + /// + /// + /// + Task<(List, List)> QueryAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + Task<(List, List)> QueryAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + Task<(List, List)> QueryAsync(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + /// + /// 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new { age = 25 }) + /// + /// + /// + /// + /// + Task<(List, List)> QueryAsync(string cmdText, object parms = null); + Task<(List, List)> QueryAsync(DbTransaction transaction, string cmdText, object parms = null); + Task<(List, List)> QueryAsync(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null); + + Task<(List, List, List)> QueryAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + Task<(List, List, List)> QueryAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + Task<(List, List, List)> QueryAsync(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + Task<(List, List, List)> QueryAsync(string cmdText, object parms = null); + Task<(List, List, List)> QueryAsync(DbTransaction transaction, string cmdText, object parms = null); + Task<(List, List, List)> QueryAsync(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null); + Task<(List, List, List, List)> QueryAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + Task<(List, List, List, List)> QueryAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + Task<(List, List, List, List)> QueryAsync(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + Task<(List, List, List, List)> QueryAsync(string cmdText, object parms = null); + Task<(List, List, List, List)> QueryAsync(DbTransaction transaction, string cmdText, object parms = null); + Task<(List, List, List, List)> QueryAsync(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null); + Task<(List, List, List, List, List)> QueryAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + Task<(List, List, List, List, List)> QueryAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + Task<(List, List, List, List, List)> QueryAsync(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms); + Task<(List, List, List, List, List)> QueryAsync(string cmdText, object parms = null); + Task<(List, List, List, List, List)> QueryAsync(DbTransaction transaction, string cmdText, object parms = null); + Task<(List, List, List, List, List)> QueryAsync(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null); #endregion } } diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs index 4567ea98..d51b28b1 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs @@ -98,12 +98,263 @@ namespace FreeSql.Internal.CommonProvider { }, cmdType, cmdText, cmdParms); return ret; } + #region query multi + public (List, List) Query(string cmdText, object parms = null) => Query(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public (List, List) Query(DbTransaction transaction, string cmdText, object parms = null) => Query(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public (List, List) Query(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => Query(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public (List, List) Query(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query(null, null, cmdType, cmdText, cmdParms); + public (List, List) Query(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query(null, transaction, cmdType, cmdText, cmdParms); + public (List, List) Query(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) { + if (string.IsNullOrEmpty(cmdText)) return (new List(), new List()); + var ret1 = new List(); + var type1 = typeof(T1); + int[] indexes1 = null; + var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties()); + + var ret2 = new List(); + 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(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(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, List, List) Query(string cmdText, object parms = null) => Query(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public (List, List, List) Query(DbTransaction transaction, string cmdText, object parms = null) => Query(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public (List, List, List) Query(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => Query(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public (List, List, List) Query(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query(null, null, cmdType, cmdText, cmdParms); + public (List, List, List) Query(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query(null, transaction, cmdType, cmdText, cmdParms); + public (List, List, List) Query(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) { + if (string.IsNullOrEmpty(cmdText)) return (new List(), new List(), new List()); + var ret1 = new List(); + var type1 = typeof(T1); + int[] indexes1 = null; + var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties()); + + var ret2 = new List(); + var type2 = typeof(T2); + int[] indexes2 = null; + var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties()); + + var ret3 = new List(); + 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(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(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(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, List, List, List) Query(string cmdText, object parms = null) => Query(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public (List, List, List, List) Query(DbTransaction transaction, string cmdText, object parms = null) => Query(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public (List, List, List, List) Query(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => Query(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public (List, List, List, List) Query(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query(null, null, cmdType, cmdText, cmdParms); + public (List, List, List, List) Query(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query(null, transaction, cmdType, cmdText, cmdParms); + public (List, List, List, List) Query(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) { + if (string.IsNullOrEmpty(cmdText)) return (new List(), new List(), new List(), new List()); + var ret1 = new List(); + var type1 = typeof(T1); + int[] indexes1 = null; + var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties()); + + var ret2 = new List(); + var type2 = typeof(T2); + int[] indexes2 = null; + var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties()); + + var ret3 = new List(); + var type3 = typeof(T3); + int[] indexes3 = null; + var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties()); + + var ret4 = new List(); + 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(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(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(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(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, List, List, List, List) Query(string cmdText, object parms = null) => Query(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public (List, List, List, List, List) Query(DbTransaction transaction, string cmdText, object parms = null) => Query(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public (List, List, List, List, List) Query(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => Query(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public (List, List, List, List, List) Query(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query(null, null, cmdType, cmdText, cmdParms); + public (List, List, List, List, List) Query(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query(null, transaction, cmdType, cmdText, cmdParms); + public (List, List, List, List, List) Query(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) { + if (string.IsNullOrEmpty(cmdText)) return (new List(), new List(), new List(), new List(), new List()); + var ret1 = new List(); + var type1 = typeof(T1); + int[] indexes1 = null; + var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties()); + + var ret2 = new List(); + var type2 = typeof(T2); + int[] indexes2 = null; + var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties()); + + var ret3 = new List(); + var type3 = typeof(T3); + int[] indexes3 = null; + var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties()); + + var ret4 = new List(); + var type4 = typeof(T4); + int[] indexes4 = null; + var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties()); + + var ret5 = new List(); + 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(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(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(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(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(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 readerHander, string cmdText, object parms = null) => ExecuteReader(null, null, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); public void ExecuteReader(DbTransaction transaction, Action readerHander, string cmdText, object parms = null) => ExecuteReader(null, transaction, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); public void ExecuteReader(DbConnection connection, DbTransaction transaction, Action readerHander, string cmdText, object parms = null) => ExecuteReader(connection, transaction, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); public void ExecuteReader(Action readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReader(null, null, readerHander, cmdType, cmdText, cmdParms); public void ExecuteReader(DbTransaction transaction, Action readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReader(null, transaction, readerHander, cmdType, cmdText, cmdParms); - public void ExecuteReader(DbConnection connection, DbTransaction transaction, Action readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) { + public void ExecuteReader(DbConnection connection, DbTransaction transaction, Action 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 readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) { if (string.IsNullOrEmpty(cmdText)) return; var dt = DateTime.Now; var logtxt = new StringBuilder(); @@ -151,7 +402,7 @@ namespace FreeSql.Internal.CommonProvider { } LoggerException(pool, pc, new Exception($"连接失败,准备切换其他可用服务器"), dt, logtxt, false); pc.cmd.Parameters.Clear(); - ExecuteReader(readerHander, cmdType, cmdText, cmdParms); + ExecuteReaderMultiple(multipleResult, connection, transaction, readerHander, cmdType, cmdText, cmdParms); return; } } else { @@ -164,24 +415,28 @@ namespace FreeSql.Internal.CommonProvider { } 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"); + int resultIndex = 0; while (true) { - if (IsTracePerformance) logtxt_dt = DateTime.Now; - bool isread = dr.Read(); - 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; + while (true) { + if (IsTracePerformance) logtxt_dt = DateTime.Now; + bool isread = dr.Read(); + 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) { - object[] values = null; - if (IsTracePerformance) { - logtxt_dt = DateTime.Now; - values = new object[dr.FieldCount]; - 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_dt = DateTime.Now; + if (readerHander != null) { + object[] values = null; + if (IsTracePerformance) { + logtxt_dt = DateTime.Now; + values = new object[dr.FieldCount]; + 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_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; dr.Close(); @@ -213,6 +468,25 @@ namespace FreeSql.Internal.CommonProvider { }, cmdType, cmdText, cmdParms); 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(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)); @@ -323,7 +597,7 @@ namespace FreeSql.Internal.CommonProvider { isclose = true; } cmd.Connection = connection; - if (transaction.Connection == connection) + if (transaction?.Connection == connection) cmd.Transaction = transaction; } diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs index cf573637..fccbb1df 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs @@ -32,12 +32,267 @@ namespace FreeSql.Internal.CommonProvider { }, cmdType, cmdText, cmdParms); return ret; } + #region QueryAsync multi + public Task<(List, List)> QueryAsync(string cmdText, object parms = null) => QueryAsync(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public Task<(List, List)> QueryAsync(DbTransaction transaction, string cmdText, object parms = null) => QueryAsync(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public Task<(List, List)> QueryAsync(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => QueryAsync(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public Task<(List, List)> QueryAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync(null, null, cmdType, cmdText, cmdParms); + public Task<(List, List)> QueryAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync(null, transaction, cmdType, cmdText, cmdParms); + async public Task<(List, List)> QueryAsync(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) { + if (string.IsNullOrEmpty(cmdText)) return (new List(), new List()); + var ret1 = new List(); + var type1 = typeof(T1); + int[] indexes1 = null; + var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties()); + + var ret2 = new List(); + 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(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(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, List, List)> QueryAsync(string cmdText, object parms = null) => QueryAsync(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public Task<(List, List, List)> QueryAsync(DbTransaction transaction, string cmdText, object parms = null) => QueryAsync(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public Task<(List, List, List)> QueryAsync(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => QueryAsync(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public Task<(List, List, List)> QueryAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync(null, null, cmdType, cmdText, cmdParms); + public Task<(List, List, List)> QueryAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync(null, transaction, cmdType, cmdText, cmdParms); + async public Task<(List, List, List)> QueryAsync(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) { + if (string.IsNullOrEmpty(cmdText)) return (new List(), new List(), new List()); + var ret1 = new List(); + var type1 = typeof(T1); + int[] indexes1 = null; + var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties()); + + var ret2 = new List(); + var type2 = typeof(T2); + int[] indexes2 = null; + var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties()); + + var ret3 = new List(); + 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(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(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(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, List, List, List)> QueryAsync(string cmdText, object parms = null) => QueryAsync(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public Task<(List, List, List, List)> QueryAsync(DbTransaction transaction, string cmdText, object parms = null) => QueryAsync(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public Task<(List, List, List, List)> QueryAsync(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => QueryAsync(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public Task<(List, List, List, List)> QueryAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync(null, null, cmdType, cmdText, cmdParms); + public Task<(List, List, List, List)> QueryAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync(null, transaction, cmdType, cmdText, cmdParms); + async public Task<(List, List, List, List)> QueryAsync(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) { + if (string.IsNullOrEmpty(cmdText)) return (new List(), new List(), new List(), new List()); + var ret1 = new List(); + var type1 = typeof(T1); + int[] indexes1 = null; + var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties()); + + var ret2 = new List(); + var type2 = typeof(T2); + int[] indexes2 = null; + var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties()); + + var ret3 = new List(); + var type3 = typeof(T3); + int[] indexes3 = null; + var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties()); + + var ret4 = new List(); + 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(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(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(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(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, List, List, List, List)> QueryAsync(string cmdText, object parms = null) => QueryAsync(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public Task<(List, List, List, List, List)> QueryAsync(DbTransaction transaction, string cmdText, object parms = null) => QueryAsync(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public Task<(List, List, List, List, List)> QueryAsync(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => QueryAsync(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public Task<(List, List, List, List, List)> QueryAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync(null, null, cmdType, cmdText, cmdParms); + public Task<(List, List, List, List, List)> QueryAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync(null, transaction, cmdType, cmdText, cmdParms); + async public Task<(List, List, List, List, List)> QueryAsync(DbConnection connection, DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) { + if (string.IsNullOrEmpty(cmdText)) return (new List(), new List(), new List(), new List(), new List()); + var ret1 = new List(); + var type1 = typeof(T1); + int[] indexes1 = null; + var props1 = dicQueryTypeGetProperties.GetOrAdd(type1, k => type1.GetProperties()); + + var ret2 = new List(); + var type2 = typeof(T2); + int[] indexes2 = null; + var props2 = dicQueryTypeGetProperties.GetOrAdd(type2, k => type1.GetProperties()); + + var ret3 = new List(); + var type3 = typeof(T3); + int[] indexes3 = null; + var props3 = dicQueryTypeGetProperties.GetOrAdd(type3, k => type1.GetProperties()); + + var ret4 = new List(); + var type4 = typeof(T4); + int[] indexes4 = null; + var props4 = dicQueryTypeGetProperties.GetOrAdd(type4, k => type1.GetProperties()); + + var ret5 = new List(); + 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(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(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(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(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(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 readerHander, string cmdText, object parms = null) => ExecuteReaderAsync(null, null, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); public Task ExecuteReaderAsync(DbTransaction transaction, Func readerHander, string cmdText, object parms = null) => ExecuteReaderAsync(null, transaction, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); public Task ExecuteReaderAsync(DbConnection connection, DbTransaction transaction, Func readerHander, string cmdText, object parms = null) => ExecuteReaderAsync(connection, transaction, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); public Task ExecuteReaderAsync(Func readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderAsync(null, null, readerHander, cmdType, cmdText, cmdParms); public Task ExecuteReaderAsync(DbTransaction transaction, Func readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderAsync(null, transaction, readerHander, cmdType, cmdText, cmdParms); - async public Task ExecuteReaderAsync(DbConnection connection, DbTransaction transaction, Func readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) { + public Task ExecuteReaderAsync(DbConnection connection, DbTransaction transaction, Func 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 readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) { if (string.IsNullOrEmpty(cmdText)) return; var dt = DateTime.Now; var logtxt = new StringBuilder(); @@ -85,7 +340,7 @@ namespace FreeSql.Internal.CommonProvider { } LoggerException(pool, pc, new Exception($"连接失败,准备切换其他可用服务器"), dt, logtxt, false); pc.cmd.Parameters.Clear(); - await ExecuteReaderAsync(readerHander, cmdType, cmdText, cmdParms); + await ExecuteReaderMultipleAsync(multipleResult, connection, transaction, readerHander, cmdType, cmdText, cmdParms); return; } } else { @@ -98,24 +353,28 @@ namespace FreeSql.Internal.CommonProvider { } 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"); + int resultIndex = 0; while (true) { - if (IsTracePerformance) logtxt_dt = DateTime.Now; - bool isread = await dr.ReadAsync(); - 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; + while (true) { + if (IsTracePerformance) logtxt_dt = DateTime.Now; + bool isread = await dr.ReadAsync(); + 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) { - object[] values = null; - if (IsTracePerformance) { - logtxt_dt = DateTime.Now; - values = new object[dr.FieldCount]; - for (int a = 0; a < values.Length; a++) if (!await dr.IsDBNullAsync(a)) values[a] = await dr.GetFieldValueAsync(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_dt = DateTime.Now; + if (readerHander != null) { + object[] values = null; + if (IsTracePerformance) { + logtxt_dt = DateTime.Now; + values = new object[dr.FieldCount]; + for (int a = 0; a < values.Length; a++) if (!await dr.IsDBNullAsync(a)) values[a] = await dr.GetFieldValueAsync(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_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; dr.Close(); @@ -147,6 +406,26 @@ namespace FreeSql.Internal.CommonProvider { }, cmdType, cmdText, cmdParms); return ret.ToArray(); } + + public Task ExecuteDataSetAsync(string cmdText, object parms = null) => ExecuteDataSetAsync(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public Task ExecuteDataSetAsync(DbTransaction transaction, string cmdText, object parms = null) => ExecuteDataSetAsync(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public Task ExecuteDataSetAsync(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null) => ExecuteDataSetAsync(connection, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); + public Task ExecuteDataSetAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteDataSetAsync(null, null, cmdType, cmdText, cmdParms); + public Task ExecuteDataSetAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteDataSetAsync(null, transaction, cmdType, cmdText, cmdParms); + async public Task 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(a); + dt.Rows.Add(values); + }, cmdType, cmdText, cmdParms); + return ret; + } public Task ExecuteDataTableAsync(string cmdText, object parms = null) => ExecuteDataTableAsync(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); public Task ExecuteDataTableAsync(DbTransaction transaction, string cmdText, object parms = null) => ExecuteDataTableAsync(null, transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms)); public Task 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; } 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");