Compare commits

...

12 Commits

Author SHA1 Message Date
Diego
4a3b5163f1 更新依赖 2025-06-09 09:29:41 +08:00
2248356998 qq.com
3a0946d357 优化单例db对象获取 2025-06-08 21:09:07 +08:00
Diego
9dd21c644c 10.7.35 2025-06-08 15:48:13 +08:00
2248356998 qq.com
6713190a23 日志写入器释放 2025-06-08 15:47:25 +08:00
Diego
9f24533425 10.7.34 2025-06-08 15:38:41 +08:00
2248356998 qq.com
ed1d9374eb 2025-06-08 01:22:41 +08:00
Diego
f14d27129e 10.7.33 2025-06-07 22:30:27 +08:00
2248356998 qq.com
5b04f02fbe Merge branch 'v10' of https://gitee.com/ThingsGateway/ThingsGateway into v10 2025-06-07 22:26:32 +08:00
2248356998 qq.com
227080e332 ddp协议清理旧连接逻辑错误 2025-06-07 22:26:18 +08:00
Diego
1e87482a49 10.7.32 2025-06-07 15:25:38 +08:00
2248356998 qq.com
054d31c3ea 添加自定义插件 2025-06-07 15:14:54 +08:00
Diego
3a068a7b03 更新解决方案 2025-06-07 12:22:05 +08:00
82 changed files with 448 additions and 241 deletions

View File

