From 60f876db921123b3bcaacbc981d5b46e44b79dae Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Tue, 28 Dec 2021 12:56:13 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20UseConnectionFactory?= =?UTF-8?q?=20=E5=8F=82=E6=95=B0=E5=8C=96=E9=97=AE=E9=A2=98=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FreeSql.Tests/FreeSql.Tests.csproj | 1 + FreeSql.Tests/FreeSql.Tests/g.cs | 1 + FreeSql/FreeSql.csproj | 5 +- FreeSql/FreeSql.xml | 183 ++++++++++++++++++ .../CommonProvider/AdoProvider/AdoProvider.cs | 28 ++- .../AdoProvider/AdoProviderAsync.cs | 32 ++- 6 files changed, 245 insertions(+), 5 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.csproj b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.csproj index a5deb8cb..8d8c874a 100644 --- a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.csproj +++ b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.csproj @@ -16,6 +16,7 @@ + diff --git a/FreeSql.Tests/FreeSql.Tests/g.cs b/FreeSql.Tests/FreeSql.Tests/g.cs index 4c673a4f..b7d4ead9 100644 --- a/FreeSql.Tests/FreeSql.Tests/g.cs +++ b/FreeSql.Tests/FreeSql.Tests/g.cs @@ -82,6 +82,7 @@ public class g static Lazy sqliteLazy = new Lazy(() => new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|\document.db;Attachs=xxxtb.db;") + //.UseConnectionFactory(FreeSql.DataType.Sqlite, () => new Microsoft.Data.Sqlite.SqliteConnection(@"Data Source=documentCore.db")) //.UseConnectionFactory(FreeSql.DataType.Sqlite, () => //{ // var conn = new System.Data.SQLite.SQLiteConnection(@"Data Source=|DataDirectory|\document.db;Pooling=true;"); diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index 28d8de44..283feb3c 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -1,7 +1,7 @@  - netstandard2.1;netstandard2.0;net45;net40 + netstandard2.1;netstandard2.0;net451;net45;net40 3.0.100 true FreeSql;ncc;YeXiangQin @@ -34,5 +34,8 @@ net40 + + net45 + diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index ab20a387..4caa4edf 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -3196,6 +3196,177 @@ + + + 测试数据库是否连接正确,本方法执行如下命令: + MySql/SqlServer/PostgreSQL/达梦/人大金仓/神通: SELECT 1 + Oracle: SELECT 1 FROM dual + + 命令超时设置(秒) + + true: 成功, false: 失败 + + + + 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 + + + + + + + + + + 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 查询 + + + + + + + + + 查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 查询 + + + + + + + + + 查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 查询 + + + + + + + + + 查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 在【主库】执行 + + + + + + + + + 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 在【主库】执行 + + + + + + + + + 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 执行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 { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + + 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 }) + + + + + + + + + + + + 执行SQL返回对象集合,Query<User, Address>("select * from user where age > @age; select * from address", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + 可自定义解析表达式 @@ -4090,6 +4261,12 @@ 超时 + + + 获取资源 + + + 使用完毕后,归还资源 @@ -4160,6 +4337,12 @@ 资源对象 + + + 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 + + 资源对象 + 归还对象给对象池的时候触发 diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs index 550ed7fe..d5c7b3e0 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs @@ -852,6 +852,7 @@ namespace FreeSql.Internal.CommonProvider if (cmdParms != null) { + var dbpool = MasterPool as FreeSql.Internal.CommonProvider.DbConnectionPool; foreach (var parm in cmdParms) { if (parm == null) continue; @@ -872,7 +873,32 @@ namespace FreeSql.Internal.CommonProvider }); } } - if (isnew == false) cmd.Parameters.Add(parm); + if (isnew == false) + { + if (dbpool == null) cmd.Parameters.Add(parm); + else + { + var newparm = cmd.CreateParameter(); // UseConnectionFactory 转换 DbParameter + if (newparm.GetType() == parm.GetType()) cmd.Parameters.Add(parm); + else + { + newparm.DbType = parm.DbType; + newparm.Direction = parm.Direction; + newparm.ParameterName = parm.ParameterName; +#if net40 || net45 +#else + newparm.Precision = parm.Precision; + newparm.Scale = parm.Scale; +#endif + newparm.Size = parm.Size; + newparm.SourceColumn = parm.SourceColumn; + newparm.SourceColumnNullMapping = parm.SourceColumnNullMapping; + newparm.SourceVersion = parm.SourceVersion; + newparm.Value = parm.Value; + cmd.Parameters.Add(newparm); + } + } + } } } diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs index 011127c5..52f88e68 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs @@ -79,7 +79,7 @@ namespace FreeSql.Internal.CommonProvider }, cmdType, cmdText, cmdTimeout, cmdParms, cancellationToken); return ret; } - #region QueryAsync multi +#region QueryAsync multi public Task, List>> QueryAsync(string cmdText, object parms = null, CancellationToken cancellationToken = default) => QueryAsync(null, null, CommandType.Text, cmdText, 0, GetDbParamtersByObject(cmdText, parms), cancellationToken); public Task, List>> QueryAsync(DbTransaction transaction, string cmdText, object parms = null, CancellationToken cancellationToken = default) => QueryAsync(null, transaction, CommandType.Text, cmdText, 0, GetDbParamtersByObject(cmdText, parms), cancellationToken); public Task, List>> QueryAsync(DbConnection connection, DbTransaction transaction, string cmdText, object parms = null, CancellationToken cancellationToken = default) => QueryAsync(connection, transaction, CommandType.Text, cmdText, 0, GetDbParamtersByObject(cmdText, parms), cancellationToken); @@ -469,7 +469,7 @@ namespace FreeSql.Internal.CommonProvider }, null, cmdType, cmdText, cmdTimeout, cmdParms, cancellationToken); return NativeTuple.Create(ret1, ret2, ret3, ret4, ret5); } - #endregion +#endregion public Task ExecuteReaderAsync(Func, Task> fetchHandler, string cmdText, object parms = null, CancellationToken cancellationToken = default) => ExecuteReaderAsync(null, null, fetchHandler, CommandType.Text, cmdText, 0, GetDbParamtersByObject(cmdText, parms), cancellationToken); public Task ExecuteReaderAsync(DbTransaction transaction, Func, Task> fetchHandler, string cmdText, object parms = null, CancellationToken cancellationToken = default) => ExecuteReaderAsync(null, transaction, fetchHandler, CommandType.Text, cmdText, 0, GetDbParamtersByObject(cmdText, parms), cancellationToken); @@ -757,6 +757,7 @@ namespace FreeSql.Internal.CommonProvider if (cmdParms != null) { + var dbpool = MasterPool as FreeSql.Internal.CommonProvider.DbConnectionPool; foreach (var parm in cmdParms) { if (parm == null) continue; @@ -777,7 +778,32 @@ namespace FreeSql.Internal.CommonProvider }); } } - if (isnew == false) cmd.Parameters.Add(parm); + if (isnew == false) + { + if (dbpool == null) cmd.Parameters.Add(parm); + else + { + var newparm = cmd.CreateParameter(); // UseConnectionFactory 转换 DbParameter + if (newparm.GetType() == parm.GetType()) cmd.Parameters.Add(parm); + else + { + newparm.DbType = parm.DbType; + newparm.Direction = parm.Direction; + newparm.ParameterName = parm.ParameterName; +#if net40 || net45 +#else + newparm.Precision = parm.Precision; + newparm.Scale = parm.Scale; +#endif + newparm.Size = parm.Size; + newparm.SourceColumn = parm.SourceColumn; + newparm.SourceColumnNullMapping = parm.SourceColumnNullMapping; + newparm.SourceVersion = parm.SourceVersion; + newparm.Value = parm.Value; + cmd.Parameters.Add(newparm); + } + } + } } }