From ca80fbafc719501a97edb6776713633ed4718e73 Mon Sep 17 00:00:00 2001
From: 2881099 <2881099@qq.com>
Date: Tue, 25 Jun 2024 12:35:58 +0800
Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20Ado=E8=AF=BB=E5=86=99?=
=?UTF-8?q?=E5=88=86=E7=A6=BB=E5=AD=98=E5=82=A8=E8=BF=87=E7=A8=8B=E9=BB=98?=
=?UTF-8?q?=E8=AE=A4=E4=BD=BF=E7=94=A8=E4=BB=8E=E5=BA=93=EF=BC=9B#1833?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
FreeSql/Extensions/FreeSqlGlobalExtensions.cs | 2 +-
FreeSql/FreeSql.xml | 299 ++++++++++++++++++
.../CommonProvider/AdoProvider/AdoProvider.cs | 2 +-
.../AdoProvider/AdoProviderAsync.cs | 2 +-
.../AdoProvider/AdoProviderUtils.cs | 6 +-
5 files changed, 306 insertions(+), 5 deletions(-)
diff --git a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs
index 0a2e1296..ac2b6454 100644
--- a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs
+++ b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs
@@ -833,7 +833,7 @@ JOIN {select._commonUtils.QuoteSqlName(tbDbName)} a ON cte_tbc.cte_id = a.{selec
#endif
var nsselsb = new StringBuilder();
- if (AdoProvider.IsFromSlave(select._select) == false) nsselsb.Append(' '); //读写分离规则,如果强制读主库,则在前面加个空格
+ if (AdoProvider.IsFromSlave(select._select, CommandType.Text) == false) nsselsb.Append(' '); //读写分离规则,如果强制读主库,则在前面加个空格
nsselsb.Append("WITH ");
switch (select._orm.Ado.DataType)
{
diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml
index 4bdcab9f..5f6a3f2a 100644
--- a/FreeSql/FreeSql.xml
+++ b/FreeSql/FreeSql.xml
@@ -1104,6 +1104,93 @@
+
+
+ 动态创建实体类型
+
+
+
+
+ 配置Class
+
+ 类名
+ 类标记的特性[Table(Name = "xxx")] [Index(xxxx)]
+
+
+
+
+ 获取类型构建器,可作为要构建的Type来引用
+
+
+
+
+ 配置属性
+
+ 属性名称
+ 属性类型
+ 属性标记的特性-支持多个
+
+
+
+
+ 配置属性
+
+ 属性名称
+ 属性类型
+ 该属性是否重写父类属性
+ 属性标记的特性-支持多个
+
+
+
+
+ 配置属性
+
+ 属性名称
+ 属性类型
+ 该属性是否重写父类属性
+ 属性默认值
+ 属性标记的特性-支持多个
+
+
+
+
+ 配置父类
+
+ 父类类型
+
+
+
+
+ Override属性
+
+
+
+
+
+ Emit动态创建出Class - Type
+
+
+
+
+
+ Emit动态创建出Class - Type,不附带获取TableInfo
+
+
+
+
+
+ 首字母小写
+
+
+
+
+
+
+ 首字母大写
+
+
+
+
获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 ""
@@ -3283,6 +3370,13 @@
+
+
+ 执行SQL语句,返回更新后的记录
+ 注意:此方法只有 Postgresql/SqlServer 有效果
+
+
+
指定事务对象
@@ -3627,6 +3721,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>
+
+
+
+
+
+
+
+
可自定义解析表达式
@@ -4626,6 +4891,12 @@
超时
+
+
+ 获取资源
+
+
+
使用完毕后,归还资源
@@ -4701,6 +4972,12 @@
资源对象
+
+
+ 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象
+
+ 资源对象
+
归还对象给对象池的时候触发
@@ -5631,6 +5908,28 @@
请使用 fsql.InsertDict(dict) 方法插入字典数据
+
+
+ 动态构建Class Type
+
+
+
+
+
+ 根据字典,创建 table 对应的实体对象
+
+
+
+
+
+
+
+ 根据实体对象,创建 table 对应的字典
+
+
+
+
+
C#: that >= between && that <= and
diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs
index 3d88842e..4446d93c 100644
--- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs
+++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs
@@ -585,7 +585,7 @@ namespace FreeSql.Internal.CommonProvider
if (transaction == null && connection == null)
{
//读写分离规则
- if (this.SlavePools.Any() && IsFromSlave(cmdText))
+ if (this.SlavePools.Any() && IsFromSlave(cmdText, cmdType))
{
var availables = slaveUnavailables == 0 ?
//查从库
diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs
index 418b2bbe..da8a2548 100644
--- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs
+++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs
@@ -505,7 +505,7 @@ namespace FreeSql.Internal.CommonProvider
if (transaction == null && connection == null)
{
//读写分离规则
- if (this.SlavePools.Any() && IsFromSlave(cmdText))
+ if (this.SlavePools.Any() && IsFromSlave(cmdText, cmdType))
{
var availables = slaveUnavailables == 0 ?
//查从库
diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderUtils.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderUtils.cs
index 8f406200..312bfb57 100644
--- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderUtils.cs
+++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderUtils.cs
@@ -2,6 +2,7 @@
using System;
using System.Collections;
using System.Collections.Concurrent;
+using System.Data;
using System.Globalization;
using System.Text;
using System.Text.RegularExpressions;
@@ -56,9 +57,10 @@ namespace FreeSql.Internal.CommonProvider
return sb.Length == 0 ? "(NULL)" : sb.Remove(0, 1).Insert(0, "(").Append(")").ToString();
}
- public static bool IsFromSlave(string cmdText)
+ public static bool IsFromSlave(string cmdText, CommandType cmdType)
{
- return cmdText.StartsWith("SELECT ", StringComparison.CurrentCultureIgnoreCase) ||
+ return cmdType == CommandType.StoredProcedure ||
+ cmdText.StartsWith("SELECT ", StringComparison.CurrentCultureIgnoreCase) ||
cmdText.StartsWith("WITH ", StringComparison.CurrentCultureIgnoreCase);
}
}