@@ -64,7 +64,7 @@ public sealed class OperDescAttribute : MoAttribute
public override void OnException(MethodContext context)
{
if (App.HttpContext.Request.Path.StartsWithSegments("/_blazor"))
if (App.HttpContext?.Request.Path.StartsWithSegments("/_blazor") == true)
{
//插入异常日志
SysOperateLog log = GetOperLog(LocalizerType, context);
@@ -82,7 +82,7 @@ public sealed class OperDescAttribute : MoAttribute
public override void OnSuccess(MethodContext context)
{
if (App.HttpContext.Request.Path.StartsWithSegments("/_blazor"))
if (App.HttpContext?.Request.Path.StartsWithSegments("/_blazor") == true)
{
//插入操作日志

View File

@@ -14,7 +14,7 @@ using Microsoft.Extensions.Logging;
using System.Collections.Concurrent;
using ThingsGateway.Extension.Generic;
using ThingsGateway.NewLife.Caching;
namespace ThingsGateway.Logging;
@@ -28,7 +28,7 @@ public sealed class DatabaseLoggerProvider : ILoggerProvider, ISupportExternalSc
/// <summary>
/// 存储多日志分类日志记录器
/// </summary>
private readonly ConcurrentDictionary<string, DatabaseLogger> _databaseLoggers = new();
private readonly MemoryCache _databaseLoggers = new();
/// <summary>
/// 日志消息队列(线程安全)

View File

@@ -11,9 +11,7 @@
using Microsoft.Extensions.Logging;
using System.Collections.Concurrent;
using ThingsGateway.Extension.Generic;
using ThingsGateway.NewLife.Caching;
namespace ThingsGateway.Logging;
@@ -27,7 +25,7 @@ public sealed class EmptyLoggerProvider : ILoggerProvider
/// <summary>
/// 存储多日志分类日志记录器
/// </summary>
private readonly ConcurrentDictionary<string, EmptyLogger> _emptyLoggers = new();
private readonly MemoryCache _emptyLoggers = new();
/// <summary>
/// 创建空日志记录器

View File

@@ -13,7 +13,7 @@ using Microsoft.Extensions.Logging;
using System.Collections.Concurrent;
using ThingsGateway.Extension.Generic;
using ThingsGateway.NewLife.Caching;
namespace ThingsGateway.Logging;
@@ -27,7 +27,7 @@ public sealed class FileLoggerProvider : ILoggerProvider, ISupportExternalScope
/// <summary>
/// 存储多日志分类日志记录器
/// </summary>
private readonly ConcurrentDictionary<string, FileLogger> _fileLoggers = new();
private readonly MemoryCache _fileLoggers = new();
/// <summary>
/// 日志消息队列(线程安全)

View File

@@ -40,6 +40,61 @@ public static class ConcurrentDictionaryExtensions
// 返回成功移除的项目数量
return count;
}
/// <summary>
/// 批量出队
/// </summary>
public static List<T> ToListWithDequeue<TKEY, T>(this ConcurrentDictionary<TKEY, T> values, int maxCount = 0)
{
if (maxCount <= 0)
{
maxCount = values.Count;
}
else
{
maxCount = Math.Min(maxCount, values.Count);
}
var list = new List<T>(maxCount);
if (maxCount == 0) return list;
var keys = values.Keys;
foreach (var key in keys)
{
if (maxCount-- <= 0) break;
if (values.TryRemove(key, out var result))
{
list.Add(result);
}
}
return list;
}
/// <summary>
/// 批量出队
/// </summary>
public static Dictionary<TKEY, T> ToDictWithDequeue<TKEY, T>(this ConcurrentDictionary<TKEY, T> values, int maxCount = 0)
{
if (maxCount <= 0)
{
maxCount = values.Count;
}
else
{
maxCount = Math.Min(maxCount, values.Count);
}
var dict = new Dictionary<TKEY, T>(maxCount);
if (maxCount == 0) return dict;
var keys = values.Keys;
foreach (var key in keys)
{
if (maxCount-- <= 0) break;
if (values.TryRemove(key, out var result))
{
dict.Add(key, result);
}
}
return dict;
}
}

View File

@@ -92,6 +92,10 @@ public class TextFileLog : Logger, IDisposable
// 销毁前把队列日志输出
if (Interlocked.CompareExchange(ref _writing, 1, 0) == 0) WriteAndClose(DateTime.MinValue);
#if NET6_0_OR_GREATER
_Logs?.Clear();
#endif
}
#endregion

View File

@@ -261,8 +261,8 @@ namespace SqlSugar
}
if (item.DataType?.Contains(',') == true && !Regex.IsMatch(item.DataType, @"\d\,\d"))
{
var types = item.DataType.Split(',').Select(it => it.ToLower()).ToHashSet();
var mapingTypes = this.Context.Ado.DbBind.MappingTypes.Select(it => it.Key.ToLower()).ToHashSet();
var types = item.DataType.Split(',').ToHashSet(StringComparer.OrdinalIgnoreCase);
var mapingTypes = this.Context.Ado.DbBind.MappingTypes.Select(it => it.Key.ToLower()).ToHashSet(StringComparer.OrdinalIgnoreCase);
var mappingType = types.FirstOrDefault(it => mapingTypes.Contains(it));
if (mappingType != null)
{

View File

@@ -22,7 +22,7 @@ namespace SqlSugar
csharpTypeName = "short";
if (csharpTypeName.Equals("int64", StringComparison.CurrentCultureIgnoreCase))
csharpTypeName = "long";
if (csharpTypeName.ToLower().IsIn("boolean", "bool"))
if (csharpTypeName.IsInCase("boolean", "bool"))
csharpTypeName = "bool";
if (csharpTypeName == "DateTimeOffset")
csharpTypeName = "DateTime";

View File

@@ -329,7 +329,7 @@ namespace SqlSugar
{
method = isNullableType ? getConvertByte : getByte;
}
else if (bindPropertyType == UtilConstants.StringType && dbTypeName?.ToLower() == "timestamp")
else if (bindPropertyType == UtilConstants.StringType && dbTypeName.EqualCase("timestamp"))
{
method = isNullableType ? getOtherNull.MakeGenericMethod(bindPropertyType) : getOther.MakeGenericMethod(bindPropertyType);
}

View File

@@ -212,7 +212,7 @@ namespace SqlSugar
{
if (objectNames.HasValue())
{
this.TableInfoList = this.TableInfoList.Where(it => objectNames.Select(x => x.ToLower()).Contains(it.Name.ToLower())).ToList();
this.TableInfoList = this.TableInfoList.Where(it => objectNames.Contains(it.Name, StringComparer.OrdinalIgnoreCase)).ToList();
}
return this;
}

View File

@@ -397,11 +397,11 @@ namespace SqlSugar
}
public virtual object GetDefaultValue(DbColumnInfo columnInfo, object value)
{
if (columnInfo.DataType.ObjToString().ToLower().IsIn("varchar", "nvarchar", "varchar2", "nvarchar2") && !string.IsNullOrEmpty(columnInfo.DefaultValue) && Regex.IsMatch(columnInfo.DefaultValue, @"^\w+$"))
if (columnInfo.DataType.ObjToString().IsInCase("varchar", "nvarchar", "varchar2", "nvarchar2") && !string.IsNullOrEmpty(columnInfo.DefaultValue) && Regex.IsMatch(columnInfo.DefaultValue, @"^\w+$"))
{
value = columnInfo.DefaultValue;
}
else if (columnInfo.DataType.ObjToString().ToLower().IsIn("float", "double", "decimal", "int", "int4", "bigint", "int8", "int2") && columnInfo.DefaultValue.IsInt())
else if (columnInfo.DataType.ObjToString().IsInCase("float", "double", "decimal", "int", "int4", "bigint", "int8", "int2") && columnInfo.DefaultValue.IsInt())
{
value = Convert.ToInt32(columnInfo.DefaultValue);
}

View File

@@ -294,8 +294,8 @@ namespace SqlSugar
uInt64TypeName.Add(item.ColumnName);
}
}
var temColumnsList = tempDataTable.Columns.Cast<DataColumn>().Select(it => it.ColumnName.ToLower()).ToList();
var columns = dt.Columns.Cast<DataColumn>().Where(it => temColumnsList.Contains(it.ColumnName.ToLower())).ToList();
var temColumnsList = tempDataTable.Columns.Cast<DataColumn>().Select(it => it.ColumnName).ToHashSet(StringComparer.OrdinalIgnoreCase);
var columns = dt.Columns.Cast<DataColumn>().Where(it => temColumnsList.Contains(it.ColumnName, StringComparer.OrdinalIgnoreCase)).ToList();
foreach (DataRow item in dt.Rows)
{
DataRow dr = tempDataTable.NewRow();

View File

@@ -265,7 +265,7 @@ namespace SqlSugar
else
{
var bid = InstanceFactory.GetQueryBuilderWithContext(abDb).Builder.GetTranslationColumnName(bPkColumn.DbColumnName);
if (!sql.SelectString.Contains(bid?.ToLower(), StringComparison.CurrentCultureIgnoreCase) && !sql.SelectString.Contains('*'))
if (!sql.SelectString.Contains(bid, StringComparison.CurrentCultureIgnoreCase) && !sql.SelectString.Contains('*'))
{
sql.SelectString += ("," + bid + " AS " + bid);
}
@@ -949,7 +949,7 @@ namespace SqlSugar
var selectPkName = queryable.SqlBuilder.GetTranslationColumnName(columnName);
if (result.IsSelectNav)
{
if (result.SelectString?.Contains($" {selectPkName.ToLower()} AS {selectPkName.ToLower()}", StringComparison.CurrentCultureIgnoreCase) == false)
if (result.SelectString?.Contains($" {selectPkName} AS {selectPkName}", StringComparison.CurrentCultureIgnoreCase) == false)
{
result.SelectString = result.SelectString + "," + (selectPkName + " AS " + selectPkName);
}

View File

@@ -1598,7 +1598,7 @@ namespace SqlSugar
}
}
var selects = this.QueryBuilder.GetSelectValueByString();
if (selects.ObjToString().ToLower().IsContainsIn(".", "(", " as "))
if (selects.ObjToString().IsContainsInCase(".", "(", " as "))
{
return this.Select<TResult>(selects);
}

View File

@@ -130,7 +130,7 @@ namespace SqlSugar
{
get
{
var isDual = queryBuilder.Builder.FullSqlDateNow?.ToLower()?.Contains(" dual") == true;
var isDual = queryBuilder.Builder.FullSqlDateNow?.Contains(" dual", StringComparison.OrdinalIgnoreCase) == true;
if (isDual)
{
return " from dual ";

View File

@@ -7,7 +7,6 @@ namespace SqlSugar
/// </summary>
public partial class SqlSugarScope : ISqlSugarClient, ITenant
{
private List<ConnectionConfig> _configs;
private Action<SqlSugarClient> _configAction;
@@ -15,25 +14,25 @@ namespace SqlSugar
{
SqlSugarClient result = null;
var key = _configs.GetHashCode().ToString();
StackTrace st = new StackTrace(true);
StackTrace st = new StackTrace(false);
var methods = st.GetFrames();
var isAsync = UtilMethods.IsAnyAsyncMethod(methods);
if (methods?.Length >= 0)
{
foreach (var method in methods.Take(35))
{
var refType = method.GetMethod()?.ReflectedType;
if (refType != null)
{
var getInterfaces = refType.Name.StartsWith('<') ? refType?.ReflectedType?.GetInterfaces() : refType?.GetInterfaces();
if (getInterfaces?.Any(it => it.Name.IsIn("IJob")) == true)
{
key = $"{key}IJob";
break;
}
}
}
}
//if (methods?.Length >= 0)
//{
// foreach (var method in methods.Take(35))
// {
// var refType = method.GetMethod()?.ReflectedType;
// if (refType != null)
// {
// var getInterfaces = refType.Name.StartsWith('<') ? refType?.ReflectedType?.GetInterfaces() : refType?.GetInterfaces();
// if (getInterfaces?.Any(it => it.Name.IsIn("IJob")) == true)
// {
// key = $"{key}IJob";
// break;
// }
// }
// }
//}
if (isAsync)
{
result = GetAsyncContext(key);

View File

@@ -1578,7 +1578,7 @@ namespace SqlSugar
parameter.DbType = itemParameter.DbType;
if (repeatCount > 500 || (isParameterNameRepeat && repeatList.Any(it => it.Key.EqualCase(itemParameter.ParameterName))))
{
if (newName.StartsWith(':') && itemSql.Contains(itemParameter.ParameterName.ToLower().Replace(":", "@"), StringComparison.CurrentCultureIgnoreCase))
if (newName.StartsWith(':') && itemSql.Contains(itemParameter.ParameterName.Replace(":", "@"), StringComparison.CurrentCultureIgnoreCase))
{
itemParameter.ParameterName = itemParameter.ParameterName.Replace(":", "@");
}
@@ -1657,7 +1657,7 @@ namespace SqlSugar
parameter.DbType = itemParameter.DbType;
if (repeatCount > 500 || (isParameterNameRepeat && repeatList.Any(it => it.Key.EqualCase(itemParameter.ParameterName))))
{
if (newName.StartsWith(':') && itemSql.Contains(itemParameter.ParameterName.ToLower().Replace(":", "@"), StringComparison.CurrentCultureIgnoreCase))
if (newName.StartsWith(':') && itemSql.Contains(itemParameter.ParameterName.Replace(":", "@"), StringComparison.CurrentCultureIgnoreCase))
{
itemParameter.ParameterName = itemParameter.ParameterName.Replace(":", "@");
}

View File

@@ -8,7 +8,7 @@ namespace SqlSugar
public class SqlSugarScopeProvider : ISqlSugarClient
{
internal SqlSugarProvider conn;
internal string initThreadMainId;
internal int initThreadMainId;
internal string initkey = null;
StackFrame[] frames;
@@ -21,9 +21,9 @@ namespace SqlSugar
this.GetContext(true);
}
private static string GetCurrentThreadId()
private static int GetCurrentThreadId()
{
return Environment.CurrentManagedThreadId + "";
return Environment.CurrentManagedThreadId;
}
public SqlSugarProvider ScopedContext { get { return GetContext(); } }
@@ -79,7 +79,7 @@ namespace SqlSugar
{
SqlSugarProvider result = null;
var key = GetKey(); ;
StackTrace st = new StackTrace(true);
StackTrace st = new StackTrace(false);
var methods = st.GetFrames();
var isAsync = UtilMethods.IsAnyAsyncMethod(methods);
if (isAsync)
@@ -101,24 +101,24 @@ namespace SqlSugar
var key = "SqlSugarProviderScope_" + conn.CurrentConnectionConfig.ConfigId;
if (frames == null)
{
frames = new StackTrace(true).GetFrames();
}
if (true)
{
foreach (var method in frames.Take(35))
{
var refType = method.GetMethod()?.ReflectedType;
if (refType != null)
{
var getInterfaces = refType.Name.StartsWith('<') ? refType?.ReflectedType?.GetInterfaces() : refType?.GetInterfaces();
if (getInterfaces?.Any(it => it.Name.IsIn("IJob")) == true)
{
key = $"{key}IJob";
break;
}
}
}
frames = new StackTrace(false).GetFrames();
}
//if (true)
//{
// foreach (var method in frames.Take(35))
// {
// var refType = method.GetMethod()?.ReflectedType;
// if (refType != null)
// {
// var getInterfaces = refType.Name.StartsWith('<') ? refType?.ReflectedType?.GetInterfaces() : refType?.GetInterfaces();
// if (getInterfaces?.Any(it => it.Name.IsIn("IJob")) == true)
// {
// key = $"{key}IJob";
// break;
// }
// }
// }
//}
return key;
}

View File

@@ -128,9 +128,9 @@ namespace SqlSugar
{
if (SetColumnsIndex > 0)
{
var keys = UpdateBuilder.SetValues.Select(it => SqlBuilder.GetNoTranslationColumnName(it.Key.ToLower())).ToList();
var keys = UpdateBuilder.SetValues.Select(it => SqlBuilder.GetNoTranslationColumnName(it.Key)).ToList();
var addKeys = keys.Where(k => !this.UpdateBuilder.DbColumnInfoList.Any(it => it.PropertyName.Equals(k, StringComparison.CurrentCultureIgnoreCase) || it.DbColumnName.Equals(k, StringComparison.CurrentCultureIgnoreCase))).ToList();
var addItems = this.EntityInfo.Columns.Where(it => !GetPrimaryKeys().Any(p => p.Equals(it.PropertyName?.ToLower(), StringComparison.CurrentCultureIgnoreCase) || p.Equals(it.DbColumnName?.ToLower(), StringComparison.CurrentCultureIgnoreCase)) && addKeys.Any(k => it.PropertyName?.ToLower() == k || it.DbColumnName?.ToLower() == k)).ToList();
var addItems = this.EntityInfo.Columns.Where(it => !GetPrimaryKeys().Any(p => p.Equals(it.PropertyName, StringComparison.CurrentCultureIgnoreCase) || p.Equals(it.DbColumnName, StringComparison.CurrentCultureIgnoreCase)) && addKeys.Any(k => it.PropertyName?.Equals(k, StringComparison.OrdinalIgnoreCase) == true || it.DbColumnName?.Equals(k, StringComparison.OrdinalIgnoreCase) == true)).ToList();
this.UpdateBuilder.DbColumnInfoList.AddRange(addItems.Select(it => new DbColumnInfo() { PropertyName = it.PropertyName, DbColumnName = it.DbColumnName }));
}
SetColumnsIndex++;
@@ -456,8 +456,7 @@ namespace SqlSugar
if (this.UpdateBuilder.UpdateColumns.HasValue())
{
var columns = this.UpdateBuilder.UpdateColumns;
this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => GetPrimaryKeys().Select(
iit => iit.ToLower()).Contains(it.DbColumnName.ToLower())
this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => GetPrimaryKeys().Contains(it.DbColumnName, StringComparer.OrdinalIgnoreCase)
|| columns.Contains(it.PropertyName, StringComparer.OrdinalIgnoreCase)
|| columns.Contains(it.DbColumnName, StringComparer.OrdinalIgnoreCase)).ToList();
}
@@ -471,7 +470,7 @@ namespace SqlSugar
{
continue;
}
var isContains = this.UpdateBuilder.DbColumnInfoList.Select(it => it.DbColumnName.ToLower()).Contains(pkName.ToLower());
var isContains = this.UpdateBuilder.DbColumnInfoList.Select(it => it.DbColumnName).Contains(pkName, StringComparer.OrdinalIgnoreCase);
Check.Exception(isContains == false, "Use UpdateColumns().WhereColumn() ,UpdateColumns need {0}", pkName);
}
}

View File

@@ -92,12 +92,12 @@ namespace SqlSugar
if (this._Result == null) return null;
if (this._ResolveExpressType.IsIn(ResolveExpressType.SelectMultiple, ResolveExpressType.SelectSingle))
{
return this.Result.ToString().Replace(UtilConstants.ReplaceCommaKey, ",").TrimEnd(',');
return this.Result.Replace(UtilConstants.ReplaceCommaKey, ",").ToString().TrimEnd(',');
}
if (IsUpper)
return this.Result.ToString().Replace(UtilConstants.ReplaceCommaKey, ",").ToUpper();
return this.Result.Replace(UtilConstants.ReplaceCommaKey, ",").ToString().ToUpper();
else
return this.Result.ToString().Replace(UtilConstants.ReplaceCommaKey, ",");
return this.Result.Replace(UtilConstants.ReplaceCommaKey, ",").ToString();
}
public void TrimEnd()
@@ -109,7 +109,7 @@ namespace SqlSugar
public bool Contains(string value)
{
if (this.Result.Equals(value)) return true;
return (Result.ToString().Contains(value?.ToLower(), StringComparison.CurrentCultureIgnoreCase));
return (Result.ToString().Contains(value, StringComparison.CurrentCultureIgnoreCase));
}
internal void Insert(int index, string value)

View File

@@ -297,9 +297,7 @@ namespace SqlSugar
else
{
var p = (base.BaseParameter?.BaseParameter?.CurrentExpression as LambdaExpression)?.Parameters[0].Name;
subSql = subSql.Replace(this.Context.SqlTranslationLeft + p + this.Context.SqlTranslationRight + ".", name + ".");
subSql = subSql.Replace(this.Context.SqlTranslationLeft + p.ToUpper() + this.Context.SqlTranslationRight + ".", name + ".");
subSql = subSql.Replace(this.Context.SqlTranslationLeft + p.ToLower() + this.Context.SqlTranslationRight + ".", name + ".");
subSql = subSql.Replace(this.Context.SqlTranslationLeft + p + this.Context.SqlTranslationRight + ".", name + ".", StringComparison.OrdinalIgnoreCase);
}
}
parameter.Context.Result.Append(subSql);

View File

@@ -718,7 +718,7 @@ namespace SqlSugar
info = readerValues.Select(it => it.Key).FirstOrDefault(it => it.Equals(key, StringComparison.CurrentCultureIgnoreCase));
if (info == null)
{
info = readerValues.Select(it => it.Key).FirstOrDefault(it => it.ToLower().EndsWith("." + key.ToLower()));
info = readerValues.Select(it => it.Key).FirstOrDefault(it => it.EndsWith($".{key}", StringComparison.OrdinalIgnoreCase));
}
}
var oldInfo = info;
@@ -787,7 +787,7 @@ namespace SqlSugar
private void Json(Dictionary<string, object> readerValues, Dictionary<string, object> result, string name, string typeName, string shortName = null, PropertyInfo item = null)
{
var key = (typeName + "." + name).ToLower();
var key = (typeName + "." + name);
if (readerValues.Any(it => it.Key.EqualCase(key)))
{
var jsonString = readerValues.First(it => it.Key.EqualCase(key)).Value;
@@ -795,7 +795,7 @@ namespace SqlSugar
}
else
{
key = (shortName + "." + typeName + "." + name).ToLower();
key = (shortName + "." + typeName + "." + name);
if (readerValues.Any(it => it.Key.EqualCase(key)))
{
var jsonString = readerValues.First(it => it.Key.EqualCase(key)).Value;
@@ -814,7 +814,7 @@ namespace SqlSugar
}
private void Json(Dictionary<string, object> readerValues, Dictionary<string, object> result, string name, string typeName, PropertyInfo item)
{
var key = (typeName + "." + name).ToLower();
var key = (typeName + "." + name);
if (readerValues.Any(it => it.Key.EqualCase(key)))
{
var jsonString = readerValues.First(it => it.Key.EqualCase(key)).Value;
@@ -822,7 +822,7 @@ namespace SqlSugar
}
else
{
key = (item.Name + "." + name).ToLower();
key = (item.Name + "." + name);
if (readerValues.Any(it => it.Key.EqualCase(key)))
{
var jsonString = readerValues.First(it => it.Key.EqualCase(key)).Value;

View File

@@ -46,7 +46,7 @@ namespace SqlSugar
};
return new { it, array };
}).ToList();
var columnInfo = list.FirstOrDefault(y => y.array.Select(z => z.ToLower()).Contains(viewColumns.PropertyName.ToLower()));
var columnInfo = list.FirstOrDefault(y => y.array.Contains(viewColumns.PropertyName, StringComparer.OrdinalIgnoreCase));
if (columnInfo != null)
{
JoinMapper joinMapper = new JoinMapper()

View File

@@ -95,7 +95,7 @@ namespace SqlSugar
var parvalue = Regex.Match(valueString, @"\@s\:(.+)").Groups[1].Value;
if (parvalue == null) parvalue = "";
parvalue = parvalue.Trim();
if (parvalue.ToLower().IsIn(SqlSplicingOperator))
if (parvalue.IsInCase(SqlSplicingOperator))
{
return parvalue;
}

View File

@@ -33,7 +33,7 @@ namespace SqlSugar
}
private void AppendAll(JsonQueryParameter jsonQueryParameter, JToken item)
{
var name = item.Path.ToLower();
var name = item.Path;
if (IsWhere(name))
{
AppendWhere(item);

View File

@@ -37,7 +37,7 @@ namespace SqlSugar
private void AppendAll(JsonQueryParameter jsonQueryParameter, JToken item)
{
var name = item.Path.ToLower();
var name = item.Path;
if (IsName(name))
{
AppendName(item);

View File

@@ -13,7 +13,7 @@ namespace SqlSugar
}
private static bool IsJoinLastAfter(string name)
{
return name == "joinlastafter";
return name.Equals("joinlastafter", StringComparison.CurrentCultureIgnoreCase);
}
private static bool IsPageSize(string name)
@@ -58,11 +58,11 @@ namespace SqlSugar
private static bool IsAnySelect(List<JToken> appendTypeNames)
{
return appendTypeNames.Any(it => IsSelect(it.Path.ToLower()));
return appendTypeNames.Any(it => IsSelect(it.Path));
}
private static bool IsAnyJoin(List<JToken> appendTypeNames)
{
return appendTypeNames.Any(it => IsJoin(it.Path.ToLower()));
return appendTypeNames.Any(it => IsJoin(it.Path));
}
private int GetSort(string name)
{

View File

@@ -63,7 +63,7 @@ namespace SqlSugar
private void AppendQueryableAll(JsonQueryParameter jsonQueryParameter, JToken item)
{
SetQueryableParameterIndex();
var name = item.Path.ToLower();
var name = item.Path;
if (IsForm(name))
{
AppendFrom(item);

View File

@@ -26,7 +26,7 @@ namespace SqlSugar
{
var result = this.jobject.AsJEnumerable().ToList();
result.Add(JToken.Parse("{JoinLastAfter:null}").First());
result = result.OrderBy(it => GetSort(it.Path.ToLower())).ToList();
result = result.OrderBy(it => GetSort(it.Path)).ToList();
return result;
}

View File

@@ -56,7 +56,7 @@ namespace SqlSugar
private void AppendAll(JsonQueryParameter jsonQueryParameter, JToken item)
{
var name = item.Path.ToLower();
var name = item.Path;
if (IsTable(name))
{
AppendTable(item);

View File

@@ -22,11 +22,11 @@ namespace SqlSugar
{
List<string> result = new List<string>();
var mainTable = JObject.Parse(json).AsJEnumerable().Where(it =>
it.Path.ToLower().IsIn(
JsonProviderConfig.KeyInsertable.Get().ToLower(),
JsonProviderConfig.KeyUpdateable.Get().ToLower(),
JsonProviderConfig.KeyDeleteable.Get().ToLower(),
JsonProviderConfig.KeyQueryable.Get().ToLower()
it.Path.IsInCase(
JsonProviderConfig.KeyInsertable.Get(),
JsonProviderConfig.KeyUpdateable.Get(),
JsonProviderConfig.KeyDeleteable.Get(),
JsonProviderConfig.KeyQueryable.Get()
)).FirstOrDefault();
if (mainTable != null)
result.Add(mainTable.First().ToString());

View File

@@ -18,7 +18,7 @@
csharpTypeName = "short";
if (csharpTypeName.Equals("uint64", StringComparison.CurrentCultureIgnoreCase))
csharpTypeName = "long";
if (csharpTypeName.ToLower().IsIn("boolean", "bool"))
if (csharpTypeName.IsInCase("boolean", "bool"))
csharpTypeName = "bool";
if (csharpTypeName == "Guid")
csharpTypeName = "string";

View File

@@ -341,7 +341,7 @@ WHERE table_name = '" + tableName + "'");
{
defaultValue = "";
}
if (defaultValue.ToLower().IsIn("sysdate"))
if (defaultValue.IsInCase("sysdate"))
{
var template = AddDefaultValueSql.Replace("'", "");
string sql = string.Format(template, tableName, columnName, defaultValue);
@@ -613,7 +613,7 @@ WHERE table_name = '" + tableName + "'");
}
public override bool IsAnyTable(string tableName, bool isCache = true)
{
var isSchema = this.Context.CurrentConnectionConfig?.ConnectionString?.Replace(" ", "")?.ToLower()?.Contains("schema=") == true;
var isSchema = this.Context.CurrentConnectionConfig?.ConnectionString?.Replace(" ", "")?.Contains("schema=", StringComparison.OrdinalIgnoreCase) == true;
if (isSchema)
{
var schema = ExtractSchema(this.Context.CurrentConnectionConfig?.ConnectionString);
@@ -654,12 +654,12 @@ WHERE upper(t.TABLE_NAME) = upper('{tableName}')
{
x.DataType = x.OracleDataType;
}
if (array.Contains(x.DataType?.ToLower()))
if (array.Contains(x.DataType, StringComparer.OrdinalIgnoreCase))
{
x.Length = 0;
x.DecimalDigits = 0;
}
if (x.DecimalDigits > 0 && x.DataType?.ToLower()?.IsIn("varchar", "clob", "varchar2", "nvarchar2", "nvarchar") == true)
if (x.DecimalDigits > 0 && x.DataType?.IsInCase("varchar", "clob", "varchar2", "nvarchar2", "nvarchar") == true)
{
x.DecimalDigits = 0;
}

View File

@@ -198,12 +198,12 @@ namespace SqlSugar
private static string ReplaceKeyWordParameterName(string sql, SugarParameter[] parameters)
{
sql = ReplaceKeyWordWithAd(sql, parameters);
if (parameters.HasValue() && parameters.Any(it => it.ParameterName.ToLower().IsIn(KeyWord)))
if (parameters.HasValue() && parameters.Any(it => it.ParameterName.IsInCase(KeyWord)))
{
int i = 0;
foreach (var Parameter in parameters.OrderByDescending(it => it.ParameterName.Length))
{
if (Parameter.ParameterName?.ToLower().IsContainsIn(KeyWord) == true)
if (Parameter.ParameterName?.IsContainsInCase(KeyWord) == true)
{
var newName = ":p" + i + 100;
sql = Regex.Replace(sql, Parameter.ParameterName, newName, RegexOptions.IgnoreCase);

View File

@@ -82,7 +82,7 @@ namespace SqlSugar
foreach (DataColumn column in result.Columns)
{
if (dt.Columns.Cast<DataColumn>().Select(it => it.ColumnName.ToLower()).Contains(column.ColumnName.ToLower()))
if (dt.Columns.Cast<DataColumn>().Select(it => it.ColumnName).Contains(column.ColumnName, StringComparer.OrdinalIgnoreCase))
{
dr[column.ColumnName] = item[column.ColumnName];
if (dr[column.ColumnName] == null)

View File

@@ -648,7 +648,7 @@ WHERE tgrelid = '" + tableName + "'::regclass");
{
foreach (var item in result)
{
if (pkList.Select(it => it.ToUpper()).Contains(item.DbColumnName.ToUpper()))
if (pkList.Contains(item.DbColumnName, StringComparer.OrdinalIgnoreCase))
{
item.IsPrimarykey = true;
}
@@ -679,7 +679,7 @@ WHERE tgrelid = '" + tableName + "'::regclass");
{
string[] array = new string[] { "int4", "text", "int2", "int8", "date", "bit", "text", "timestamp" };
if (array.Contains(x.DataType?.ToLower()))
if (array.Contains(x.DataType, StringComparer.OrdinalIgnoreCase))
{
x.Length = 0;
x.DecimalDigits = 0;

View File

@@ -402,7 +402,7 @@ WHERE EVENT_OBJECT_TABLE = '" + tableName + "'");
public override bool CreateDatabase(string databaseName, string databaseDirectory = null)
{
if (this.Context.Ado.IsValidConnection() && this.Context.Ado.Connection.Database?.ToLower() == databaseName?.ToLower())
if (this.Context.Ado.IsValidConnection() && this.Context.Ado.Connection.Database.EqualCase(databaseName))
{
return true;
}
@@ -679,7 +679,7 @@ WHERE EVENT_OBJECT_TABLE = '" + tableName + "'");
{
defaultValue = "";
}
if (defaultValue.ToLower().IsIn("null", "now()", "current_timestamp") || defaultValue.Contains("current_timestamp", StringComparison.CurrentCultureIgnoreCase) || defaultValue.Contains("()"))
if (defaultValue.IsInCase("null", "now()", "current_timestamp") || defaultValue.Contains("current_timestamp", StringComparison.CurrentCultureIgnoreCase) || defaultValue.Contains("()"))
{
defaultValue = "(" + defaultValue + ")";
string sql = string.Format(AddDefaultValueSql.Replace("'", ""), tableName, columnName, defaultValue);
@@ -799,7 +799,7 @@ WHERE EVENT_OBJECT_TABLE = '" + tableName + "'");
x.DataType = $"{x.DataType}(255)"; // 设置默认长度为 255你可以根据需要修改
}
}
else if (array.Contains(x.DataType?.ToLower()))
else if (array.Contains(x.DataType, StringComparer.OrdinalIgnoreCase))
{
x.Length = 0;
x.DecimalDigits = 0;

View File

@@ -12,7 +12,7 @@ namespace SqlSugar
csharpTypeName = "short";
if (csharpTypeName.Equals("int64", StringComparison.CurrentCultureIgnoreCase))
csharpTypeName = "long";
if (csharpTypeName.ToLower().IsIn("boolean", "bool"))
if (csharpTypeName.IsInCase("boolean", "bool"))
csharpTypeName = "bool";
if (csharpTypeName == "Guid")
csharpTypeName = "string";

View File

@@ -372,7 +372,7 @@ WHERE table_name = '" + tableName + "'");
{
defaultValue = "";
}
if (defaultValue.ToLower().IsIn("sysdate"))
if (defaultValue.IsInCase("sysdate"))
{
var template = AddDefaultValueSql.Replace("'", "");
string sql = string.Format(template, tableName, columnName, defaultValue);
@@ -687,12 +687,12 @@ WHERE table_name = '" + tableName + "'");
{
x.DataType = x.OracleDataType;
}
if (array.Contains(x.DataType?.ToLower()))
if (array.Contains(x.DataType, StringComparer.OrdinalIgnoreCase))
{
x.Length = 0;
x.DecimalDigits = 0;
}
if (x.DecimalDigits > 0 && x.DataType?.ToLower()?.IsIn("varchar", "clob", "varchar2", "nvarchar2", "nvarchar") == true)
if (x.DecimalDigits > 0 && x.DataType?.IsInCase("varchar", "clob", "varchar2", "nvarchar2", "nvarchar") == true)
{
x.DecimalDigits = 0;
}

View File

@@ -120,7 +120,7 @@ namespace SqlSugar
public override DbCommand GetCommand(string sql, SugarParameter[] parameters)
{
sql = ReplaceKeyWordParameterName(sql, parameters);
if (sql?.EndsWith(';') == true && sql?.TrimStart()?.ToLower().StartsWith("begin", StringComparison.CurrentCultureIgnoreCase) != true && sql?.TrimStart()?.ToLower().Contains("begin", StringComparison.CurrentCultureIgnoreCase) != true)
if (sql?.EndsWith(';') == true && sql?.TrimStart()?.StartsWith("begin", StringComparison.CurrentCultureIgnoreCase) != true && sql?.TrimStart()?.Contains("begin", StringComparison.CurrentCultureIgnoreCase) != true)
{
sql = sql.TrimEnd(';');
}
@@ -149,7 +149,7 @@ namespace SqlSugar
{
foreach (var Parameter in parameters.OrderByDescending(x => x.ParameterName?.Length))
{
if (Parameter.ParameterName?.ToLower().IsContainsStartWithIn(KeyWord) == true)
if (Parameter.ParameterName?.IsContainsStartWithInCase(KeyWord) == true)
{
if (parameters.Count(it => it.ParameterName.StartsWith(Parameter.ParameterName)) == 1)
{
@@ -158,7 +158,7 @@ namespace SqlSugar
sql = Regex.Replace(sql, Parameter.ParameterName, newName, RegexOptions.IgnoreCase);
Parameter.ParameterName = newName;
}
else if (Parameter.ParameterName.ToLower().IsContainsIn(KeyWord))
else if (Parameter.ParameterName.IsContainsInCase(KeyWord))
{
Check.ExceptionEasy($" {Parameter.ParameterName} is key word", $"{Parameter.ParameterName}<7D>ǹؼ<C7B9><D8BC><EFBFBD>");
}

View File

@@ -162,7 +162,7 @@ namespace SqlSugar
if (dt.Columns.Cast<DataColumn>().Select(it => it.ColumnName.ToLower()).Contains(column.ColumnName.ToLower()))
if (dt.Columns.Cast<DataColumn>().Select(it => it.ColumnName).Contains(column.ColumnName, StringComparer.OrdinalIgnoreCase))
{

View File

@@ -42,14 +42,25 @@ namespace SqlSugar
private string GetOracleUpdateColumns(DbColumnInfo m, bool isWhere = false)
{
var sb = new StringBuilder();
sb.Append('"');
sb.Append(IsUppper ? m.DbColumnName.ToUpper() : m.DbColumnName);
sb.Append('"');
sb.Append('=');
sb.Append(base.GetDbColumn(m, FormatValue(m.Value, m.IsPrimarykey, m.PropertyName)));
sb.Append(' ');
var result = string.Format("\"{0}\"={1} ", m.DbColumnName.ToUpper(IsUppper), base.GetDbColumn(m, FormatValue(m.Value, m.IsPrimarykey, m.PropertyName)));
if (isWhere && m.Value == null)
{
result = result.Replace("=NULL ", " is NULL ");
sb.Replace("=NULL ", " is NULL ");
}
return result;
return sb.ToString();
}
int i = 0;
public object FormatValue(object value, bool isPrimaryKey, string name)
{

View File

@@ -13,7 +13,7 @@
csharpTypeName = "short";
if (csharpTypeName.Equals("int64", StringComparison.CurrentCultureIgnoreCase))
csharpTypeName = "long";
if (csharpTypeName.ToLower().IsIn("boolean", "bool"))
if (csharpTypeName.IsInCase("boolean", "bool"))
csharpTypeName = "bool";
if (csharpTypeName == "DateTimeOffset")
csharpTypeName = "DateTime";

View File

@@ -315,12 +315,12 @@ WHERE tgrelid = '" + tableName + "'::regclass");
string sql = string.Format(AddDefaultValueSql, this.SqlBuilder.GetTranslationColumnName(tableName), this.SqlBuilder.GetTranslationColumnName(columnName), "'" + defaultValue + "'");
return this.Context.Ado.ExecuteCommand(sql) > 0;
}
else if (defaultValue?.ToLower()?.Contains("cast(") == true && defaultValue?.StartsWith('\'') == true && defaultValue?.EndsWith('\'') == true)
else if (defaultValue?.Contains("cast(", StringComparison.OrdinalIgnoreCase) == true && defaultValue?.StartsWith('\'') == true && defaultValue?.EndsWith('\'') == true)
{
string sql = string.Format(AddDefaultValueSql, this.SqlBuilder.GetTranslationColumnName(tableName), this.SqlBuilder.GetTranslationColumnName(columnName), defaultValue.Replace("''", "'").TrimEnd('\'').TrimStart('\''));
return this.Context.Ado.ExecuteCommand(sql) > 0;
}
else if (defaultValue?.ToLower()?.Contains("now()") == true)
else if (defaultValue?.Contains("now()", StringComparison.OrdinalIgnoreCase) == true)
{
string sql = string.Format(AddDefaultValueSql, this.SqlBuilder.GetTranslationColumnName(tableName), this.SqlBuilder.GetTranslationColumnName(columnName), defaultValue.TrimEnd('\'').TrimStart('\''));
return this.Context.Ado.ExecuteCommand(sql) > 0;
@@ -451,7 +451,7 @@ WHERE tgrelid = '" + tableName + "'::regclass");
ConvertCreateColumnInfo(item);
if (item.DbColumnName.Equals("GUID", StringComparison.CurrentCultureIgnoreCase) && item.Length == 0)
{
if (item.DataType?.ToLower() != "uuid")
if (item.DataType.EqualCase("uuid"))
{
item.Length = 10;
}
@@ -485,7 +485,7 @@ WHERE tgrelid = '" + tableName + "'::regclass");
foreach (var item in columns)
{
string columnName = item.DbColumnName;
string dataType = item.DataType;
string dataType = item.DataType?.ToLower();
if (dataType == "varchar" && item.Length == 0)
{
item.Length = 1;
@@ -505,11 +505,11 @@ WHERE tgrelid = '" + tableName + "'::regclass");
string addItem = string.Format(this.CreateTableColumn, this.SqlBuilder.GetTranslationColumnName(columnName.ToLower(isAutoToLowerCodeFirst)), dataType, dataSize, nullType, primaryKey, "");
if (item.IsIdentity)
{
if (dataType?.ToLower() == "int")
if (dataType == "int")
{
dataSize = "int4";
}
else if (dataType?.ToLower() == "long")
else if (dataType == "long")
{
dataSize = "int8";
}
@@ -564,7 +564,7 @@ WHERE tgrelid = '" + tableName + "'::regclass");
{
foreach (var item in result)
{
if (pkList.Select(it => it.ToUpper()).Contains(item.DbColumnName.ToUpper()))
if (pkList.Contains(item.DbColumnName, StringComparer.OrdinalIgnoreCase))
{
item.IsPrimarykey = true;
}
@@ -645,7 +645,7 @@ WHERE tgrelid = '" + tableName + "'::regclass");
{
string[] array = new string[] { "uuid", "int4", "text", "int2", "int8", "date", "bit", "text", "timestamp" };
if (array.Contains(x.DataType?.ToLower()))
if (array.Contains(x.DataType, StringComparer.OrdinalIgnoreCase))
{
x.Length = 0;
x.DecimalDigits = 0;

View File

@@ -499,7 +499,7 @@
}
public override string GetStringJoinSelector(string result, string separator)
{
if (result?.ToLower()?.Contains("distinct") == true)
if (result?.Contains("distinct", StringComparison.OrdinalIgnoreCase) == true)
{
return $"string_agg({result},'{separator}') ";
}

View File

@@ -364,7 +364,7 @@ namespace SqlSugar
var checks = this.Context.Ado.SqlQuery<string>(sql);
foreach (var checkName in checks)
{
if (checkName?.ToUpper()?.StartsWith("DF__") == true)
if (checkName?.StartsWith("DF__", StringComparison.OrdinalIgnoreCase) == true)
{
this.Context.Ado.ExecuteCommand($"ALTER TABLE {SqlBuilder.GetTranslationColumnName(tableName)} DROP CONSTRAINT {checkName}");
}
@@ -759,7 +759,7 @@ AND syscomments.text LIKE '%" + tableName + "%'");
x.DataType = $"{x.DataType}(max)";
}
}
else if (array.Contains(x.DataType?.ToLower()))
else if (array.Contains(x.DataType, StringComparer.OrdinalIgnoreCase))
{
x.Length = 0;
x.DecimalDigits = 0;

View File

@@ -82,7 +82,7 @@ namespace SqlSugar
foreach (DataColumn column in result.Columns)
{
if (dt.Columns.Cast<DataColumn>().Select(it => it.ColumnName.ToLower()).Contains(column.ColumnName.ToLower()))
if (dt.Columns.Cast<DataColumn>().Select(it => it.ColumnName).Contains(column.ColumnName, StringComparer.OrdinalIgnoreCase))
{
dr[column.ColumnName] = item[column.ColumnName];
if (dr[column.ColumnName] == null)

View File

@@ -38,12 +38,21 @@ namespace SqlSugar
private string GetOracleUpdateColumns(int i, DbColumnInfo m, bool iswhere)
{
var result = string.Format("\"{0}\"={1}", m.DbColumnName.ToUpper(), base.GetDbColumn(m, FormatValue(i, m.DbColumnName, m.Value, iswhere)));
var sb = new StringBuilder();
sb.Append('"');
sb.Append(m.DbColumnName.ToUpper());
sb.Append('"');
sb.Append('=');
sb.Append(base.GetDbColumn(m, FormatValue(i, m.DbColumnName, m.Value, iswhere)));
if (iswhere && m.Value == null)
{
result = result.Replace("=NULL", " is NULL ");
sb.Replace("=NULL", " is NULL ");
}
return result;
return sb.ToString();
}
public object FormatValue(int i, string name, object value, bool iswhere)

View File

@@ -17,7 +17,10 @@ namespace SqlSugar
{
return values.Contains(thisValue);
}
public static bool IsInCase(this string thisValue, params string[] values)
{
return values.Contains(thisValue, StringComparer.OrdinalIgnoreCase);
}
public static bool IsContainsIn(this string thisValue, params char[] inValues)
{
return inValues.Any(it => thisValue.Contains(it));
@@ -26,9 +29,13 @@ namespace SqlSugar
{
return inValues.Any(it => thisValue.Contains(it));
}
public static bool IsContainsStartWithIn(this string thisValue, params string[] inValues)
public static bool IsContainsInCase(this string thisValue, params string[] inValues)
{
return inValues.Any(it => thisValue.StartsWith(it));
return inValues.Any(it => thisValue.Contains(it, StringComparison.OrdinalIgnoreCase));
}
public static bool IsContainsStartWithInCase(this string thisValue, params string[] inValues)
{
return inValues.Any(it => thisValue.StartsWith(it, StringComparison.OrdinalIgnoreCase));
}
public static bool IsNullOrEmpty(this object thisValue)

View File

@@ -1,22 +0,0 @@
<?xml version="1.0"?>
<package >
<metadata>
<id>SqlSugarCore.Dm</id>
<version>1.0</version>
<authors>sunkaixuan</authors>
<owners>Landa</owners>
<licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>
<projectUrl>https://github.com/sunkaixuan/SqlSugar</projectUrl>
<iconUrl>https://secure.gravatar.com/avatar/a82c03402497b2e58fd65038a3699b30</iconUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>dm sqlsugar .net core</description>
<copyright>Copyright 2016</copyright>
<tags>Asp.net core orm</tags>
<dependencies>
</dependencies>
</metadata>
<files>
<file src="E:\Code\SqlSugar\Src\Asp.NetCore2\SqlSeverTest\SqlSugar\dll\DmProvider.dll" target="lib\netstandard2.0"></file>
</files>
</package>

View File

@@ -1,22 +0,0 @@
<?xml version="1.0"?>
<package >
<metadata>
<id>SqlSugarCore.Kdbndp</id>
<version>1.0</version>
<authors>sunkaixuan</authors>
<owners>Landa</owners>
<licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>
<projectUrl>https://github.com/sunkaixuan/SqlSugar</projectUrl>
<iconUrl>https://secure.gravatar.com/avatar/a82c03402497b2e58fd65038a3699b30</iconUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>dm sqlsugar .net core</description>
<copyright>Copyright 2016</copyright>
<tags>Asp.net core orm</tags>
<dependencies>
</dependencies>
</metadata>
<files>
<file src="E:\Code\SqlSugar\Src\Asp.NetCore2\SqlSeverTest\SqlSugar\dll\Kdbndp.dll" target="lib\netstandard2.0"></file>
</files>
</package>

View File

@@ -1 +0,0 @@
%~dp0nuget.exe pack %~dp0Dm.nuspec -OutputDirectory %~dp0

View File

@@ -1 +0,0 @@
%~dp0nuget.exe pack %~dp0Kdbndp.nuspec -OutputDirectory %~dp0

View File

@@ -41,9 +41,9 @@ namespace SqlSugar.TDengine
}
if (item.DataType?.Contains(',') == true && !Regex.IsMatch(item.DataType, @"\d\,\d"))
{
var types = item.DataType.Split(',').Select(it => it.ToLower()).ToHashSet();
var mapingTypes = this.Context.Ado.DbBind.MappingTypes.Select(it => it.Key.ToLower()).ToHashSet();
var mappingType = types.FirstOrDefault(it => mapingTypes.Contains(it));
var types = item.DataType.Split(',').ToHashSet(StringComparer.OrdinalIgnoreCase);
var mapingTypes = this.Context.Ado.DbBind.MappingTypes.Select(it => it.Key).ToHashSet(StringComparer.OrdinalIgnoreCase);
var mappingType = types.FirstOrDefault(it => mapingTypes.Contains(it)).ToLower();
if (mappingType != null)
{
item.DataType = mappingType;
@@ -100,10 +100,10 @@ namespace SqlSugar.TDengine
if (attr?.Tag1 != null)
{
entityColumns = entityInfo.Columns.Where(it => it.IsIgnore == false
|| it.DbColumnName?.ToLower() == attr.Tag1?.ToLower()
|| it.DbColumnName?.ToLower() == attr.Tag2?.ToLower()
|| it.DbColumnName?.ToLower() == attr.Tag3?.ToLower()
|| it.DbColumnName?.ToLower() == attr.Tag4?.ToLower()
|| it.DbColumnName?.EqualCase(attr.Tag1) == true
|| it.DbColumnName?.EqualCase(attr.Tag2) == true
|| it.DbColumnName?.EqualCase(attr.Tag3) == true
|| it.DbColumnName?.EqualCase(attr.Tag4) == true
).ToList();
foreach (var item in entityColumns)
{
@@ -228,10 +228,10 @@ namespace SqlSugar.TDengine
if (attr?.Tag1 != null)
{
dbColumns = dbColumns.Where(it =>
it.DbColumnName?.ToLower() != attr.Tag1?.ToLower()
&& it.DbColumnName?.ToLower() != attr.Tag2?.ToLower()
&& it.DbColumnName?.ToLower() != attr.Tag3?.ToLower()
&& it.DbColumnName?.ToLower() != attr.Tag4?.ToLower()
it.DbColumnName?.EqualCase(attr.Tag1) == true
&& it.DbColumnName?.EqualCase(attr.Tag2) == true
&& it.DbColumnName?.EqualCase(attr.Tag3) == true
&& it.DbColumnName?.EqualCase(attr.Tag4) == true
).ToList();
}
var dbMain = (TDengineDbMaintenance)this.Context.DbMaintenance;

View File

@@ -12,7 +12,7 @@
csharpTypeName = "short";
if (string.Equals(csharpTypeName, "int64", StringComparison.OrdinalIgnoreCase))
csharpTypeName = "long";
if (csharpTypeName.ToLower().IsIn("boolean", "bool"))
if (csharpTypeName.IsInCase("boolean", "bool"))
csharpTypeName = "bool";
if (csharpTypeName == "DateTimeOffset")
csharpTypeName = "DateTime";

View File

@@ -385,11 +385,11 @@ namespace SqlSugar.TDengine
//{
// dataType = $"DOUBLE(18,4)";
//}
if (item.Length == 0 && dataType?.ToLower()?.IsIn("nchar", "varchar") == true)
if (item.Length == 0 && dataType?.IsInCase("nchar", "varchar") == true)
{
dataType = "VARCHAR(200)";
}
if (dataType?.ToLower()?.IsIn("float", "double") == true)
if (dataType?.IsInCase("float", "double") == true)
{
dataSize = null;
}

View File

@@ -116,7 +116,7 @@
{
if (tableName != null)
tableName = tableName.Trim();
var columnInfo = this.Context.DbMaintenance.GetColumnInfosByTableName(tableName).FirstOrDefault(z => z.DbColumnName?.ToLower() == columnName?.ToLower());
var columnInfo = this.Context.DbMaintenance.GetColumnInfosByTableName(tableName).FirstOrDefault(z => z.DbColumnName?.EqualCase(columnName) == true);
if (columnInfo != null)
{
var cTypeName = this.Context.Ado.DbBind.GetCsharpTypeNameByDbTypeName(columnInfo.DataType);

View File

@@ -1,8 +1,8 @@
<Project>
<PropertyGroup>
<PluginVersion>10.7.31</PluginVersion>
<ProPluginVersion>10.7.31</ProPluginVersion>
<PluginVersion>10.7.36</PluginVersion>
<ProPluginVersion>10.7.36</ProPluginVersion>
<AuthenticationVersion>2.5.0</AuthenticationVersion>
</PropertyGroup>

View File

@@ -7,7 +7,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="CS-Script" Version="4.9.6" />
<PackageReference Include="CS-Script" Version="4.9.7" />
</ItemGroup>
<ItemGroup>

View File

@@ -101,13 +101,13 @@ public class DDPTcpSessionClientChannel : TcpSessionClientChannel
if (id != Id) log = true;
//注册ID
if (Service is ITcpService tcpService && tcpService.TryGetClient(id, out var oldClient) && oldClient != this)
if (Service is ITcpServiceChannel tcpService && tcpService.TryGetClient(id, out var oldClient) && oldClient != this)
{
Logger?.Debug($"Old socket connections with the same ID {id} will be closed");
try
{
await oldClient.ShutdownAsync(System.Net.Sockets.SocketShutdown.Both).ConfigureAwait(false);
await oldClient.CloseAsync().ConfigureAwait(false);
oldClient.Dispose();
}
catch
{

View File

@@ -556,12 +556,11 @@ public abstract class DeviceBase : DisposableObject, IDevice
var result = waitData.Check();
if (result.IsSuccess)
{
var response = waitData.WaitResult;
return response;
return waitData.WaitResult;
}
else
{
throw result.Exception ?? new(result.ErrorMessage);
throw new(result.ErrorMessage ?? "unknown error");
}
}

View File

@@ -10,8 +10,8 @@
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Localization.Abstractions" Version="9.0.5" />
<PackageReference Include="TouchSocket" Version="3.1.6" />
<PackageReference Include="TouchSocket.SerialPorts" Version="3.1.6" />
<PackageReference Include="TouchSocket" Version="3.1.7" />
<PackageReference Include="TouchSocket.SerialPorts" Version="3.1.7" />
</ItemGroup>
<ItemGroup>

View File

@@ -244,6 +244,31 @@ public abstract class BusinessBaseWithCacheIntervalAlarmModel<VarModel, DevModel
AlarmChange(alarmVariable);
}
}
public override void PauseThread(bool pause)
{
lock (this)
{
var oldV = CurrentDevice.Pause;
base.PauseThread(pause);
if (!pause && oldV != pause)
{
GlobalData.ReadOnlyRealAlarmIdVariables?.ForEach(a =>
{
AlarmChange(a.Value);
});
CollectDevices?.ForEach(a =>
{
if (a.Value.DeviceStatus == DeviceStatusEnum.OnLine && _businessPropertyWithCacheInterval.BusinessUpdateEnum != BusinessUpdateEnum.Interval)
DeviceStatusChange(a.Value, a.Value.Adapt<DeviceBasicData>());
});
IdVariableRuntimes.ForEach(a =>
{
if (a.Value.IsOnline && _businessPropertyWithCacheInterval.BusinessUpdateEnum != BusinessUpdateEnum.Interval)
VariableValueChange(a.Value, a.Value.Adapt<VariableBasicData>());
});
}
}
}
/// <summary>
/// 当设备状态发生变化时触发此事件处理方法。该方法内部会检查是否需要进行设备上传,如果需要,则调用 <see cref="DeviceChange(DeviceRuntime, DeviceBasicData)"/> 方法。

View File

@@ -257,4 +257,27 @@ public abstract class BusinessBaseWithCacheIntervalDeviceModel<VarModel, DevMode
VariableChange(variableRuntime, variable);
}
}
public override void PauseThread(bool pause)
{
lock (this)
{
var oldV = CurrentDevice.Pause;
base.PauseThread(pause);
if (!pause && oldV != pause)
{
CollectDevices?.ForEach(a =>
{
if (a.Value.DeviceStatus == DeviceStatusEnum.OnLine && _businessPropertyWithCacheInterval.BusinessUpdateEnum != BusinessUpdateEnum.Interval)
DeviceStatusChange(a.Value, a.Value.Adapt<DeviceBasicData>());
});
IdVariableRuntimes.ForEach(a =>
{
if (a.Value.IsOnline && _businessPropertyWithCacheInterval.BusinessUpdateEnum != BusinessUpdateEnum.Interval)
VariableValueChange(a.Value, a.Value.Adapt<VariableBasicData>());
});
}
}
}
}

View File

@@ -175,4 +175,21 @@ public abstract class BusinessBaseWithCacheIntervalVariableModel<VarModel> : Bus
VariableChange(variableRuntime, variable);
}
}
public override void PauseThread(bool pause)
{
lock (this)
{
var oldV = CurrentDevice.Pause;
base.PauseThread(pause);
if (!pause && oldV != pause)
{
IdVariableRuntimes.ForEach(a =>
{
if (a.Value.IsOnline && _businessPropertyWithCacheInterval.BusinessUpdateEnum != BusinessUpdateEnum.Interval)
VariableValueChange(a.Value, a.Value.Adapt<VariableBasicData>());
});
}
}
}
}

View File

@@ -117,7 +117,7 @@ public abstract class DriverBase : DisposableObject, IDriver
/// 暂停
/// </summary>
/// <param name="pause">暂停</param>
public void PauseThread(bool pause)
public virtual void PauseThread(bool pause)
{
lock (this)
{

View File

@@ -886,6 +886,7 @@ internal sealed class DeviceThreadManage : IAsyncDisposable, IDeviceThreadManage
Disposed = true;
try
{
GlobalData.DeviceStatusChangeEvent -= GlobalData_DeviceStatusChangeEvent;
await NewDeviceLock.WaitAsync().ConfigureAwait(false);
_logger?.TryDispose();
await PrivateRemoveDevicesAsync(Drivers.Keys).ConfigureAwait(false);
@@ -894,6 +895,8 @@ internal sealed class DeviceThreadManage : IAsyncDisposable, IDeviceThreadManage
LogMessage?.LogInformation(Localizer["ChannelDispose", CurrentChannel?.Name ?? string.Empty]);
LogMessage?.Logs?.ForEach(a => a.TryDispose());
}
finally
{

View File

@@ -8,8 +8,8 @@
<ItemGroup>
<PackageReference Include="Portable.BouncyCastle" Version="1.9.0" />
<PackageReference Include="Rougamo.Fody" Version="5.0.0" />
<PackageReference Include="TouchSocket.Dmtp" Version="3.1.6" />
<PackageReference Include="TouchSocket.WebApi.Swagger" Version="3.1.6" />
<PackageReference Include="TouchSocket.Dmtp" Version="3.1.7" />
<PackageReference Include="TouchSocket.WebApi.Swagger" Version="3.1.7" />
<PackageReference Include="ThingsGateway.Authentication" Version="$(AuthenticationVersion)" />
<!--<ProjectReference Include="..\..\PluginPro\ThingsGateway.Authentication\ThingsGateway.Authentication.csproj" />-->

View File

@@ -39,19 +39,40 @@ public partial class ChannelTable : IDisposable
protected override void OnInitialized()
{
scheduler = new SmartTriggerScheduler(Notify, TimeSpan.FromMilliseconds(1000));
_ = RunTimerAsync();
base.OnInitialized();
}
private SmartTriggerScheduler scheduler;
private IEnumerable<ChannelRuntime>? _previousItemsRef;
protected override void OnParametersSet()
{
if (!ReferenceEquals(_previousItemsRef, Items))
{
_previousItemsRef = Items;
Refresh();
}
base.OnParametersSet();
}
private void Refresh()
{
scheduler.Trigger();
}
private async Task Notify()
{
if (Disposed) return;
if (table != null)
await InvokeAsync(table.QueryAsync);
}
private async Task RunTimerAsync()
{
while (!Disposed)
{
try
{
if (table != null)
await InvokeAsync(table.QueryAsync);
await InvokeAsync(StateHasChanged);
}
catch (Exception ex)
{

View File

@@ -39,10 +39,32 @@ public partial class DeviceTable : IDisposable
protected override void OnInitialized()
{
scheduler = new SmartTriggerScheduler(Notify, TimeSpan.FromMilliseconds(1000));
_ = RunTimerAsync();
base.OnInitialized();
}
private SmartTriggerScheduler scheduler;
private IEnumerable<DeviceRuntime>? _previousItemsRef;
protected override void OnParametersSet()
{
if (!ReferenceEquals(_previousItemsRef, Items))
{
_previousItemsRef = Items;
Refresh();
}
base.OnParametersSet();
}
private void Refresh()
{
scheduler.Trigger();
}
private async Task Notify()
{
if (Disposed) return;
if (table != null)
await InvokeAsync(table.QueryAsync);
}
private async Task RunTimerAsync()
{
@@ -50,8 +72,7 @@ public partial class DeviceTable : IDisposable
{
try
{
if (table != null)
await InvokeAsync(table.QueryAsync);
await InvokeAsync(StateHasChanged);
}
catch (Exception ex)
{

View File

@@ -20,6 +20,10 @@
{
"Url": "/ModbusSlave",
"Text": "ModbusSlave"
},
{
"Url": "/ModbusGYMaster",
"Text": "ModbusGYMaster"
}
]
},

View File

@@ -212,7 +212,7 @@ public partial class ModbusMaster : DtuServiceDeviceBase, IModbusAddress
}
}
private ISendMessage GetSendMessage(ModbusAddress modbusAddress, bool read)
protected ISendMessage GetSendMessage(ModbusAddress modbusAddress, bool read)
{
if (ModbusType == ModbusTypeEnum.ModbusRtu)
{

View File

@@ -12,7 +12,7 @@
</PackageReference>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.0">
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

View File

@@ -40,6 +40,21 @@ public partial class SqlHistoryAlarm : BusinessBaseWithCacheVariableModel<Histor
return;
AddQueueVarModel(new CacheDBItem<HistoryAlarm>(alarmVariable.Adapt<HistoryAlarm>(_config)));
}
public override void PauseThread(bool pause)
{
lock (this)
{
var oldV = CurrentDevice.Pause;
base.PauseThread(pause);
if (!pause && oldV != pause)
{
GlobalData.ReadOnlyRealAlarmIdVariables?.ForEach(a =>
{
AlarmWorker_OnAlarmChanged(a.Value);
});
}
}
}
private async ValueTask<OperResult> InserableAsync(List<HistoryAlarm> dbInserts, CancellationToken cancellationToken)
{

View File

@@ -16,7 +16,6 @@ using SqlSugar;
using System.Collections.Concurrent;
using ThingsGateway.Extension;
using ThingsGateway.Foundation.Modbus;
using ThingsGateway.Gateway.Application;
using ThingsGateway.NewLife;
@@ -33,7 +32,7 @@ public class ModbusSlave : BusinessBase
{
private readonly ModbusSlaveProperty _driverPropertys = new();
private readonly ConcurrentQueue<(string, VariableRuntime)> _modbusVariableQueue = new();
private readonly ConcurrentDictionary<string, VariableRuntime> ModbusVariableQueue = new();
private readonly ModbusSlaveVariableProperty _variablePropertys = new();
@@ -124,7 +123,7 @@ public class ModbusSlave : BusinessBase
public override async Task AfterVariablesChangedAsync(CancellationToken cancellationToken)
{
await base.AfterVariablesChangedAsync(cancellationToken).ConfigureAwait(false);
_modbusVariableQueue?.Clear();
ModbusVariableQueue?.Clear();
IdVariableRuntimes.ForEach(a =>
{
VariableValueChange(a.Value, default);
@@ -145,7 +144,7 @@ public class ModbusSlave : BusinessBase
protected override void Dispose(bool disposing)
{
ModbusVariables?.Clear();
_modbusVariableQueue?.Clear();
ModbusVariableQueue?.Clear();
GlobalData.VariableValueChangeEvent -= VariableValueChange;
_plc?.SafeDispose();
base.Dispose(disposing);
@@ -180,19 +179,19 @@ public class ModbusSlave : BusinessBase
await Task.Delay(10000, cancellationToken).ConfigureAwait(false);
}
}
var list = _modbusVariableQueue.ToListWithDequeue();
var list = ModbusVariableQueue.ToDictWithDequeue();
foreach (var item in list)
{
if (cancellationToken.IsCancellationRequested)
break;
var type = item.Item2.GetPropertyValue(CurrentDevice.Id, nameof(ModbusSlaveVariableProperty.DataType));
var type = item.Value.GetPropertyValue(CurrentDevice.Id, nameof(ModbusSlaveVariableProperty.DataType));
if (Enum.TryParse(type, out DataTypeEnum result))
{
await _plc.WriteAsync(item.Item1, JToken.FromObject(item.Item2.Value), result, cancellationToken).ConfigureAwait(false);
await _plc.WriteAsync(item.Key, JToken.FromObject(item.Value.Value), result, cancellationToken).ConfigureAwait(false);
}
else
{
await _plc.WriteAsync(item.Item1, JToken.FromObject(item.Item2.Value), item.Item2.DataType, cancellationToken).ConfigureAwait(false);
await _plc.WriteAsync(item.Key, JToken.FromObject(item.Value.Value), item.Value.DataType, cancellationToken).ConfigureAwait(false);
}
}
@@ -259,7 +258,25 @@ public class ModbusSlave : BusinessBase
var address = variableRuntime.GetPropertyValue(DeviceId, nameof(_variablePropertys.ServiceAddress));
if (address != null && variableRuntime.Value != null)
{
_modbusVariableQueue?.Enqueue((address, variableRuntime));
ModbusVariableQueue?.AddOrUpdate(address, address => variableRuntime, (address, addvalue) => variableRuntime);
}
}
public override void PauseThread(bool pause)
{
lock (this)
{
var oldV = CurrentDevice.Pause;
base.PauseThread(pause);
if (!pause && oldV != pause)
{
IdVariableRuntimes.ForEach(a =>
{
VariableValueChange(a.Value, null);
});
}
}
}
}

View File

@@ -21,6 +21,7 @@ using System.Collections.Concurrent;
using ThingsGateway.Extension;
using ThingsGateway.Extension.Generic;
using ThingsGateway.Gateway.Application;
using ThingsGateway.NewLife.Extension;
using ThingsGateway.NewLife.Threading;
using TouchSocket.Core;
@@ -47,7 +48,7 @@ public partial class OpcUaServer : BusinessBase
protected override BusinessPropertyBase _businessPropertyBase => _driverPropertys;
protected IStringLocalizer Localizer { get; private set; }
private ConcurrentQueue<VariableBasicData> CollectVariableRuntimes { get; set; } = new();
private ConcurrentDictionary<long, VariableBasicData> CollectVariableRuntimes { get; set; } = new();
private static readonly string[] separator = new string[] { ";" };
@@ -183,13 +184,9 @@ public partial class OpcUaServer : BusinessBase
await Task.Delay(10000, cancellationToken).ConfigureAwait(false);
}
}
var data = CollectVariableRuntimes.ToListWithDequeue();
if (data.Count > 0)
var varList = CollectVariableRuntimes.ToListWithDequeue();
if (varList.Count > 0)
{
data.Reverse();
////变化推送
var varList = data.DistinctBy(a => a.Id).ToList();
if (varList?.Count > 0)
{
foreach (var item in varList)
@@ -411,17 +408,36 @@ public partial class OpcUaServer : BusinessBase
return config;
}
private void VariableValueChange(VariableRuntime variableRuntime, VariableBasicData variableData)
{
if (CurrentDevice.Pause)
return;
if (DisposedValue) return;
if (IdVariableRuntimes.ContainsKey(variableData.Id))
CollectVariableRuntimes.Enqueue(variableData);
CollectVariableRuntimes.AddOrUpdate(variableData.Id, id => variableData, (id, addValue) => variableData);
else
{
}
}
/// <summary>
/// 暂停
/// </summary>
/// <param name="pause">暂停</param>
public override void PauseThread(bool pause)
{
lock (this)
{
var oldV = CurrentDevice.Pause;
base.PauseThread(pause);
if (!pause && oldV != pause)
{
IdVariableRuntimes.ForEach(a =>
{
VariableValueChange(a.Value, a.Value.Adapt<VariableBasicData>());
});
}
}
}
}

View File

@@ -2,6 +2,7 @@
<ItemGroup>
<PackageReference Include="ThingsGateway.Plugin.ModbusC1" Version="$(ProPluginVersion)" GeneratePathProperty="true" Private="false" IncludeAssets="native;" />
<PackageReference Include="ThingsGateway.Plugin.ModbusGY" Version="$(ProPluginVersion)" GeneratePathProperty="true" Private="false" IncludeAssets="native;" />
</ItemGroup>
@@ -12,6 +13,7 @@
<ItemGroup>
<!-- setting up the variable for convenience -->
<PkgThingsGateway_Plugin_ModbusC1PackageFiles Include="$(PkgThingsGateway_Plugin_ModbusC1)\Content\$(PluginTargetFramework)\**\*.*" />
<PkgThingsGateway_Plugin_ModbusGYPackageFiles Include="$(PkgThingsGateway_Plugin_ModbusGY)\Content\$(PluginTargetFramework)\**\*.*" />
</ItemGroup>
<PropertyGroup>
<PluginFolder>$(TargetDir)Plugins\</PluginFolder>
@@ -19,6 +21,7 @@
<Message Text="将插件复制到插件目录 $(PluginFolder)" Importance="high" />
<Copy SourceFiles="@(PkgThingsGateway_Plugin_ModbusC1PackageFiles)" DestinationFolder="$(PluginFolder)%(RecursiveDir)" />
<Copy SourceFiles="@(PkgThingsGateway_Plugin_ModbusGYPackageFiles)" DestinationFolder="$(PluginFolder)%(RecursiveDir)" />
</Target>

View File

@@ -28,6 +28,8 @@
<ProjectReference Include="..\PluginPro\ThingsGateway.Plugin.TIANXIN\ThingsGateway.Plugin.TIANXIN.csproj" />
<ProjectReference Include="..\PluginPro\ThingsGateway.Plugin.Inovance\ThingsGateway.Plugin.Inovance.csproj" />
<ProjectReference Include="..\PluginPro\ThingsGateway.Plugin.ModbusGY\ThingsGateway.Plugin.ModbusGY.csproj" />
</ItemGroup>

View File

@@ -103,6 +103,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThingsGateway.Plugin.Synchr
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThingsGateway.SqlSugar", "Admin\ThingsGateway.SqlSugar\ThingsGateway.SqlSugar.csproj", "{544EDA9F-978F-84F7-48BF-FA5888F52FFB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThingsGateway.DB", "Admin\ThingsGateway.DB\ThingsGateway.DB.csproj", "{317B8159-28B1-49B1-1884-97D1BBDED982}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -273,6 +275,10 @@ Global
{544EDA9F-978F-84F7-48BF-FA5888F52FFB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{544EDA9F-978F-84F7-48BF-FA5888F52FFB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{544EDA9F-978F-84F7-48BF-FA5888F52FFB}.Release|Any CPU.Build.0 = Release|Any CPU
{317B8159-28B1-49B1-1884-97D1BBDED982}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{317B8159-28B1-49B1-1884-97D1BBDED982}.Debug|Any CPU.Build.0 = Debug|Any CPU
{317B8159-28B1-49B1-1884-97D1BBDED982}.Release|Any CPU.ActiveCfg = Release|Any CPU
{317B8159-28B1-49B1-1884-97D1BBDED982}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -317,10 +323,11 @@ Global
{29DCAC9C-2D0F-E251-E907-F07D804CA117} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
{438B86D4-0CAE-DCC3-E952-90CE77BB8661} = {36510D70-161F-4241-B8D0-781E21032816}
{544EDA9F-978F-84F7-48BF-FA5888F52FFB} = {72C65578-92A5-4E99-9779-27835B12B32F}
{317B8159-28B1-49B1-1884-97D1BBDED982} = {72C65578-92A5-4E99-9779-27835B12B32F}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {199B1B96-4F56-4828-9531-813BA02DB282}
RESX_NeutralResourcesLanguage = zh-Hans
RESX_Rules = {"EnabledRules":[]}
RESX_NeutralResourcesLanguage = zh-Hans
SolutionGuid = {199B1B96-4F56-4828-9531-813BA02DB282}
EndGlobalSection
EndGlobal

View File

@@ -16,7 +16,7 @@
<ItemGroup>
<PackageReference Include="TouchSocket.Dmtp" Version="3.1.6" />
<PackageReference Include="TouchSocket.Dmtp" Version="3.1.7" />
</ItemGroup>

View File

@@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<Version>10.7.31</Version>
<Version>10.7.36</Version>
</PropertyGroup>
<ItemGroup>