mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 17:20:49 +08:00 
			
		
		
		
	- 修复 MySql 枚举表达式 == 解析成数字的 bug;
- 增加 Connection 对象扩展方法,实现像 Dapper 的使用习惯;
This commit is contained in:
		@@ -236,7 +236,20 @@ namespace FreeSql.Tests.MySql {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		[Fact]
 | 
							[Fact]
 | 
				
			||||||
		public void ToSql() {
 | 
							public void ToSql() {
 | 
				
			||||||
 | 
								g.mysql.Insert<testenumWhere>().AppendData(new testenumWhere { type = testenumWhereType.Blaaa }).ExecuteAffrows();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								var sql1 = g.mysql.Select<testenumWhere>().Where(a => a.type == testenumWhereType.Blaaa).ToSql();
 | 
				
			||||||
 | 
								var sql2 = g.mysql.Select<testenumWhere>().Where(a => testenumWhereType.Blaaa == a.type).ToSql();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								var sql3 = g.mysql.Select<testenumWhere>().Where(a => a.type.Equals(testenumWhereType.Blaaa)).ToSql();
 | 
				
			||||||
 | 
								var tolist = g.mysql.Select<testenumWhere>().Where(a => a.type == testenumWhereType.Blaaa).ToList();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							class testenumWhere {
 | 
				
			||||||
 | 
								public Guid id { get; set; }
 | 
				
			||||||
 | 
								public testenumWhereType type { get; set; }
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							public enum testenumWhereType { Menu, Class, Blaaa }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		[Fact]
 | 
							[Fact]
 | 
				
			||||||
		public void Any() {
 | 
							public void Any() {
 | 
				
			||||||
			var count = select.Where(a => 1 == 1).Count();
 | 
								var count = select.Where(a => 1 == 1).Count();
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										84
									
								
								FreeSql.Tests/MySql/MySqlConnectionExtensionsTest.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								FreeSql.Tests/MySql/MySqlConnectionExtensionsTest.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,84 @@
 | 
				
			|||||||
 | 
					using FreeSql.DataAnnotations;
 | 
				
			||||||
 | 
					using MySql.Data.MySqlClient;
 | 
				
			||||||
 | 
					using Newtonsoft.Json;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					using Xunit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Tests.MySql {
 | 
				
			||||||
 | 
						public class MySqlConnectionExtensions {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							string _connectString = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							[Fact]
 | 
				
			||||||
 | 
							public void Insert() {
 | 
				
			||||||
 | 
								var affrows = 0;
 | 
				
			||||||
 | 
								using (var conn = new MySqlConnection(_connectString)) {
 | 
				
			||||||
 | 
									var item = new TestConnectionExt { title = "testinsert" };
 | 
				
			||||||
 | 
									affrows = conn.Insert<TestConnectionExt>().AppendData(item).ExecuteAffrows();
 | 
				
			||||||
 | 
									conn.Close();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								Assert.Equal(1, affrows);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							[Fact]
 | 
				
			||||||
 | 
							public void Update() {
 | 
				
			||||||
 | 
								var affrows = 0;
 | 
				
			||||||
 | 
								using (var conn = new MySqlConnection(_connectString)) {
 | 
				
			||||||
 | 
									var item = new TestConnectionExt { title = "testupdate" };
 | 
				
			||||||
 | 
									affrows = conn.Insert<TestConnectionExt>().AppendData(item).ExecuteAffrows();
 | 
				
			||||||
 | 
									Assert.Equal(1, affrows);
 | 
				
			||||||
 | 
									item = conn.Select<TestConnectionExt>().First();
 | 
				
			||||||
 | 
									affrows = conn.Update<TestConnectionExt>().SetSource(item).Set(a => a.title, "testupdated").ExecuteAffrows();
 | 
				
			||||||
 | 
									conn.Close();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								Assert.Equal(1, affrows);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							[Fact]
 | 
				
			||||||
 | 
							public void Delete() {
 | 
				
			||||||
 | 
								var affrows = 0;
 | 
				
			||||||
 | 
								using (var conn = new MySqlConnection(_connectString)) {
 | 
				
			||||||
 | 
									var item = new TestConnectionExt { title = "testdelete" };
 | 
				
			||||||
 | 
									affrows = conn.Insert<TestConnectionExt>().AppendData(item).ExecuteAffrows();
 | 
				
			||||||
 | 
									Assert.Equal(1, affrows);
 | 
				
			||||||
 | 
									affrows = conn.Delete<TestConnectionExt>().Where(item).ExecuteAffrows();
 | 
				
			||||||
 | 
									conn.Close();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								Assert.Equal(1, affrows);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							[Fact]
 | 
				
			||||||
 | 
							public void Select() {
 | 
				
			||||||
 | 
								var list = new List<TestConnectionExt>();
 | 
				
			||||||
 | 
								var affrows = 0;
 | 
				
			||||||
 | 
								using (var conn = new MySqlConnection(_connectString)) {
 | 
				
			||||||
 | 
									var item = new TestConnectionExt { title = "testselect" };
 | 
				
			||||||
 | 
									affrows = conn.Insert<TestConnectionExt>().AppendData(item).ExecuteAffrows();
 | 
				
			||||||
 | 
									Assert.Equal(1, affrows);
 | 
				
			||||||
 | 
									list = conn.Select<TestConnectionExt>().Where(a => a.id == item.id).ToList();
 | 
				
			||||||
 | 
									conn.Close();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								Assert.Single(list);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							[Fact]
 | 
				
			||||||
 | 
							public void Query() {
 | 
				
			||||||
 | 
								var list = new List<TestConnectionExt>();
 | 
				
			||||||
 | 
								var affrows = 0;
 | 
				
			||||||
 | 
								using (var conn = new MySqlConnection(_connectString)) {
 | 
				
			||||||
 | 
									var item = new TestConnectionExt { title = "testquery" };
 | 
				
			||||||
 | 
									affrows = conn.Insert<TestConnectionExt>().AppendData(item).ExecuteAffrows();
 | 
				
			||||||
 | 
									Assert.Equal(1, affrows);
 | 
				
			||||||
 | 
									list = conn.Query<TestConnectionExt>("select * from TestConnectionExt where id = ?id", new { id = item.id });
 | 
				
			||||||
 | 
									conn.Close();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								Assert.Single(list);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							class TestConnectionExt {
 | 
				
			||||||
 | 
								public Guid id { get; set; }
 | 
				
			||||||
 | 
								public string title { get; set; }
 | 
				
			||||||
 | 
								public DateTime createTime { get; set; } = DateTime.Now;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -13,6 +13,12 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <param name="transaction"></param>
 | 
							/// <param name="transaction"></param>
 | 
				
			||||||
		/// <returns></returns>
 | 
							/// <returns></returns>
 | 
				
			||||||
		IDelete<T1> WithTransaction(DbTransaction transaction);
 | 
							IDelete<T1> WithTransaction(DbTransaction transaction);
 | 
				
			||||||
 | 
							/// <summary>
 | 
				
			||||||
 | 
							/// 指定事务对象
 | 
				
			||||||
 | 
							/// </summary>
 | 
				
			||||||
 | 
							/// <param name="transaction"></param>
 | 
				
			||||||
 | 
							/// <returns></returns>
 | 
				
			||||||
 | 
							IDelete<T1> WithConnection(DbConnection connection);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// lambda表达式条件,仅支持实体基础成员(不包含导航对象)
 | 
							/// lambda表达式条件,仅支持实体基础成员(不包含导航对象)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,6 +13,12 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <param name="transaction"></param>
 | 
							/// <param name="transaction"></param>
 | 
				
			||||||
		/// <returns></returns>
 | 
							/// <returns></returns>
 | 
				
			||||||
		IInsert<T1> WithTransaction(DbTransaction transaction);
 | 
							IInsert<T1> WithTransaction(DbTransaction transaction);
 | 
				
			||||||
 | 
							/// <summary>
 | 
				
			||||||
 | 
							/// 指定事务对象
 | 
				
			||||||
 | 
							/// </summary>
 | 
				
			||||||
 | 
							/// <param name="transaction"></param>
 | 
				
			||||||
 | 
							/// <returns></returns>
 | 
				
			||||||
 | 
							IInsert<T1> WithConnection(DbConnection connection);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// 追加准备插入的实体
 | 
							/// 追加准备插入的实体
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,6 +15,12 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <param name="transaction"></param>
 | 
							/// <param name="transaction"></param>
 | 
				
			||||||
		/// <returns></returns>
 | 
							/// <returns></returns>
 | 
				
			||||||
		TSelect WithTransaction(DbTransaction transaction);
 | 
							TSelect WithTransaction(DbTransaction transaction);
 | 
				
			||||||
 | 
							/// <summary>
 | 
				
			||||||
 | 
							/// 指定连接对象
 | 
				
			||||||
 | 
							/// </summary>
 | 
				
			||||||
 | 
							/// <param name="connection"></param>
 | 
				
			||||||
 | 
							/// <returns></returns>
 | 
				
			||||||
 | 
							TSelect WithConnection(DbConnection connection);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// 审核或跟踪 ToList 即将返回的数据
 | 
							/// 审核或跟踪 ToList 即将返回的数据
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,6 +13,12 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <param name="transaction"></param>
 | 
							/// <param name="transaction"></param>
 | 
				
			||||||
		/// <returns></returns>
 | 
							/// <returns></returns>
 | 
				
			||||||
		IUpdate<T1> WithTransaction(DbTransaction transaction);
 | 
							IUpdate<T1> WithTransaction(DbTransaction transaction);
 | 
				
			||||||
 | 
							/// <summary>
 | 
				
			||||||
 | 
							/// 指定事务对象
 | 
				
			||||||
 | 
							/// </summary>
 | 
				
			||||||
 | 
							/// <param name="transaction"></param>
 | 
				
			||||||
 | 
							/// <returns></returns>
 | 
				
			||||||
 | 
							IUpdate<T1> WithConnection(DbConnection connection);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// 不使用参数化,可通过 IFreeSql.CodeFirst.IsNotCommandParameter 全局性设置
 | 
							/// 不使用参数化,可通过 IFreeSql.CodeFirst.IsNotCommandParameter 全局性设置
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -62,6 +62,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <param name="cmdParms"></param>
 | 
							/// <param name="cmdParms"></param>
 | 
				
			||||||
		void ExecuteReader(Action<DbDataReader> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
							void ExecuteReader(Action<DbDataReader> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
		void ExecuteReader(DbTransaction transaction, Action<DbDataReader> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
							void ExecuteReader(DbTransaction transaction, Action<DbDataReader> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
 | 
							void ExecuteReader(DbConnection connection, Action<DbDataReader> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// 查询,ExecuteReader(dr => {}, "select * from user where age > @age", new { age = 25 })
 | 
							/// 查询,ExecuteReader(dr => {}, "select * from user where age > @age", new { age = 25 })
 | 
				
			||||||
		/// </summary>
 | 
							/// </summary>
 | 
				
			||||||
@@ -69,6 +70,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <param name="parms"></param>
 | 
							/// <param name="parms"></param>
 | 
				
			||||||
		void ExecuteReader(Action<DbDataReader> readerHander, string cmdText, object parms = null);
 | 
							void ExecuteReader(Action<DbDataReader> readerHander, string cmdText, object parms = null);
 | 
				
			||||||
		void ExecuteReader(DbTransaction transaction, Action<DbDataReader> readerHander, string cmdText, object parms = null);
 | 
							void ExecuteReader(DbTransaction transaction, Action<DbDataReader> readerHander, string cmdText, object parms = null);
 | 
				
			||||||
 | 
							void ExecuteReader(DbConnection connection, Action<DbDataReader> readerHander, string cmdText, object parms = null);
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// 查询
 | 
							/// 查询
 | 
				
			||||||
		/// </summary>
 | 
							/// </summary>
 | 
				
			||||||
@@ -76,6 +78,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <param name="cmdParms"></param>
 | 
							/// <param name="cmdParms"></param>
 | 
				
			||||||
		object[][] ExecuteArray(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
							object[][] ExecuteArray(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
		object[][] ExecuteArray(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
							object[][] ExecuteArray(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
 | 
							object[][] ExecuteArray(DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// 查询,ExecuteArray("select * from user where age > @age", new { age = 25 })
 | 
							/// 查询,ExecuteArray("select * from user where age > @age", new { age = 25 })
 | 
				
			||||||
		/// </summary>
 | 
							/// </summary>
 | 
				
			||||||
@@ -84,6 +87,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <returns></returns>
 | 
							/// <returns></returns>
 | 
				
			||||||
		object[][] ExecuteArray(string cmdText, object parms = null);
 | 
							object[][] ExecuteArray(string cmdText, object parms = null);
 | 
				
			||||||
		object[][] ExecuteArray(DbTransaction transaction, string cmdText, object parms = null);
 | 
							object[][] ExecuteArray(DbTransaction transaction, string cmdText, object parms = null);
 | 
				
			||||||
 | 
							object[][] ExecuteArray(DbConnection connection, string cmdText, object parms = null);
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// 查询
 | 
							/// 查询
 | 
				
			||||||
		/// </summary>
 | 
							/// </summary>
 | 
				
			||||||
@@ -91,6 +95,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <param name="cmdParms"></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, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// 查询,ExecuteDataTable("select * from user where age > @age", new { age = 25 })
 | 
							/// 查询,ExecuteDataTable("select * from user where age > @age", new { age = 25 })
 | 
				
			||||||
		/// </summary>
 | 
							/// </summary>
 | 
				
			||||||
@@ -99,6 +104,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <returns></returns>
 | 
							/// <returns></returns>
 | 
				
			||||||
		DataTable ExecuteDataTable(string cmdText, object parms = null);
 | 
							DataTable ExecuteDataTable(string cmdText, object parms = null);
 | 
				
			||||||
		DataTable ExecuteDataTable(DbTransaction transaction, string cmdText, object parms = null);
 | 
							DataTable ExecuteDataTable(DbTransaction transaction, string cmdText, object parms = null);
 | 
				
			||||||
 | 
							DataTable ExecuteDataTable(DbConnection connection, string cmdText, object parms = null);
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// 在【主库】执行
 | 
							/// 在【主库】执行
 | 
				
			||||||
		/// </summary>
 | 
							/// </summary>
 | 
				
			||||||
@@ -107,6 +113,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <param name="cmdParms"></param>
 | 
							/// <param name="cmdParms"></param>
 | 
				
			||||||
		int ExecuteNonQuery(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
							int ExecuteNonQuery(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
		int ExecuteNonQuery(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
							int ExecuteNonQuery(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
 | 
							int ExecuteNonQuery(DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// 在【主库】执行,ExecuteNonQuery("delete from user where age > @age", new { age = 25 })
 | 
							/// 在【主库】执行,ExecuteNonQuery("delete from user where age > @age", new { age = 25 })
 | 
				
			||||||
		/// </summary>
 | 
							/// </summary>
 | 
				
			||||||
@@ -115,6 +122,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <returns></returns>
 | 
							/// <returns></returns>
 | 
				
			||||||
		int ExecuteNonQuery(string cmdText, object parms = null);
 | 
							int ExecuteNonQuery(string cmdText, object parms = null);
 | 
				
			||||||
		int ExecuteNonQuery(DbTransaction transaction, string cmdText, object parms = null);
 | 
							int ExecuteNonQuery(DbTransaction transaction, string cmdText, object parms = null);
 | 
				
			||||||
 | 
							int ExecuteNonQuery(DbConnection connection, string cmdText, object parms = null);
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// 在【主库】执行
 | 
							/// 在【主库】执行
 | 
				
			||||||
		/// </summary>
 | 
							/// </summary>
 | 
				
			||||||
@@ -123,6 +131,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <param name="cmdParms"></param>
 | 
							/// <param name="cmdParms"></param>
 | 
				
			||||||
		object ExecuteScalar(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
							object ExecuteScalar(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
		object ExecuteScalar(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
							object ExecuteScalar(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
 | 
							object ExecuteScalar(DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// 在【主库】执行,ExecuteScalar("select 1 from user where age > @age", new { age = 25 })
 | 
							/// 在【主库】执行,ExecuteScalar("select 1 from user where age > @age", new { age = 25 })
 | 
				
			||||||
		/// </summary>
 | 
							/// </summary>
 | 
				
			||||||
@@ -131,6 +140,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <returns></returns>
 | 
							/// <returns></returns>
 | 
				
			||||||
		object ExecuteScalar(string cmdText, object parms = null);
 | 
							object ExecuteScalar(string cmdText, object parms = null);
 | 
				
			||||||
		object ExecuteScalar(DbTransaction transaction, string cmdText, object parms = null);
 | 
							object ExecuteScalar(DbTransaction transaction, string cmdText, object parms = null);
 | 
				
			||||||
 | 
							object ExecuteScalar(DbConnection connection, string cmdText, object parms = null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/// <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 })
 | 
				
			||||||
@@ -142,6 +152,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <returns></returns>
 | 
							/// <returns></returns>
 | 
				
			||||||
		List<T> Query<T>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
							List<T> Query<T>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
		List<T> Query<T>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
							List<T> Query<T>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
 | 
							List<T> Query<T>(DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
		/// <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>
 | 
				
			||||||
@@ -151,6 +162,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <returns></returns>
 | 
							/// <returns></returns>
 | 
				
			||||||
		List<T> Query<T>(string cmdText, object parms = null);
 | 
							List<T> Query<T>(string cmdText, object parms = null);
 | 
				
			||||||
		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, string cmdText, object parms = null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		#region async
 | 
							#region async
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
@@ -162,6 +174,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <param name="cmdParms"></param>
 | 
							/// <param name="cmdParms"></param>
 | 
				
			||||||
		Task ExecuteReaderAsync(Func<DbDataReader, Task> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
							Task ExecuteReaderAsync(Func<DbDataReader, Task> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
		Task ExecuteReaderAsync(DbTransaction transaction, Func<DbDataReader, Task> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
							Task ExecuteReaderAsync(DbTransaction transaction, Func<DbDataReader, Task> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
 | 
							Task ExecuteReaderAsync(DbConnection connection, Func<DbDataReader, Task> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 })
 | 
							/// 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 })
 | 
				
			||||||
		/// </summary>
 | 
							/// </summary>
 | 
				
			||||||
@@ -169,6 +182,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <param name="parms"></param>
 | 
							/// <param name="parms"></param>
 | 
				
			||||||
		Task ExecuteReaderAsync(Func<DbDataReader, Task> readerHander, string cmdText, object parms = null);
 | 
							Task ExecuteReaderAsync(Func<DbDataReader, Task> readerHander, string cmdText, object parms = null);
 | 
				
			||||||
		Task ExecuteReaderAsync(DbTransaction transaction, Func<DbDataReader, Task> readerHander, string cmdText, object parms = null);
 | 
							Task ExecuteReaderAsync(DbTransaction transaction, Func<DbDataReader, Task> readerHander, string cmdText, object parms = null);
 | 
				
			||||||
 | 
							Task ExecuteReaderAsync(DbConnection connection, Func<DbDataReader, Task> readerHander, string cmdText, object parms = null);
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// 查询
 | 
							/// 查询
 | 
				
			||||||
		/// </summary>
 | 
							/// </summary>
 | 
				
			||||||
@@ -176,6 +190,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <param name="cmdParms"></param>
 | 
							/// <param name="cmdParms"></param>
 | 
				
			||||||
		Task<object[][]> ExecuteArrayAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
							Task<object[][]> ExecuteArrayAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
		Task<object[][]> ExecuteArrayAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
							Task<object[][]> ExecuteArrayAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
 | 
							Task<object[][]> ExecuteArrayAsync(DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// 查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 })
 | 
							/// 查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 })
 | 
				
			||||||
		/// </summary>
 | 
							/// </summary>
 | 
				
			||||||
@@ -184,6 +199,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <returns></returns>
 | 
							/// <returns></returns>
 | 
				
			||||||
		Task<object[][]> ExecuteArrayAsync(string cmdText, object parms = null);
 | 
							Task<object[][]> ExecuteArrayAsync(string cmdText, object parms = null);
 | 
				
			||||||
		Task<object[][]> ExecuteArrayAsync(DbTransaction transaction, string cmdText, object parms = null);
 | 
							Task<object[][]> ExecuteArrayAsync(DbTransaction transaction, string cmdText, object parms = null);
 | 
				
			||||||
 | 
							Task<object[][]> ExecuteArrayAsync(DbConnection connection, string cmdText, object parms = null);
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// 查询
 | 
							/// 查询
 | 
				
			||||||
		/// </summary>
 | 
							/// </summary>
 | 
				
			||||||
@@ -191,6 +207,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <param name="cmdParms"></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, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// 查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 })
 | 
							/// 查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 })
 | 
				
			||||||
		/// </summary>
 | 
							/// </summary>
 | 
				
			||||||
@@ -199,6 +216,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <returns></returns>
 | 
							/// <returns></returns>
 | 
				
			||||||
		Task<DataTable> ExecuteDataTableAsync(string cmdText, object parms = null);
 | 
							Task<DataTable> ExecuteDataTableAsync(string cmdText, object parms = null);
 | 
				
			||||||
		Task<DataTable> ExecuteDataTableAsync(DbTransaction transaction, string cmdText, object parms = null);
 | 
							Task<DataTable> ExecuteDataTableAsync(DbTransaction transaction, string cmdText, object parms = null);
 | 
				
			||||||
 | 
							Task<DataTable> ExecuteDataTableAsync(DbConnection connection, string cmdText, object parms = null);
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// 在【主库】执行
 | 
							/// 在【主库】执行
 | 
				
			||||||
		/// </summary>
 | 
							/// </summary>
 | 
				
			||||||
@@ -207,6 +225,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <param name="cmdParms"></param>
 | 
							/// <param name="cmdParms"></param>
 | 
				
			||||||
		Task<int> ExecuteNonQueryAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
							Task<int> ExecuteNonQueryAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
		Task<int> ExecuteNonQueryAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
							Task<int> ExecuteNonQueryAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
 | 
							Task<int> ExecuteNonQueryAsync(DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 })
 | 
							/// 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 })
 | 
				
			||||||
		/// </summary>
 | 
							/// </summary>
 | 
				
			||||||
@@ -215,6 +234,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <returns></returns>
 | 
							/// <returns></returns>
 | 
				
			||||||
		Task<int> ExecuteNonQueryAsync(string cmdText, object parms = null);
 | 
							Task<int> ExecuteNonQueryAsync(string cmdText, object parms = null);
 | 
				
			||||||
		Task<int> ExecuteNonQueryAsync(DbTransaction transaction, string cmdText, object parms = null);
 | 
							Task<int> ExecuteNonQueryAsync(DbTransaction transaction, string cmdText, object parms = null);
 | 
				
			||||||
 | 
							Task<int> ExecuteNonQueryAsync(DbConnection connection, string cmdText, object parms = null);
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// 在【主库】执行
 | 
							/// 在【主库】执行
 | 
				
			||||||
		/// </summary>
 | 
							/// </summary>
 | 
				
			||||||
@@ -223,6 +243,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <param name="cmdParms"></param>
 | 
							/// <param name="cmdParms"></param>
 | 
				
			||||||
		Task<object> ExecuteScalarAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
							Task<object> ExecuteScalarAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
		Task<object> ExecuteScalarAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
							Task<object> ExecuteScalarAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
 | 
							Task<object> ExecuteScalarAsync(DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 })
 | 
							/// 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 })
 | 
				
			||||||
		/// </summary>
 | 
							/// </summary>
 | 
				
			||||||
@@ -231,6 +252,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <returns></returns>
 | 
							/// <returns></returns>
 | 
				
			||||||
		Task<object> ExecuteScalarAsync(string cmdText, object parms = null);
 | 
							Task<object> ExecuteScalarAsync(string cmdText, object parms = null);
 | 
				
			||||||
		Task<object> ExecuteScalarAsync(DbTransaction transaction, string cmdText, object parms = null);
 | 
							Task<object> ExecuteScalarAsync(DbTransaction transaction, string cmdText, object parms = null);
 | 
				
			||||||
 | 
							Task<object> ExecuteScalarAsync(DbConnection connection, string cmdText, object parms = null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 })
 | 
							/// 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 })
 | 
				
			||||||
@@ -242,6 +264,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <returns></returns>
 | 
							/// <returns></returns>
 | 
				
			||||||
		Task<List<T>> QueryAsync<T>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
							Task<List<T>> QueryAsync<T>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
		Task<List<T>> QueryAsync<T>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
							Task<List<T>> QueryAsync<T>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
 | 
							Task<List<T>> QueryAsync<T>(DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms);
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new { age = 25 })
 | 
							/// 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new { age = 25 })
 | 
				
			||||||
		/// </summary>
 | 
							/// </summary>
 | 
				
			||||||
@@ -251,6 +274,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <returns></returns>
 | 
							/// <returns></returns>
 | 
				
			||||||
		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, string cmdText, object parms = null);
 | 
				
			||||||
		#endregion
 | 
							#endregion
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										57
									
								
								FreeSql/Interface/IDbManage.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								FreeSql/Interface/IDbManage.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,57 @@
 | 
				
			|||||||
 | 
					//using FreeSql.DatabaseModel;
 | 
				
			||||||
 | 
					//using System;
 | 
				
			||||||
 | 
					//using System.Collections.Generic;
 | 
				
			||||||
 | 
					//using System.Text;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//namespace FreeSql {
 | 
				
			||||||
 | 
					//	public interface IDbManage {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//		/// <summary>
 | 
				
			||||||
 | 
					//		/// 判断表是否存在
 | 
				
			||||||
 | 
					//		/// </summary>
 | 
				
			||||||
 | 
					//		/// <param name="name">表名</param>
 | 
				
			||||||
 | 
					//		/// <returns></returns>
 | 
				
			||||||
 | 
					//		bool ExistsTable(string name);
 | 
				
			||||||
 | 
					//		/// <summary>
 | 
				
			||||||
 | 
					//		/// 判断列是否存在
 | 
				
			||||||
 | 
					//		/// </summary>
 | 
				
			||||||
 | 
					//		/// <param name="table">表名</param>
 | 
				
			||||||
 | 
					//		/// <param name="column">列名</param>
 | 
				
			||||||
 | 
					//		/// <returns></returns>
 | 
				
			||||||
 | 
					//		bool ExistsColumn(string table, string column);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//		/// <summary>
 | 
				
			||||||
 | 
					//		/// 判断视图是否存在
 | 
				
			||||||
 | 
					//		/// </summary>
 | 
				
			||||||
 | 
					//		/// <param name="name">视图名</param>
 | 
				
			||||||
 | 
					//		/// <returns></returns>
 | 
				
			||||||
 | 
					//		bool ExistsView(string name);
 | 
				
			||||||
 | 
					//		/// <summary>
 | 
				
			||||||
 | 
					//		/// 判断列是否存在
 | 
				
			||||||
 | 
					//		/// </summary>
 | 
				
			||||||
 | 
					//		/// <param name="view">视图名</param>
 | 
				
			||||||
 | 
					//		/// <param name="column">列名</param>
 | 
				
			||||||
 | 
					//		/// <returns></returns>
 | 
				
			||||||
 | 
					//		bool ExistsColumnByView(string view, string column);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//		/// <summary>
 | 
				
			||||||
 | 
					//		/// 获取表信息,包括表、列详情、主键、唯一键、索引、备注(注意:本方法不返回外键)
 | 
				
			||||||
 | 
					//		/// </summary>
 | 
				
			||||||
 | 
					//		/// <param name="name">表名</param>
 | 
				
			||||||
 | 
					//		/// <returns></returns>
 | 
				
			||||||
 | 
					//		DbTableInfo GetTableInfo(string name);
 | 
				
			||||||
 | 
					//		/// <summary>
 | 
				
			||||||
 | 
					//		/// 获取视图信息,包括表、列详情
 | 
				
			||||||
 | 
					//		/// </summary>
 | 
				
			||||||
 | 
					//		/// <param name="name">视图名</param>
 | 
				
			||||||
 | 
					//		/// <returns></returns>
 | 
				
			||||||
 | 
					//		DbTableInfo GetViewInfo(string name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//		/// <summary>
 | 
				
			||||||
 | 
					//		/// 获取指定数据库的表信息,包括表、列详情、主键、唯一键、索引、外键、备注
 | 
				
			||||||
 | 
					//		/// </summary>
 | 
				
			||||||
 | 
					//		/// <param name="database"></param>
 | 
				
			||||||
 | 
					//		/// <returns></returns>
 | 
				
			||||||
 | 
					//		List<DbTableInfo> GetTablesByDatabase(params string[] database);
 | 
				
			||||||
 | 
					//	}
 | 
				
			||||||
 | 
					//}
 | 
				
			||||||
@@ -11,7 +11,7 @@ namespace FreeSql {
 | 
				
			|||||||
		/// <returns></returns>
 | 
							/// <returns></returns>
 | 
				
			||||||
		List<string> GetDatabases();
 | 
							List<string> GetDatabases();
 | 
				
			||||||
		/// <summary>
 | 
							/// <summary>
 | 
				
			||||||
		/// 获取指定数据库的表信息,包括表、列详情、主键、唯一键、索引、外键
 | 
							/// 获取指定数据库的表信息,包括表、列详情、主键、唯一键、索引、外键、备注
 | 
				
			||||||
		/// </summary>
 | 
							/// </summary>
 | 
				
			||||||
		/// <param name="database"></param>
 | 
							/// <param name="database"></param>
 | 
				
			||||||
		/// <returns></returns>
 | 
							/// <returns></returns>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -760,6 +760,22 @@ namespace FreeSql.Internal {
 | 
				
			|||||||
			if (right == "NULL") tryoper = tryoper == "=" ? " IS " : " IS NOT ";
 | 
								if (right == "NULL") tryoper = tryoper == "=" ? " IS " : " IS NOT ";
 | 
				
			||||||
			if (tryoper == "+" && (expBinary.Left.Type.FullName == "System.String" || expBinary.Right.Type.FullName == "System.String")) return _common.StringConcat(left, right, expBinary.Left.Type, expBinary.Right.Type);
 | 
								if (tryoper == "+" && (expBinary.Left.Type.FullName == "System.String" || expBinary.Right.Type.FullName == "System.String")) return _common.StringConcat(left, right, expBinary.Left.Type, expBinary.Right.Type);
 | 
				
			||||||
			if (tryoper == "%") return _common.Mod(left, right, expBinary.Left.Type, expBinary.Right.Type);
 | 
								if (tryoper == "%") return _common.Mod(left, right, expBinary.Left.Type, expBinary.Right.Type);
 | 
				
			||||||
 | 
								if (_common._orm.Ado.DataType == DataType.MySql) {
 | 
				
			||||||
 | 
									//处理c#变态enum convert, a.EnumType1 == Xxx.Xxx,被转成了 Convert(a.EnumType1, Int32) == 1
 | 
				
			||||||
 | 
									if (expBinary.Left.NodeType == ExpressionType.Convert && expBinary.Right.NodeType == ExpressionType.Constant) {
 | 
				
			||||||
 | 
										if (long.TryParse(right, out var tryenumLong)) {
 | 
				
			||||||
 | 
											var enumType = (expBinary.Left as UnaryExpression)?.Operand.Type;
 | 
				
			||||||
 | 
											if (enumType?.IsEnum == true)
 | 
				
			||||||
 | 
												right = _common.FormatSql("{0}", Enum.Parse(enumType, right));
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									} else if (expBinary.Left.NodeType == ExpressionType.Constant && expBinary.Right.NodeType == ExpressionType.Convert) {
 | 
				
			||||||
 | 
										if (long.TryParse(left, out var tryenumLong)) {
 | 
				
			||||||
 | 
											var enumType = (expBinary.Right as UnaryExpression)?.Operand.Type;
 | 
				
			||||||
 | 
											if (enumType?.IsEnum == true)
 | 
				
			||||||
 | 
												left = _common.FormatSql("{0}", Enum.Parse(enumType, left));
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			return $"{left} {tryoper} {right}";
 | 
								return $"{left} {tryoper} {right}";
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -41,9 +41,9 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			if (IsTracePerformance) {
 | 
								if (IsTracePerformance) {
 | 
				
			||||||
				TimeSpan ts = DateTime.Now.Subtract(dt);
 | 
									TimeSpan ts = DateTime.Now.Subtract(dt);
 | 
				
			||||||
				if (e == null && ts.TotalMilliseconds > 100)
 | 
									if (e == null && ts.TotalMilliseconds > 100)
 | 
				
			||||||
					_log.LogWarning(logtxt.Insert(0, $"{pool.Policy.Name}(执行SQL)语句耗时过长{ts.TotalMilliseconds}ms\r\n{cmd.CommandText}\r\n").ToString());
 | 
										_log.LogWarning(logtxt.Insert(0, $"{pool?.Policy.Name}(执行SQL)语句耗时过长{ts.TotalMilliseconds}ms\r\n{cmd.CommandText}\r\n").ToString());
 | 
				
			||||||
				else
 | 
									else
 | 
				
			||||||
					logtxt.Insert(0, $"{pool.Policy.Name}(执行SQL)耗时{ts.TotalMilliseconds}ms\r\n{cmd.CommandText}\r\n").ToString();
 | 
										logtxt.Insert(0, $"{pool?.Policy.Name}(执行SQL)耗时{ts.TotalMilliseconds}ms\r\n{cmd.CommandText}\r\n").ToString();
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (e == null) {
 | 
								if (e == null) {
 | 
				
			||||||
@@ -52,7 +52,7 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			StringBuilder log = new StringBuilder();
 | 
								StringBuilder log = new StringBuilder();
 | 
				
			||||||
			log.Append(pool.Policy.Name).Append("数据库出错(执行SQL)〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓\r\n").Append(cmd.CommandText).Append("\r\n");
 | 
								log.Append(pool?.Policy.Name).Append("数据库出错(执行SQL)〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓\r\n").Append(cmd.CommandText).Append("\r\n");
 | 
				
			||||||
			foreach (DbParameter parm in cmd.Parameters)
 | 
								foreach (DbParameter parm in cmd.Parameters)
 | 
				
			||||||
				log.Append(parm.ParameterName.PadRight(20, ' ')).Append(" = ").Append((parm.Value ?? DBNull.Value) == DBNull.Value ? "NULL" : parm.Value).Append("\r\n");
 | 
									log.Append(parm.ParameterName.PadRight(20, ' ')).Append(" = ").Append((parm.Value ?? DBNull.Value) == DBNull.Value ? "NULL" : parm.Value).Append("\r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -74,16 +74,19 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		internal static ConcurrentDictionary<Type, PropertyInfo[]> dicQueryTypeGetProperties = new ConcurrentDictionary<Type, PropertyInfo[]>();
 | 
							internal static ConcurrentDictionary<Type, PropertyInfo[]> dicQueryTypeGetProperties = new ConcurrentDictionary<Type, PropertyInfo[]>();
 | 
				
			||||||
		public List<T> Query<T>(string cmdText, object parms = null) => Query<T>(null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
							public List<T> Query<T>(string cmdText, object parms = null) => Query<T>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public List<T> Query<T>(DbTransaction transaction, string cmdText, object parms = null) => Query<T>(transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
							public List<T> Query<T>(DbTransaction transaction, string cmdText, object parms = null) => Query<T>(transaction, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public List<T> Query<T>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T>(null, cmdType, cmdText, cmdParms);
 | 
							public List<T> Query<T>(DbConnection connection, string cmdText, object parms = null) => Query<T>(null, connection, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public List<T> Query<T>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
 | 
							public List<T> Query<T>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T>(null, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							public List<T> Query<T>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T>(transaction, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							public List<T> Query<T>(DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => Query<T>(null, connection, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							List<T> Query<T>(DbTransaction transaction, DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
 | 
				
			||||||
			var ret = new List<T>();
 | 
								var ret = new List<T>();
 | 
				
			||||||
			if (string.IsNullOrEmpty(cmdText)) return ret;
 | 
								if (string.IsNullOrEmpty(cmdText)) return ret;
 | 
				
			||||||
			var type = typeof(T);
 | 
								var type = typeof(T);
 | 
				
			||||||
			int[] indexes = null;
 | 
								int[] indexes = null;
 | 
				
			||||||
			var props = dicQueryTypeGetProperties.GetOrAdd(type, k => type.GetProperties());
 | 
								var props = dicQueryTypeGetProperties.GetOrAdd(type, k => type.GetProperties());
 | 
				
			||||||
			ExecuteReader(transaction, dr => {
 | 
								ExecuteReader(transaction, connection, dr => {
 | 
				
			||||||
				if (indexes == null) {
 | 
									if (indexes == null) {
 | 
				
			||||||
					var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
										var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
					for (var a = 0; a < dr.FieldCount; a++)
 | 
										for (var a = 0; a < dr.FieldCount; a++)
 | 
				
			||||||
@@ -94,10 +97,13 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			}, cmdType, cmdText, cmdParms);
 | 
								}, cmdType, cmdText, cmdParms);
 | 
				
			||||||
			return ret;
 | 
								return ret;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		public void ExecuteReader(Action<DbDataReader> readerHander, string cmdText, object parms = null) => ExecuteReader(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(transaction, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
							public void ExecuteReader(DbTransaction transaction, Action<DbDataReader> readerHander, string cmdText, object parms = null) => ExecuteReader(transaction, null, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public void ExecuteReader(Action<DbDataReader> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReader(null, readerHander, cmdType, cmdText, cmdParms);
 | 
							public void ExecuteReader(DbConnection connection, Action<DbDataReader> readerHander, string cmdText, object parms = null) => ExecuteReader(null, connection, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public void ExecuteReader(DbTransaction transaction, Action<DbDataReader> readerHander, CommandType cmdType, string cmdText, params DbParameter[] 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(transaction, null, readerHander, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							public void ExecuteReader(DbConnection connection, Action<DbDataReader> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReader(null, connection, readerHander, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							void ExecuteReader(DbTransaction transaction, DbConnection connection, Action<DbDataReader> 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();
 | 
				
			||||||
@@ -105,6 +111,7 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			var pool = this.MasterPool;
 | 
								var pool = this.MasterPool;
 | 
				
			||||||
			var isSlave = false;
 | 
								var isSlave = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (transaction == null && connection == null) {
 | 
				
			||||||
				//读写分离规则
 | 
									//读写分离规则
 | 
				
			||||||
				if (this.SlavePools.Any() && cmdText.StartsWith("SELECT ", StringComparison.CurrentCultureIgnoreCase)) {
 | 
									if (this.SlavePools.Any() && cmdText.StartsWith("SELECT ", StringComparison.CurrentCultureIgnoreCase)) {
 | 
				
			||||||
					var availables = slaveUnavailables == 0 ?
 | 
										var availables = slaveUnavailables == 0 ?
 | 
				
			||||||
@@ -119,9 +126,10 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
						pool = availables.Count == 1 ? availables[0] : availables[slaveRandom.Next(availables.Count)];
 | 
											pool = availables.Count == 1 ? availables[0] : availables[slaveRandom.Next(availables.Count)];
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			Object<DbConnection> conn = null;
 | 
								Object<DbConnection> conn = null;
 | 
				
			||||||
			var pc = PrepareCommand(transaction, cmdType, cmdText, cmdParms, logtxt);
 | 
								var pc = PrepareCommand(transaction, connection, cmdType, cmdText, cmdParms, logtxt);
 | 
				
			||||||
			if (IsTracePerformance) logtxt.Append("PrepareCommand: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms\r\n");
 | 
								if (IsTracePerformance) logtxt.Append("PrepareCommand: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms\r\n");
 | 
				
			||||||
			Exception ex = null;
 | 
								Exception ex = null;
 | 
				
			||||||
			try {
 | 
								try {
 | 
				
			||||||
@@ -130,7 +138,7 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
					//从库查询切换,恢复
 | 
										//从库查询切换,恢复
 | 
				
			||||||
					bool isSlaveFail = false;
 | 
										bool isSlaveFail = false;
 | 
				
			||||||
					try {
 | 
										try {
 | 
				
			||||||
						if (pc.cmd.Connection == null) pc.cmd.Connection = (conn = pool.Get()).Value;
 | 
											if (pc.Connection == null) pc.Connection = (conn = pool.Get()).Value;
 | 
				
			||||||
						//if (slaveRandom.Next(100) % 2 == 0) throw new Exception("测试从库抛出异常");
 | 
											//if (slaveRandom.Next(100) % 2 == 0) throw new Exception("测试从库抛出异常");
 | 
				
			||||||
					} catch {
 | 
										} catch {
 | 
				
			||||||
						isSlaveFail = true;
 | 
											isSlaveFail = true;
 | 
				
			||||||
@@ -141,20 +149,20 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
							ReturnConnection(pool, conn, ex); //pool.Return(conn, ex);
 | 
												ReturnConnection(pool, conn, ex); //pool.Return(conn, ex);
 | 
				
			||||||
							if (IsTracePerformance) logtxt.Append("ReleaseConnection: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms");
 | 
												if (IsTracePerformance) logtxt.Append("ReleaseConnection: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms");
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						LoggerException(pool, pc.cmd, new Exception($"连接失败,准备切换其他可用服务器"), dt, logtxt, false);
 | 
											LoggerException(pool, pc, new Exception($"连接失败,准备切换其他可用服务器"), dt, logtxt, false);
 | 
				
			||||||
						pc.cmd.Parameters.Clear();
 | 
											pc.Parameters.Clear();
 | 
				
			||||||
						ExecuteReader(readerHander, cmdType, cmdText, cmdParms);
 | 
											ExecuteReader(readerHander, cmdType, cmdText, cmdParms);
 | 
				
			||||||
						return;
 | 
											return;
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					//主库查询
 | 
										//主库查询
 | 
				
			||||||
					if (pc.cmd.Connection == null) pc.cmd.Connection = (conn = pool.Get()).Value;
 | 
										if (pc.Connection == null) pc.Connection = (conn = pool.Get()).Value;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if (IsTracePerformance) {
 | 
									if (IsTracePerformance) {
 | 
				
			||||||
					logtxt.Append("Open: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms\r\n");
 | 
										logtxt.Append("Open: ").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;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				using (var dr = pc.cmd.ExecuteReader()) {
 | 
									using (var dr = pc.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");
 | 
				
			||||||
					while (true) {
 | 
										while (true) {
 | 
				
			||||||
						if (IsTracePerformance) logtxt_dt = DateTime.Now;
 | 
											if (IsTracePerformance) logtxt_dt = DateTime.Now;
 | 
				
			||||||
@@ -188,27 +196,33 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
				ReturnConnection(pool, conn, ex); //pool.Return(conn, ex);
 | 
									ReturnConnection(pool, conn, ex); //pool.Return(conn, ex);
 | 
				
			||||||
				if (IsTracePerformance) logtxt.Append("ReleaseConnection: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms");
 | 
									if (IsTracePerformance) logtxt.Append("ReleaseConnection: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms");
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			LoggerException(pool, pc.cmd, ex, dt, logtxt);
 | 
								LoggerException(pool, pc, ex, dt, logtxt);
 | 
				
			||||||
			pc.cmd.Parameters.Clear();
 | 
								pc.Parameters.Clear();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		public object[][] ExecuteArray(string cmdText, object parms = null) => ExecuteArray(null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
							public object[][] ExecuteArray(string cmdText, object parms = null) => ExecuteArray(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public object[][] ExecuteArray(DbTransaction transaction, string cmdText, object parms = null) => ExecuteArray(transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
							public object[][] ExecuteArray(DbTransaction transaction, string cmdText, object parms = null) => ExecuteArray(transaction, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public object[][] ExecuteArray(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteArray(null, cmdType, cmdText, cmdParms);
 | 
							public object[][] ExecuteArray(DbConnection connection, string cmdText, object parms = null) => ExecuteArray(null, connection, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public object[][] ExecuteArray(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
 | 
							public object[][] ExecuteArray(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteArray(null, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							public object[][] ExecuteArray(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteArray(transaction, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							public object[][] ExecuteArray(DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteArray(null, connection, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							object[][] ExecuteArray(DbTransaction transaction, DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
 | 
				
			||||||
			List<object[]> ret = new List<object[]>();
 | 
								List<object[]> ret = new List<object[]>();
 | 
				
			||||||
			ExecuteReader(transaction, dr => {
 | 
								ExecuteReader(transaction, connection, dr => {
 | 
				
			||||||
				object[] values = new object[dr.FieldCount];
 | 
									object[] values = new object[dr.FieldCount];
 | 
				
			||||||
				dr.GetValues(values);
 | 
									dr.GetValues(values);
 | 
				
			||||||
				ret.Add(values);
 | 
									ret.Add(values);
 | 
				
			||||||
			}, cmdType, cmdText, cmdParms);
 | 
								}, cmdType, cmdText, cmdParms);
 | 
				
			||||||
			return ret.ToArray();
 | 
								return ret.ToArray();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		public DataTable ExecuteDataTable(string cmdText, object parms = null) => ExecuteDataTable(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(transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
							public DataTable ExecuteDataTable(DbTransaction transaction, string cmdText, object parms = null) => ExecuteDataTable(transaction, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public DataTable ExecuteDataTable(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteDataTable(null, cmdType, cmdText, cmdParms);
 | 
							public DataTable ExecuteDataTable(DbConnection connection, string cmdText, object parms = null) => ExecuteDataTable(null, connection, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public DataTable ExecuteDataTable(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
 | 
							public DataTable ExecuteDataTable(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteDataTable(null, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							public DataTable ExecuteDataTable(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteDataTable(transaction, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							public DataTable ExecuteDataTable(DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteDataTable(null, connection, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							DataTable ExecuteDataTable(DbTransaction transaction, DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
 | 
				
			||||||
			var ret = new DataTable();
 | 
								var ret = new DataTable();
 | 
				
			||||||
			ExecuteReader(transaction, dr => {
 | 
								ExecuteReader(transaction, connection, dr => {
 | 
				
			||||||
				if (ret.Columns.Count == 0)
 | 
									if (ret.Columns.Count == 0)
 | 
				
			||||||
					for (var a = 0; a < dr.FieldCount; a++) ret.Columns.Add(dr.GetName(a));
 | 
										for (var a = 0; a < dr.FieldCount; a++) ret.Columns.Add(dr.GetName(a));
 | 
				
			||||||
				object[] values = new object[ret.Columns.Count];
 | 
									object[] values = new object[ret.Columns.Count];
 | 
				
			||||||
@@ -217,21 +231,24 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			}, cmdType, cmdText, cmdParms);
 | 
								}, cmdType, cmdText, cmdParms);
 | 
				
			||||||
			return ret;
 | 
								return ret;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		public int ExecuteNonQuery(string cmdText, object parms = null) => ExecuteNonQuery(null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
							public int ExecuteNonQuery(string cmdText, object parms = null) => ExecuteNonQuery(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public int ExecuteNonQuery(DbTransaction transaction, string cmdText, object parms = null) => ExecuteNonQuery(transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
							public int ExecuteNonQuery(DbTransaction transaction, string cmdText, object parms = null) => ExecuteNonQuery(transaction, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public int ExecuteNonQuery(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteNonQuery(null, cmdType, cmdText, cmdParms);
 | 
							public int ExecuteNonQuery(DbConnection connection, string cmdText, object parms = null) => ExecuteNonQuery(null, connection, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public int ExecuteNonQuery(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
 | 
							public int ExecuteNonQuery(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteNonQuery(null, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							public int ExecuteNonQuery(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteNonQuery(transaction, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							public int ExecuteNonQuery(DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteNonQuery(null, connection, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							int ExecuteNonQuery(DbTransaction transaction, DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
 | 
				
			||||||
			if (string.IsNullOrEmpty(cmdText)) return 0;
 | 
								if (string.IsNullOrEmpty(cmdText)) return 0;
 | 
				
			||||||
			var dt = DateTime.Now;
 | 
								var dt = DateTime.Now;
 | 
				
			||||||
			var logtxt = new StringBuilder();
 | 
								var logtxt = new StringBuilder();
 | 
				
			||||||
			var logtxt_dt = DateTime.Now;
 | 
								var logtxt_dt = DateTime.Now;
 | 
				
			||||||
			Object<DbConnection> conn = null;
 | 
								Object<DbConnection> conn = null;
 | 
				
			||||||
			var pc = PrepareCommand(transaction, cmdType, cmdText, cmdParms, logtxt);
 | 
								var pc = PrepareCommand(transaction, connection, cmdType, cmdText, cmdParms, logtxt);
 | 
				
			||||||
			int val = 0;
 | 
								int val = 0;
 | 
				
			||||||
			Exception ex = null;
 | 
								Exception ex = null;
 | 
				
			||||||
			try {
 | 
								try {
 | 
				
			||||||
				if (pc.cmd.Connection == null) pc.cmd.Connection = (conn = this.MasterPool.Get()).Value;
 | 
									if (pc.Connection == null) pc.Connection = (conn = this.MasterPool.Get()).Value;
 | 
				
			||||||
				val = pc.cmd.ExecuteNonQuery();
 | 
									val = pc.ExecuteNonQuery();
 | 
				
			||||||
			} catch (Exception ex2) {
 | 
								} catch (Exception ex2) {
 | 
				
			||||||
				ex = ex2;
 | 
									ex = ex2;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -241,25 +258,28 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
				ReturnConnection(MasterPool, conn, ex); //this.MasterPool.Return(conn, ex);
 | 
									ReturnConnection(MasterPool, conn, ex); //this.MasterPool.Return(conn, ex);
 | 
				
			||||||
				if (IsTracePerformance) logtxt.Append("ReleaseConnection: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms");
 | 
									if (IsTracePerformance) logtxt.Append("ReleaseConnection: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms");
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			LoggerException(this.MasterPool, pc.cmd, ex, dt, logtxt);
 | 
								LoggerException(this.MasterPool, pc, ex, dt, logtxt);
 | 
				
			||||||
			pc.cmd.Parameters.Clear();
 | 
								pc.Parameters.Clear();
 | 
				
			||||||
			return val;
 | 
								return val;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		public object ExecuteScalar(string cmdText, object parms = null) => ExecuteScalar(null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
							public object ExecuteScalar(string cmdText, object parms = null) => ExecuteScalar(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public object ExecuteScalar(DbTransaction transaction, string cmdText, object parms = null) => ExecuteScalar(transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
							public object ExecuteScalar(DbTransaction transaction, string cmdText, object parms = null) => ExecuteScalar(transaction, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public object ExecuteScalar(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteScalar(null, cmdType, cmdText, cmdParms);
 | 
							public object ExecuteScalar(DbConnection connection, string cmdText, object parms = null) => ExecuteScalar(null, connection, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public object ExecuteScalar(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
 | 
							public object ExecuteScalar(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteScalar(null, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							public object ExecuteScalar(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteScalar(transaction, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							public object ExecuteScalar(DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteScalar(null, connection, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							object ExecuteScalar(DbTransaction transaction, DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
 | 
				
			||||||
			if (string.IsNullOrEmpty(cmdText)) return null;
 | 
								if (string.IsNullOrEmpty(cmdText)) return null;
 | 
				
			||||||
			var dt = DateTime.Now;
 | 
								var dt = DateTime.Now;
 | 
				
			||||||
			var logtxt = new StringBuilder();
 | 
								var logtxt = new StringBuilder();
 | 
				
			||||||
			var logtxt_dt = DateTime.Now;
 | 
								var logtxt_dt = DateTime.Now;
 | 
				
			||||||
			Object<DbConnection> conn = null;
 | 
								Object<DbConnection> conn = null;
 | 
				
			||||||
			var pc = PrepareCommand(transaction, cmdType, cmdText, cmdParms, logtxt);
 | 
								var pc = PrepareCommand(transaction, connection, cmdType, cmdText, cmdParms, logtxt);
 | 
				
			||||||
			object val = null;
 | 
								object val = null;
 | 
				
			||||||
			Exception ex = null;
 | 
								Exception ex = null;
 | 
				
			||||||
			try {
 | 
								try {
 | 
				
			||||||
				if (pc.cmd.Connection == null) pc.cmd.Connection = (conn = this.MasterPool.Get()).Value;
 | 
									if (pc.Connection == null) pc.Connection = (conn = this.MasterPool.Get()).Value;
 | 
				
			||||||
				val = pc.cmd.ExecuteScalar();
 | 
									val = pc.ExecuteScalar();
 | 
				
			||||||
			} catch (Exception ex2) {
 | 
								} catch (Exception ex2) {
 | 
				
			||||||
				ex = ex2;
 | 
									ex = ex2;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -269,12 +289,12 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
				ReturnConnection(MasterPool, conn, ex); //this.MasterPool.Return(conn, ex);
 | 
									ReturnConnection(MasterPool, conn, ex); //this.MasterPool.Return(conn, ex);
 | 
				
			||||||
				if (IsTracePerformance) logtxt.Append("ReleaseConnection: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms");
 | 
									if (IsTracePerformance) logtxt.Append("ReleaseConnection: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms");
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			LoggerException(this.MasterPool, pc.cmd, ex, dt, logtxt);
 | 
								LoggerException(this.MasterPool, pc, ex, dt, logtxt);
 | 
				
			||||||
			pc.cmd.Parameters.Clear();
 | 
								pc.Parameters.Clear();
 | 
				
			||||||
			return val;
 | 
								return val;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		private (DbTransaction tran, DbCommand cmd) PrepareCommand(DbTransaction transaction, CommandType cmdType, string cmdText, DbParameter[] cmdParms, StringBuilder logtxt) {
 | 
							DbCommand PrepareCommand(DbTransaction transaction, DbConnection connection, CommandType cmdType, string cmdText, DbParameter[] cmdParms, StringBuilder logtxt) {
 | 
				
			||||||
			var dt = DateTime.Now;
 | 
								var dt = DateTime.Now;
 | 
				
			||||||
			DbCommand cmd = CreateCommand();
 | 
								DbCommand cmd = CreateCommand();
 | 
				
			||||||
			cmd.CommandType = cmdType;
 | 
								cmd.CommandType = cmdType;
 | 
				
			||||||
@@ -296,14 +316,15 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
				cmd.Connection = tran.Connection;
 | 
									cmd.Connection = tran.Connection;
 | 
				
			||||||
				cmd.Transaction = tran;
 | 
									cmd.Transaction = tran;
 | 
				
			||||||
				if (IsTracePerformance) logtxt.Append("	PrepareCommand_tran!=null: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms\r\n");
 | 
									if (IsTracePerformance) logtxt.Append("	PrepareCommand_tran!=null: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms\r\n");
 | 
				
			||||||
			}
 | 
								} else
 | 
				
			||||||
 | 
									cmd.Connection = connection;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (IsTracePerformance) dt = DateTime.Now;
 | 
								if (IsTracePerformance) dt = DateTime.Now;
 | 
				
			||||||
			AutoCommitTransaction();
 | 
								AutoCommitTransaction();
 | 
				
			||||||
			if (IsTracePerformance) logtxt.Append("   AutoCommitTransaction: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms\r\n");
 | 
								if (IsTracePerformance) logtxt.Append("   AutoCommitTransaction: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms\r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			AopCommandExecuting?.Invoke(cmd);
 | 
								AopCommandExecuting?.Invoke(cmd);
 | 
				
			||||||
			return (tran, cmd);
 | 
								return cmd;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,16 +9,19 @@ using System.Threading.Tasks;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace FreeSql.Internal.CommonProvider {
 | 
					namespace FreeSql.Internal.CommonProvider {
 | 
				
			||||||
	partial class AdoProvider {
 | 
						partial class AdoProvider {
 | 
				
			||||||
		public Task<List<T>> QueryAsync<T>(string cmdText, object parms = null) => QueryAsync<T>(null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
							public Task<List<T>> QueryAsync<T>(string cmdText, object parms = null) => QueryAsync<T>(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public Task<List<T>> QueryAsync<T>(DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T>(transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
							public Task<List<T>> QueryAsync<T>(DbTransaction transaction, string cmdText, object parms = null) => QueryAsync<T>(transaction, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public Task<List<T>> QueryAsync<T>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T>(null, cmdType, cmdText, cmdParms);
 | 
							public Task<List<T>> QueryAsync<T>(DbConnection connection, string cmdText, object parms = null) => QueryAsync<T>(null, connection, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		async public Task<List<T>> QueryAsync<T>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
 | 
							public Task<List<T>> QueryAsync<T>(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T>(null, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							public Task<List<T>> QueryAsync<T>(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T>(transaction, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							public Task<List<T>> QueryAsync<T>(DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => QueryAsync<T>(null, connection, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							async Task<List<T>> QueryAsync<T>(DbTransaction transaction, DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
 | 
				
			||||||
			var ret = new List<T>();
 | 
								var ret = new List<T>();
 | 
				
			||||||
			if (string.IsNullOrEmpty(cmdText)) return ret;
 | 
								if (string.IsNullOrEmpty(cmdText)) return ret;
 | 
				
			||||||
			var type = typeof(T);
 | 
								var type = typeof(T);
 | 
				
			||||||
			int[] indexes = null;
 | 
								int[] indexes = null;
 | 
				
			||||||
			var props = dicQueryTypeGetProperties.GetOrAdd(type, k => type.GetProperties());
 | 
								var props = dicQueryTypeGetProperties.GetOrAdd(type, k => type.GetProperties());
 | 
				
			||||||
			await ExecuteReaderAsync(transaction, dr => {
 | 
								await ExecuteReaderAsync(transaction, connection, dr => {
 | 
				
			||||||
				if (indexes == null) {
 | 
									if (indexes == null) {
 | 
				
			||||||
					var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
										var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
 | 
				
			||||||
					for (var a = 0; a < dr.FieldCount; a++)
 | 
										for (var a = 0; a < dr.FieldCount; a++)
 | 
				
			||||||
@@ -30,10 +33,13 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			}, cmdType, cmdText, cmdParms);
 | 
								}, cmdType, cmdText, cmdParms);
 | 
				
			||||||
			return ret;
 | 
								return ret;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		public Task ExecuteReaderAsync(Func<DbDataReader, Task> readerHander, string cmdText, object parms = null) => ExecuteReaderAsync(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(transaction, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
							public Task ExecuteReaderAsync(DbTransaction transaction, Func<DbDataReader, Task> readerHander, string cmdText, object parms = null) => ExecuteReaderAsync(transaction, null, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public Task ExecuteReaderAsync(Func<DbDataReader, Task> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderAsync(null, readerHander, cmdType, cmdText, cmdParms);
 | 
							public Task ExecuteReaderAsync(DbConnection connection, Func<DbDataReader, Task> readerHander, string cmdText, object parms = null) => ExecuteReaderAsync(null, connection, readerHander, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		async public Task ExecuteReaderAsync(DbTransaction transaction, Func<DbDataReader, Task> readerHander, CommandType cmdType, string cmdText, params DbParameter[] 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(transaction, null, readerHander, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							public Task ExecuteReaderAsync(DbConnection connection, Func<DbDataReader, Task> readerHander, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteReaderAsync(null, connection, readerHander, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							async Task ExecuteReaderAsync(DbTransaction transaction, DbConnection connection, Func<DbDataReader, 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();
 | 
				
			||||||
@@ -41,6 +47,7 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			var pool = this.MasterPool;
 | 
								var pool = this.MasterPool;
 | 
				
			||||||
			var isSlave = false;
 | 
								var isSlave = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (transaction == null && connection == null) {
 | 
				
			||||||
				//读写分离规则
 | 
									//读写分离规则
 | 
				
			||||||
				if (this.SlavePools.Any() && cmdText.StartsWith("SELECT ", StringComparison.CurrentCultureIgnoreCase)) {
 | 
									if (this.SlavePools.Any() && cmdText.StartsWith("SELECT ", StringComparison.CurrentCultureIgnoreCase)) {
 | 
				
			||||||
					var availables = slaveUnavailables == 0 ?
 | 
										var availables = slaveUnavailables == 0 ?
 | 
				
			||||||
@@ -55,9 +62,10 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
						pool = availables.Count == 1 ? this.SlavePools[0] : availables[slaveRandom.Next(availables.Count)];
 | 
											pool = availables.Count == 1 ? this.SlavePools[0] : availables[slaveRandom.Next(availables.Count)];
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			Object<DbConnection> conn = null;
 | 
								Object<DbConnection> conn = null;
 | 
				
			||||||
			var cmd = PrepareCommandAsync(transaction, cmdType, cmdText, cmdParms, logtxt);
 | 
								var cmd = PrepareCommandAsync(transaction, connection, cmdType, cmdText, cmdParms, logtxt);
 | 
				
			||||||
			if (IsTracePerformance) logtxt.Append("PrepareCommandAsync: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms\r\n");
 | 
								if (IsTracePerformance) logtxt.Append("PrepareCommandAsync: ").Append(DateTime.Now.Subtract(logtxt_dt).TotalMilliseconds).Append("ms Total: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms\r\n");
 | 
				
			||||||
			Exception ex = null;
 | 
								Exception ex = null;
 | 
				
			||||||
			try {
 | 
								try {
 | 
				
			||||||
@@ -127,24 +135,30 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			LoggerException(pool, cmd, ex, dt, logtxt);
 | 
								LoggerException(pool, cmd, ex, dt, logtxt);
 | 
				
			||||||
			cmd.Parameters.Clear();
 | 
								cmd.Parameters.Clear();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		public Task<object[][]> ExecuteArrayAsync(string cmdText, object parms = null) => ExecuteArrayAsync(null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
							public Task<object[][]> ExecuteArrayAsync(string cmdText, object parms = null) => ExecuteArrayAsync(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public Task<object[][]> ExecuteArrayAsync(DbTransaction transaction, string cmdText, object parms = null) => ExecuteArrayAsync(transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
							public Task<object[][]> ExecuteArrayAsync(DbTransaction transaction, string cmdText, object parms = null) => ExecuteArrayAsync(transaction, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public Task<object[][]> ExecuteArrayAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteArrayAsync(null, cmdType, cmdText, cmdParms);
 | 
							public Task<object[][]> ExecuteArrayAsync(DbConnection connection, string cmdText, object parms = null) => ExecuteArrayAsync(null, connection, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		async public Task<object[][]> ExecuteArrayAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
 | 
							public Task<object[][]> ExecuteArrayAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteArrayAsync(null, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							public Task<object[][]> ExecuteArrayAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteArrayAsync(transaction, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							public Task<object[][]> ExecuteArrayAsync(DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteArrayAsync(null, connection, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							async Task<object[][]> ExecuteArrayAsync(DbTransaction transaction, DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
 | 
				
			||||||
			List<object[]> ret = new List<object[]>();
 | 
								List<object[]> ret = new List<object[]>();
 | 
				
			||||||
			await ExecuteReaderAsync(transaction, async dr => {
 | 
								await ExecuteReaderAsync(transaction, connection, async dr => {
 | 
				
			||||||
				object[] values = new object[dr.FieldCount];
 | 
									object[] 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);
 | 
				
			||||||
				ret.Add(values);
 | 
									ret.Add(values);
 | 
				
			||||||
			}, cmdType, cmdText, cmdParms);
 | 
								}, cmdType, cmdText, cmdParms);
 | 
				
			||||||
			return ret.ToArray();
 | 
								return ret.ToArray();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		public Task<DataTable> ExecuteDataTableAsync(string cmdText, object parms = null) => ExecuteDataTableAsync(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(transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
							public Task<DataTable> ExecuteDataTableAsync(DbTransaction transaction, string cmdText, object parms = null) => ExecuteDataTableAsync(transaction, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public Task<DataTable> ExecuteDataTableAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteDataTableAsync(null, cmdType, cmdText, cmdParms);
 | 
							public Task<DataTable> ExecuteDataTableAsync(DbConnection connection, string cmdText, object parms = null) => ExecuteDataTableAsync(null, connection, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		async public Task<DataTable> ExecuteDataTableAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
 | 
							public Task<DataTable> ExecuteDataTableAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteDataTableAsync(null, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							public Task<DataTable> ExecuteDataTableAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteDataTableAsync(transaction, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							public Task<DataTable> ExecuteDataTableAsync(DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteDataTableAsync(null, connection, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							async Task<DataTable> ExecuteDataTableAsync(DbTransaction transaction, DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
 | 
				
			||||||
			var ret = new DataTable();
 | 
								var ret = new DataTable();
 | 
				
			||||||
			await ExecuteReaderAsync(transaction, async dr => {
 | 
								await ExecuteReaderAsync(transaction, connection, async dr => {
 | 
				
			||||||
				if (ret.Columns.Count == 0)
 | 
									if (ret.Columns.Count == 0)
 | 
				
			||||||
					for (var a = 0; a < dr.FieldCount; a++) ret.Columns.Add(dr.GetName(a));
 | 
										for (var a = 0; a < dr.FieldCount; a++) ret.Columns.Add(dr.GetName(a));
 | 
				
			||||||
				object[] values = new object[ret.Columns.Count];
 | 
									object[] values = new object[ret.Columns.Count];
 | 
				
			||||||
@@ -153,16 +167,19 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			}, cmdType, cmdText, cmdParms);
 | 
								}, cmdType, cmdText, cmdParms);
 | 
				
			||||||
			return ret;
 | 
								return ret;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		public Task<int> ExecuteNonQueryAsync(string cmdText, object parms = null) => ExecuteNonQueryAsync(null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
							public Task<int> ExecuteNonQueryAsync(string cmdText, object parms = null) => ExecuteNonQueryAsync(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public Task<int> ExecuteNonQueryAsync(DbTransaction transaction, string cmdText, object parms = null) => ExecuteNonQueryAsync(transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
							public Task<int> ExecuteNonQueryAsync(DbTransaction transaction, string cmdText, object parms = null) => ExecuteNonQueryAsync(transaction, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public Task<int> ExecuteNonQueryAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteNonQueryAsync(null, cmdType, cmdText, cmdParms);
 | 
							public Task<int> ExecuteNonQueryAsync(DbConnection connection, string cmdText, object parms = null) => ExecuteNonQueryAsync(null, connection, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		async public Task<int> ExecuteNonQueryAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
 | 
							public Task<int> ExecuteNonQueryAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteNonQueryAsync(null, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							public Task<int> ExecuteNonQueryAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteNonQueryAsync(transaction, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							public Task<int> ExecuteNonQueryAsync(DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteNonQueryAsync(null, connection, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							async Task<int> ExecuteNonQueryAsync(DbTransaction transaction, DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
 | 
				
			||||||
			if (string.IsNullOrEmpty(cmdText)) return 0;
 | 
								if (string.IsNullOrEmpty(cmdText)) return 0;
 | 
				
			||||||
			var dt = DateTime.Now;
 | 
								var dt = DateTime.Now;
 | 
				
			||||||
			var logtxt = new StringBuilder();
 | 
								var logtxt = new StringBuilder();
 | 
				
			||||||
			var logtxt_dt = DateTime.Now;
 | 
								var logtxt_dt = DateTime.Now;
 | 
				
			||||||
			Object<DbConnection> conn = null;
 | 
								Object<DbConnection> conn = null;
 | 
				
			||||||
			var cmd = PrepareCommandAsync(transaction, cmdType, cmdText, cmdParms, logtxt);
 | 
								var cmd = PrepareCommandAsync(transaction, connection, cmdType, cmdText, cmdParms, logtxt);
 | 
				
			||||||
			int val = 0;
 | 
								int val = 0;
 | 
				
			||||||
			Exception ex = null;
 | 
								Exception ex = null;
 | 
				
			||||||
			try {
 | 
								try {
 | 
				
			||||||
@@ -181,16 +198,19 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			cmd.Parameters.Clear();
 | 
								cmd.Parameters.Clear();
 | 
				
			||||||
			return val;
 | 
								return val;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		public Task<object> ExecuteScalarAsync(string cmdText, object parms = null) => ExecuteScalarAsync(null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
							public Task<object> ExecuteScalarAsync(string cmdText, object parms = null) => ExecuteScalarAsync(null, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public Task<object> ExecuteScalarAsync(DbTransaction transaction, string cmdText, object parms = null) => ExecuteScalarAsync(transaction, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
							public Task<object> ExecuteScalarAsync(DbTransaction transaction, string cmdText, object parms = null) => ExecuteScalarAsync(transaction, null, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		public Task<object> ExecuteScalarAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteScalarAsync(null, cmdType, cmdText, cmdParms);
 | 
							public Task<object> ExecuteScalarAsync(DbConnection connection, string cmdText, object parms = null) => ExecuteScalarAsync(null, connection, CommandType.Text, cmdText, GetDbParamtersByObject(cmdText, parms));
 | 
				
			||||||
		async public Task<object> ExecuteScalarAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
 | 
							public Task<object> ExecuteScalarAsync(CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteScalarAsync(null, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							public Task<object> ExecuteScalarAsync(DbTransaction transaction, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteScalarAsync(transaction, null, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							public Task<object> ExecuteScalarAsync(DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) => ExecuteScalarAsync(null, connection, cmdType, cmdText, cmdParms);
 | 
				
			||||||
 | 
							async Task<object> ExecuteScalarAsync(DbTransaction transaction, DbConnection connection, CommandType cmdType, string cmdText, params DbParameter[] cmdParms) {
 | 
				
			||||||
			if (string.IsNullOrEmpty(cmdText)) return null;
 | 
								if (string.IsNullOrEmpty(cmdText)) return null;
 | 
				
			||||||
			var dt = DateTime.Now;
 | 
								var dt = DateTime.Now;
 | 
				
			||||||
			var logtxt = new StringBuilder();
 | 
								var logtxt = new StringBuilder();
 | 
				
			||||||
			var logtxt_dt = DateTime.Now;
 | 
								var logtxt_dt = DateTime.Now;
 | 
				
			||||||
			Object<DbConnection> conn = null;
 | 
								Object<DbConnection> conn = null;
 | 
				
			||||||
			var cmd = PrepareCommandAsync(transaction, cmdType, cmdText, cmdParms, logtxt);
 | 
								var cmd = PrepareCommandAsync(transaction, connection, cmdType, cmdText, cmdParms, logtxt);
 | 
				
			||||||
			object val = null;
 | 
								object val = null;
 | 
				
			||||||
			Exception ex = null;
 | 
								Exception ex = null;
 | 
				
			||||||
			try {
 | 
								try {
 | 
				
			||||||
@@ -210,7 +230,7 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			return val;
 | 
								return val;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		private DbCommand PrepareCommandAsync(DbTransaction transaction, CommandType cmdType, string cmdText, DbParameter[] cmdParms, StringBuilder logtxt) {
 | 
							private DbCommand PrepareCommandAsync(DbTransaction transaction, DbConnection connection, CommandType cmdType, string cmdText, DbParameter[] cmdParms, StringBuilder logtxt) {
 | 
				
			||||||
			DateTime dt = DateTime.Now;
 | 
								DateTime dt = DateTime.Now;
 | 
				
			||||||
			DbCommand cmd = CreateCommand();
 | 
								DbCommand cmd = CreateCommand();
 | 
				
			||||||
			cmd.CommandType = cmdType;
 | 
								cmd.CommandType = cmdType;
 | 
				
			||||||
@@ -231,7 +251,8 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
				cmd.Connection = tran.Connection;
 | 
									cmd.Connection = tran.Connection;
 | 
				
			||||||
				cmd.Transaction = tran;
 | 
									cmd.Transaction = tran;
 | 
				
			||||||
				if (IsTracePerformance) logtxt.Append("	PrepareCommandAsync_tran!=null: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms\r\n");
 | 
									if (IsTracePerformance) logtxt.Append("	PrepareCommandAsync_tran!=null: ").Append(DateTime.Now.Subtract(dt).TotalMilliseconds).Append("ms\r\n");
 | 
				
			||||||
			}
 | 
								} else
 | 
				
			||||||
 | 
									cmd.Connection = connection;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			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");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,6 +20,7 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
		protected int _whereTimes = 0;
 | 
							protected int _whereTimes = 0;
 | 
				
			||||||
		protected List<DbParameter> _params = new List<DbParameter>();
 | 
							protected List<DbParameter> _params = new List<DbParameter>();
 | 
				
			||||||
		protected DbTransaction _transaction;
 | 
							protected DbTransaction _transaction;
 | 
				
			||||||
 | 
							protected DbConnection _connection;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		public DeleteProvider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) {
 | 
							public DeleteProvider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) {
 | 
				
			||||||
			_orm = orm;
 | 
								_orm = orm;
 | 
				
			||||||
@@ -42,6 +43,10 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			_transaction = transaction;
 | 
								_transaction = transaction;
 | 
				
			||||||
			return this;
 | 
								return this;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							public IDelete<T1> WithConnection(DbConnection coinnection) {
 | 
				
			||||||
 | 
								_connection = coinnection;
 | 
				
			||||||
 | 
								return this;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		public int ExecuteAffrows() {
 | 
							public int ExecuteAffrows() {
 | 
				
			||||||
			var sql = this.ToSql();
 | 
								var sql = this.ToSql();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,6 +22,7 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
		protected bool _noneParameter;
 | 
							protected bool _noneParameter;
 | 
				
			||||||
		protected DbParameter[] _params;
 | 
							protected DbParameter[] _params;
 | 
				
			||||||
		protected DbTransaction _transaction;
 | 
							protected DbTransaction _transaction;
 | 
				
			||||||
 | 
							protected DbConnection _connection;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		public InsertProvider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression) {
 | 
							public InsertProvider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression) {
 | 
				
			||||||
			_orm = orm;
 | 
								_orm = orm;
 | 
				
			||||||
@@ -42,6 +43,11 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			_transaction = transaction;
 | 
								_transaction = transaction;
 | 
				
			||||||
			return this;
 | 
								return this;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							public IInsert<T1> WithConnection(DbConnection coinnection) {
 | 
				
			||||||
 | 
								_connection = coinnection;
 | 
				
			||||||
 | 
								return this;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		public IInsert<T1> NoneParameter() {
 | 
							public IInsert<T1> NoneParameter() {
 | 
				
			||||||
			_noneParameter = true;
 | 
								_noneParameter = true;
 | 
				
			||||||
			return this;
 | 
								return this;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,6 +28,7 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
		protected CommonUtils _commonUtils;
 | 
							protected CommonUtils _commonUtils;
 | 
				
			||||||
		protected CommonExpression _commonExpression;
 | 
							protected CommonExpression _commonExpression;
 | 
				
			||||||
		protected DbTransaction _transaction;
 | 
							protected DbTransaction _transaction;
 | 
				
			||||||
 | 
							protected DbConnection _connection;
 | 
				
			||||||
		protected Action<object> _trackToList;
 | 
							protected Action<object> _trackToList;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		internal static void CopyData(Select0Provider<TSelect, T1> from, object to, ReadOnlyCollection<ParameterExpression> lambParms) {
 | 
							internal static void CopyData(Select0Provider<TSelect, T1> from, object to, ReadOnlyCollection<ParameterExpression> lambParms) {
 | 
				
			||||||
@@ -61,6 +62,7 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			//toType.GetField("_commonUtils", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._commonUtils);
 | 
								//toType.GetField("_commonUtils", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._commonUtils);
 | 
				
			||||||
			//toType.GetField("_commonExpression", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._commonExpression);
 | 
								//toType.GetField("_commonExpression", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._commonExpression);
 | 
				
			||||||
			toType.GetField("_transaction", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._transaction);
 | 
								toType.GetField("_transaction", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._transaction);
 | 
				
			||||||
 | 
								toType.GetField("_connection", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._connection);
 | 
				
			||||||
			toType.GetField("_trackToList", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._trackToList);
 | 
								toType.GetField("_trackToList", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._trackToList);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -82,6 +84,10 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			_transaction = transaction;
 | 
								_transaction = transaction;
 | 
				
			||||||
			return this as TSelect;
 | 
								return this as TSelect;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							public TSelect WithConnection(DbConnection coinnection) {
 | 
				
			||||||
 | 
								_connection = coinnection;
 | 
				
			||||||
 | 
								return this as TSelect;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		public bool Any() {
 | 
							public bool Any() {
 | 
				
			||||||
			this.Limit(1);
 | 
								this.Limit(1);
 | 
				
			||||||
@@ -201,14 +207,14 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = sql;
 | 
								if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = sql;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			return _orm.Cache.Shell(_cache.key, _cache.seconds, () =>
 | 
								return _orm.Cache.Shell(_cache.key, _cache.seconds, () =>
 | 
				
			||||||
				_orm.Ado.ExecuteDataTable(_transaction, CommandType.Text, sql, _params.ToArray()));
 | 
									_orm.Ado.ExecuteDataTable(_transaction?.Connection ?? _connection, CommandType.Text, sql, _params.ToArray()));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		public Task<DataTable> ToDataTableAsync(string field = null) {
 | 
							public Task<DataTable> ToDataTableAsync(string field = null) {
 | 
				
			||||||
			var sql = this.ToSql(field);
 | 
								var sql = this.ToSql(field);
 | 
				
			||||||
			if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = sql;
 | 
								if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = sql;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			return _orm.Cache.ShellAsync(_cache.key, _cache.seconds, () =>
 | 
								return _orm.Cache.ShellAsync(_cache.key, _cache.seconds, () =>
 | 
				
			||||||
				_orm.Ado.ExecuteDataTableAsync(_transaction, CommandType.Text, sql, _params.ToArray()));
 | 
									_orm.Ado.ExecuteDataTableAsync(_transaction?.Connection ?? _connection, CommandType.Text, sql, _params.ToArray()));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		public List<TTuple> ToList<TTuple>(string field) {
 | 
							public List<TTuple> ToList<TTuple>(string field) {
 | 
				
			||||||
@@ -218,7 +224,7 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			return _orm.Cache.Shell(_cache.key, _cache.seconds, () => {
 | 
								return _orm.Cache.Shell(_cache.key, _cache.seconds, () => {
 | 
				
			||||||
				List<TTuple> ret = new List<TTuple>();
 | 
									List<TTuple> ret = new List<TTuple>();
 | 
				
			||||||
				Type type = typeof(TTuple);
 | 
									Type type = typeof(TTuple);
 | 
				
			||||||
				_orm.Ado.ExecuteReader(_transaction, dr => {
 | 
									_orm.Ado.ExecuteReader(_transaction?.Connection ?? _connection, dr => {
 | 
				
			||||||
					var read = Utils.ExecuteArrayRowReadClassOrTuple(type, null, dr, 0, _commonUtils);
 | 
										var read = Utils.ExecuteArrayRowReadClassOrTuple(type, null, dr, 0, _commonUtils);
 | 
				
			||||||
					ret.Add((TTuple)read.Value);
 | 
										ret.Add((TTuple)read.Value);
 | 
				
			||||||
				}, CommandType.Text, sql, _params.ToArray());
 | 
									}, CommandType.Text, sql, _params.ToArray());
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,6 +26,7 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
		protected List<DbParameter> _paramsSource = new List<DbParameter>();
 | 
							protected List<DbParameter> _paramsSource = new List<DbParameter>();
 | 
				
			||||||
		protected bool _noneParameter;
 | 
							protected bool _noneParameter;
 | 
				
			||||||
		protected DbTransaction _transaction;
 | 
							protected DbTransaction _transaction;
 | 
				
			||||||
 | 
							protected DbConnection _connection;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		public UpdateProvider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) {
 | 
							public UpdateProvider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) {
 | 
				
			||||||
			_orm = orm;
 | 
								_orm = orm;
 | 
				
			||||||
@@ -51,6 +52,11 @@ namespace FreeSql.Internal.CommonProvider {
 | 
				
			|||||||
			_transaction = transaction;
 | 
								_transaction = transaction;
 | 
				
			||||||
			return this;
 | 
								return this;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							public IUpdate<T1> WithConnection(DbConnection coinnection) {
 | 
				
			||||||
 | 
								_connection = coinnection;
 | 
				
			||||||
 | 
								return this;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		public IUpdate<T1> NoneParameter() {
 | 
							public IUpdate<T1> NoneParameter() {
 | 
				
			||||||
			_noneParameter = true;
 | 
								_noneParameter = true;
 | 
				
			||||||
			return this;
 | 
								return this;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,6 +14,7 @@ namespace FreeSql.MySql {
 | 
				
			|||||||
		public MySqlAdo() : base(null, null, DataType.MySql) { }
 | 
							public MySqlAdo() : base(null, null, DataType.MySql) { }
 | 
				
			||||||
		public MySqlAdo(CommonUtils util, ICache cache, ILogger log, string masterConnectionString, string[] slaveConnectionStrings) : base(cache, log, DataType.MySql) {
 | 
							public MySqlAdo(CommonUtils util, ICache cache, ILogger log, string masterConnectionString, string[] slaveConnectionStrings) : base(cache, log, DataType.MySql) {
 | 
				
			||||||
			base._util = util;
 | 
								base._util = util;
 | 
				
			||||||
 | 
								if (!string.IsNullOrEmpty(masterConnectionString)) {
 | 
				
			||||||
				MasterPool = new MySqlConnectionPool("主库", masterConnectionString, null, null);
 | 
									MasterPool = new MySqlConnectionPool("主库", masterConnectionString, null, null);
 | 
				
			||||||
				if (slaveConnectionStrings != null) {
 | 
									if (slaveConnectionStrings != null) {
 | 
				
			||||||
					foreach (var slaveConnectionString in slaveConnectionStrings) {
 | 
										foreach (var slaveConnectionString in slaveConnectionStrings) {
 | 
				
			||||||
@@ -22,6 +23,7 @@ namespace FreeSql.MySql {
 | 
				
			|||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		static DateTime dt1970 = new DateTime(1970, 1, 1);
 | 
							static DateTime dt1970 = new DateTime(1970, 1, 1);
 | 
				
			||||||
		public override object AddslashesProcessParam(object param) {
 | 
							public override object AddslashesProcessParam(object param) {
 | 
				
			||||||
			if (param == null) return "NULL";
 | 
								if (param == null) return "NULL";
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										30
									
								
								FreeSql/MySql/MySqlConnectionExtensions.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								FreeSql/MySql/MySqlConnectionExtensions.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
				
			|||||||
 | 
					using FreeSql.MySql;
 | 
				
			||||||
 | 
					using FreeSql.MySql.Curd;
 | 
				
			||||||
 | 
					using Microsoft.Extensions.Logging;
 | 
				
			||||||
 | 
					using MySql.Data.MySqlClient;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.Data;
 | 
				
			||||||
 | 
					using System.Data.Common;
 | 
				
			||||||
 | 
					using System.Text;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql {
 | 
				
			||||||
 | 
						public static class MySqlConnectionExtensions {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							static IFreeSql<int> _curd = new MySqlProvider<int>(null, new LoggerFactory().CreateLogger("MySqlConnectionExtensions"), null, null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							public static ISelect<T1> Select<T1>(this MySqlConnection that) where T1 : class => _curd.Select<T1>().WithConnection(that);
 | 
				
			||||||
 | 
							public static ISelect<T1> Select<T1>(this MySqlConnection that, object dywhere) where T1 : class => _curd.Select<T1>(dywhere).WithConnection(that);
 | 
				
			||||||
 | 
							public static IInsert<T1> Insert<T1>(this MySqlConnection that) where T1 : class => _curd.Insert<T1>().WithConnection(that);
 | 
				
			||||||
 | 
							public static IInsert<T1> Insert<T1>(this MySqlConnection that, T1 source) where T1 : class => _curd.Insert<T1>().WithConnection(that).AppendData(source);
 | 
				
			||||||
 | 
							public static IInsert<T1> Insert<T1>(this MySqlConnection that, T1[] source) where T1 : class => _curd.Insert<T1>().WithConnection(that).AppendData(source);
 | 
				
			||||||
 | 
							public static IInsert<T1> Insert<T1>(this MySqlConnection that, IEnumerable<T1> source) where T1 : class => _curd.Insert<T1>().WithConnection(that).AppendData(source);
 | 
				
			||||||
 | 
							public static IUpdate<T1> Update<T1>(this MySqlConnection that) where T1 : class => _curd.Update<T1>().WithConnection(that);
 | 
				
			||||||
 | 
							public static IUpdate<T1> Update<T1>(this MySqlConnection that, object dywhere) where T1 : class => _curd.Update<T1>(dywhere).WithConnection(that);
 | 
				
			||||||
 | 
							public static IDelete<T1> Delete<T1>(this MySqlConnection that) where T1 : class => _curd.Delete<T1>().WithConnection(that);
 | 
				
			||||||
 | 
							public static IDelete<T1> Delete<T1>(this MySqlConnection that, object dywhere) where T1 : class => _curd.Delete<T1>(dywhere).WithConnection(that);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							public static List<T> Query<T>(this MySqlConnection that, string cmdText, object parms = null) => _curd.Ado.Query<T>(that, cmdText, parms);
 | 
				
			||||||
 | 
							public static List<T> Query<T>(this MySqlConnection that, CommandType cmdType, string cmdText, params MySqlParameter[] cmdParms) => _curd.Ado.Query<T>(that, cmdText, cmdParms);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user