diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/CodeFirstProvider/CodeFirstProvider.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/CodeFirstProvider/CodeFirstProvider.cs index 2f3273758..39a4cfaf4 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/CodeFirstProvider/CodeFirstProvider.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/CodeFirstProvider/CodeFirstProvider.cs @@ -109,6 +109,9 @@ namespace SqlSugar } } var tableName = GetTableName(entityInfo); + this.Context.MappingTables.Add(entityInfo.EntityName,tableName); + entityInfo.DbTableName = tableName; + entityInfo.Columns.ForEach(it => { it.DbTableName = tableName; }); var isAny = this.Context.DbMaintenance.IsAnyTable(tableName); if (isAny) ExistLogic(entityInfo); diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs index 888945f1c..0d2b36e9c 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs @@ -260,7 +260,10 @@ namespace SqlSugar method = isNullableType ? getConvertBoolean : getBoolean; break; case CSharpDataType.@string: - CheckType(bind.StringThrow, bindProperyTypeName, validPropertyName, propertyName); + if (this.Context.CurrentConnectionConfig.DbType != DbType.Oracle) + { + CheckType(bind.StringThrow, bindProperyTypeName, validPropertyName, propertyName); + } method = getString; if (bindProperyTypeName == "guid") { diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbMaintenanceProvider/Methods.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbMaintenanceProvider/Methods.cs index 5177c3229..90c43d84f 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbMaintenanceProvider/Methods.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DbMaintenanceProvider/Methods.cs @@ -302,7 +302,7 @@ namespace SqlSugar this.Context.Ado.ExecuteCommand(sql); return true; } - public virtual bool CreateIndex(string tableName, string[] columnNames, bool isUnique = false) + public virtual bool CreateIndex(string tableName, string[] columnNames, bool isUnique=false) { string sql = string.Format(CreateIndexSql,tableName,string.Join(",",columnNames), string.Join("_", columnNames), isUnique ? "UNIQUE" : ""); this.Context.Ado.ExecuteCommand(sql); diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/CaseWhen/CaseWhen.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/CaseWhen/CaseWhen.cs index 3e74788e5..7ba270fdc 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/CaseWhen/CaseWhen.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/CaseWhen/CaseWhen.cs @@ -16,6 +16,10 @@ namespace SqlSugar { return default(T); } + public T End() + { + return default(T); + } } public class CaseThen { diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/CaseWhen/CaseWhenResolve.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/CaseWhen/CaseWhenResolve.cs index b309c4105..fe36b158d 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/CaseWhen/CaseWhenResolve.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/CaseWhen/CaseWhenResolve.cs @@ -45,8 +45,15 @@ namespace SqlSugar { var isFirst = allMethods.First() == methodExp; var isLast = allMethods.Last() == methodExp; - var sql = SubTools.GetMethodValue(this.context, methodExp.Arguments[0], this.context.IsSingle ? ResolveExpressType.WhereSingle : ResolveExpressType.WhereMultiple); - sqls.Add(new KeyValuePair(methodExp.Method.Name, sql)); + if (methodExp.Arguments.Count == 0) + { + sqls.Add(new KeyValuePair(methodExp.Method.Name, "null")); + } + else + { + var sql = SubTools.GetMethodValue(this.context, methodExp.Arguments[0], this.context.IsSingle ? ResolveExpressType.WhereSingle : ResolveExpressType.WhereMultiple); + sqls.Add(new KeyValuePair(methodExp.Method.Name, sql)); + } } var result = this.context.DbMehtods.CaseWhen(sqls); return result; diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/DefaultDbMethod.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/DefaultDbMethod.cs index 9e92a7f45..48be384e6 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/DefaultDbMethod.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/DefaultDbMethod.cs @@ -420,5 +420,17 @@ namespace SqlSugar var parameter = model.Args[0]; return string.Format(" CAST({0} AS VARCHAR(MAX))", parameter.MemberName); } + public string BitwiseAnd(MethodCallExpressionModel model) + { + var parameter = model.Args[0]; + var parameter2 = model.Args[1]; + return string.Format(" ({0} & {1}) ", parameter.MemberName, parameter2.MemberName); ; + } + public string BitwiseInclusiveOR(MethodCallExpressionModel model) + { + var parameter = model.Args[0]; + var parameter2 = model.Args[1]; + return string.Format(" ({0} | {1}) ", parameter.MemberName, parameter2.MemberName); ; + } } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/IDbMethods.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/IDbMethods.cs index b37553b9d..87aa7bbb3 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/IDbMethods.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/IDbMethods.cs @@ -65,5 +65,7 @@ namespace SqlSugar string GetDate(); string GetRandom(); string CharIndex(MethodCallExpressionModel model); + string BitwiseAnd(MethodCallExpressionModel model); + string BitwiseInclusiveOR(MethodCallExpressionModel model); } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/SqlFunc.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/SqlFunc.cs index 920f2149b..bd8e6c558 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/SqlFunc.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/DbMethods/SqlFunc.cs @@ -65,7 +65,7 @@ namespace SqlSugar { return thisValue.Equals(parameterValue); } - public new static bool EqualsNull(object thisValue, object parameterValue) + public static bool EqualsNull(object thisValue, object parameterValue) { return thisValue.Equals(parameterValue); } @@ -137,5 +137,7 @@ namespace SqlSugar public static Subqueryable Subqueryable() where T:class,new(){ throw new NotSupportedException("Can only be used in expressions");} public static CaseThen IF(bool condition) { throw new NotSupportedException("Can only be used in expressions"); } public static int CharIndex(string findChar,string searchValue) { throw new NotSupportedException("Can only be used in expressions"); } + public static int BitwiseAnd(int left, int right) { throw new NotSupportedException("Can only be used in expressions"); } + public static int BitwiseInclusiveOR(int left, int right) { throw new NotSupportedException("Can only be used in expressions"); } } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ExpressionContext.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ExpressionContext.cs index 40fc5a367..e9e99494f 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ExpressionContext.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ExpressionContext.cs @@ -127,6 +127,7 @@ namespace SqlSugar copyContext.RefreshMapping = this.RefreshMapping; copyContext.ParameterIndex = this.ParameterIndex; copyContext.PgSqlIsAutoToLower = this.PgSqlIsAutoToLower; + copyContext.IsSingle = this.IsSingle; return copyContext; } public ExpressionContext GetCopyContextWithMapping() @@ -141,6 +142,7 @@ namespace SqlSugar copyContext.InitMappingInfo = this.InitMappingInfo; copyContext.RefreshMapping = this.RefreshMapping; copyContext.PgSqlIsAutoToLower = this.PgSqlIsAutoToLower; + copyContext.IsSingle = this.IsSingle; return copyContext; } #endregion diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MemberInitExpressionResolve.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MemberInitExpressionResolve.cs index a7b77a3eb..aa635be34 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MemberInitExpressionResolve.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MemberInitExpressionResolve.cs @@ -1,5 +1,4 @@ -using Newtonsoft.Json; -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; @@ -61,7 +60,7 @@ namespace SqlSugar if (customAttribute?.IsJson ?? false) { var paramterValue = ExpressionTool.DynamicInvoke(item); - var parameterName = AppendParameter(JsonConvert.SerializeObject(paramterValue)); + var parameterName = AppendParameter(new SerializeService().SerializeObject(paramterValue)); this.Context.Result.Append(base.Context.GetEqString(memberName, parameterName)); continue; diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs index aa99b5500..f4e30f614 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MethodCallExpressionResolve.cs @@ -664,6 +664,10 @@ namespace SqlSugar return this.Context.DbMehtods.GetRandom(); case "CharIndex": return this.Context.DbMehtods.CharIndex(model); + case "BitwiseAnd": + return this.Context.DbMehtods.BitwiseAnd(model); + case "BitwiseInclusiveOR": + return this.Context.DbMehtods.BitwiseInclusiveOR(model); default: break; } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/ContextMethods.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/ContextMethods.cs index 3776de327..13b90628f 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/ContextMethods.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/ContextMethods.cs @@ -278,14 +278,13 @@ namespace SqlSugar var typeName = tType.Name; if (item.PropertyType.IsClass()) { - if (readerValues != null && - readerValues.Count == 1 && - readerValues.First().Key == name && - readerValues.First().Value!=null&& - readerValues.First().Value.GetType()==UtilConstants.StringType&& - Regex.IsMatch(readerValues.First().Value.ObjToString(), @"^\{.+\}$")) + if (IsJsonItem(readerValues, name)) { - result.Add(name, DeserializeObject>(readerValues.First().Value.ObjToString())); + result.Add(name, DeserializeObject>(readerValues.First().Value.ObjToString())); + } + else if (IsJsonList(readerValues, item)) + { + result.Add(name, DeserializeObject>>(readerValues[item.Name.ToLower()].ToString())); } else { @@ -336,6 +335,25 @@ namespace SqlSugar return result; } + private static bool IsJsonItem(Dictionary readerValues, string name) + { + return readerValues != null && + readerValues.Count == 1 && + readerValues.First().Key == name && + readerValues.First().Value != null && + readerValues.First().Value.GetType() == UtilConstants.StringType && + Regex.IsMatch(readerValues.First().Value.ObjToString(), @"^\{.+\}$"); + } + + private static bool IsJsonList(Dictionary readerValues, PropertyInfo item) + { + return item.PropertyType.FullName.IsCollectionsList() && + readerValues.ContainsKey(item.Name.ToLower()) && + readerValues[item.Name.ToLower()] != null && + readerValues[item.Name.ToLower()].GetType() == UtilConstants.StringType && + Regex.IsMatch(readerValues[item.Name.ToLower()].ToString(), @"^\[{.+\}]$"); + } + private Dictionary DataReaderToDynamicList_Part(Dictionary readerValues, PropertyInfo item, List reval) { Dictionary result = new Dictionary(); diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Dm/DbBind/DmDbBind.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Dm/DbBind/DmDbBind.cs index 9927d5d77..80e4c6b09 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Dm/DbBind/DmDbBind.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Dm/DbBind/DmDbBind.cs @@ -92,6 +92,7 @@ namespace SqlSugar new KeyValuePair("number",CSharpDataType.@double), new KeyValuePair("number",CSharpDataType.@long), new KeyValuePair("number",CSharpDataType.@bool), + new KeyValuePair("bit",CSharpDataType.@bool), new KeyValuePair("number",CSharpDataType.@decimal), new KeyValuePair("number",CSharpDataType.Single), new KeyValuePair("decimal",CSharpDataType.@decimal), diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Dm/DbMaintenance/DmDbMaintenance.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Dm/DbMaintenance/DmDbMaintenance.cs index f69265091..97e46bee0 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Dm/DbMaintenance/DmDbMaintenance.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Dm/DbMaintenance/DmDbMaintenance.cs @@ -348,11 +348,11 @@ namespace SqlSugar return GetColumnInfosByTableName(tableName); else return this.Context.Utilities.GetReflectionInoCacheInstance().GetOrCreate(cacheKey, - () => - { - return GetColumnInfosByTableName(tableName); + () => + { + return GetColumnInfosByTableName(tableName); - }); + }); } private List GetColumnInfosByTableName(string tableName) @@ -360,7 +360,7 @@ namespace SqlSugar string sql = "select * from " + SqlBuilder.GetTranslationTableName(tableName) + " WHERE 1=2 "; var oldIsEnableLog = this.Context.Ado.IsEnableLogEvent; this.Context.Ado.IsEnableLogEvent = false; - using (DbDataReader reader = (DbDataReader)this.Context.Ado.GetDataReader(sql)) + using(DbDataReader reader = (DbDataReader) this.Context.Ado.GetDataReader(sql)) { this.Context.Ado.IsEnableLogEvent = oldIsEnableLog; List result = new List(); @@ -371,8 +371,8 @@ namespace SqlSugar { TableName = tableName, DataType = row["DataType"].ToString().Replace("System.", "").Trim(), - IsNullable = (bool)row["AllowDBNull"], - IsIdentity = (bool)row["IsIdentity"], + IsNullable = (bool) row["AllowDBNull"], + IsIdentity = (bool) row["IsIdentity"], ColumnDescription = GetFieldComment(tableName, row["ColumnName"].ToString()), DbColumnName = row["ColumnName"].ToString(), //DefaultValue = row["defaultValue"].ToString(), @@ -391,32 +391,32 @@ namespace SqlSugar string cacheKey = "DbMaintenanceProvider.GetPrimaryKeyByTableNames." + this.SqlBuilder.GetNoTranslationColumnName(tableName).ToLower(); cacheKey = GetCacheKey(cacheKey); return this.Context.Utilities.GetReflectionInoCacheInstance().GetOrCreate(cacheKey, - () => - { - var oldIsEnableLog = this.Context.Ado.IsEnableLogEvent; - this.Context.Ado.IsEnableLogEvent = false; - string sql = @" select distinct cu.COLUMN_name KEYNAME from user_cons_columns cu, user_constraints au + () => + { + var oldIsEnableLog = this.Context.Ado.IsEnableLogEvent; + this.Context.Ado.IsEnableLogEvent = false; + string sql = @" select distinct cu.COLUMN_name KEYNAME from user_cons_columns cu, user_constraints au where cu.constraint_name = au.constraint_name and au.constraint_type = 'P' and au.table_name = '" + tableName.ToUpper() + @"'"; - var pks = this.Context.Ado.SqlQuery(sql); - this.Context.Ado.IsEnableLogEvent = oldIsEnableLog; - return pks; - }); + var pks = this.Context.Ado.SqlQuery(sql); + this.Context.Ado.IsEnableLogEvent = oldIsEnableLog; + return pks; + }); } public string GetTableComment(string tableName) { string cacheKey = "DbMaintenanceProvider.GetTableComment." + tableName; var comments = this.Context.Utilities.GetReflectionInoCacheInstance().GetOrCreate(cacheKey, - () => - { - string sql = "SELECT COMMENTS FROM USER_TAB_COMMENTS WHERE TABLE_NAME =@tableName ORDER BY TABLE_NAME"; - var oldIsEnableLog = this.Context.Ado.IsEnableLogEvent; - this.Context.Ado.IsEnableLogEvent = false; - var pks = this.Context.Ado.SqlQuery(sql, new { tableName = tableName.ToUpper() }); - this.Context.Ado.IsEnableLogEvent = oldIsEnableLog; - return pks; - }); + () => + { + string sql = "SELECT COMMENTS FROM USER_TAB_COMMENTS WHERE TABLE_NAME =@tableName ORDER BY TABLE_NAME"; + var oldIsEnableLog = this.Context.Ado.IsEnableLogEvent; + this.Context.Ado.IsEnableLogEvent = false; + var pks = this.Context.Ado.SqlQuery(sql, new { tableName = tableName.ToUpper() }); + this.Context.Ado.IsEnableLogEvent = oldIsEnableLog; + return pks; + }); return comments.HasValue() ? comments.First() : ""; } @@ -424,15 +424,15 @@ namespace SqlSugar { string cacheKey = "DbMaintenanceProvider.GetFieldComment." + tableName; var comments = this.Context.Utilities.GetReflectionInoCacheInstance().GetOrCreate(cacheKey, - () => - { - string sql = "SELECT TVNAME AS TableName, COLNAME,COMMENT$ AS ColumnDescription from SYSCOLUMNCOMMENTS WHERE TVNAME='"+ tableName.ToUpper() + "' ORDER BY TVNAME"; - var oldIsEnableLog = this.Context.Ado.IsEnableLogEvent; - this.Context.Ado.IsEnableLogEvent = false; - var pks = this.Context.Ado.SqlQuery(sql); - this.Context.Ado.IsEnableLogEvent = oldIsEnableLog; - return pks; - }); + () => + { + string sql = "SELECT TVNAME AS TableName, COLNAME,COMMENT$ AS ColumnDescription from SYSCOLUMNCOMMENTS WHERE TVNAME='" + tableName.ToUpper() + "' ORDER BY TVNAME"; + var oldIsEnableLog = this.Context.Ado.IsEnableLogEvent; + this.Context.Ado.IsEnableLogEvent = false; + var pks = this.Context.Ado.SqlQuery(sql); + this.Context.Ado.IsEnableLogEvent = oldIsEnableLog; + return pks; + }); return comments.HasValue() ? comments.First(it => it.DbColumnName.Equals(filedName, StringComparison.CurrentCultureIgnoreCase)).ColumnDescription : ""; } @@ -462,4 +462,4 @@ namespace SqlSugar } #endregion } -} +} \ No newline at end of file diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Dm/DmProvider.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Dm/DmProvider.cs index 5a896810b..4c469218f 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Dm/DmProvider.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Dm/DmProvider.cs @@ -117,6 +117,11 @@ namespace SqlSugar sqlParameter.Size = parameter.Size; sqlParameter.Value = parameter.Value; sqlParameter.DbType = parameter.DbType; + if (sqlParameter.DbType == System.Data.DbType.Guid) + { + sqlParameter.DbType = System.Data.DbType.String; + sqlParameter.Value = sqlParameter.Value.ToString(); + } if (parameter.Direction == 0) { parameter.Direction = ParameterDirection.Input; diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/Insertable/OracleInsertable.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/Insertable/OracleInsertable.cs index 8ef7ba715..952c90ef8 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/Insertable/OracleInsertable.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/Insertable/OracleInsertable.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using System.Threading.Tasks; namespace SqlSugar { @@ -22,6 +23,8 @@ namespace SqlSugar } public override int ExecuteReturnIdentity() { + bool oldIsAuto = AutoBegin(); + InsertBuilder.IsReturnIdentity = true; PreToSql(); string sql = InsertBuilder.ToSqlString(); @@ -31,11 +34,15 @@ namespace SqlSugar var count = Ado.ExecuteCommand(sql, InsertBuilder.Parameters == null ? null : InsertBuilder.Parameters.ToArray()); var result = (this.GetIdentityKeys().IsNullOrEmpty() || count == 0) ? 0 : GetSeqValue(GetSeqName()).ObjToInt(); this.Context.Ado.IsDisableMasterSlaveSeparation = isDisableMasterSlaveSeparation; + + AutoEnd(oldIsAuto); return result; } public override long ExecuteReturnBigIdentity() { + bool oldIsAuto = AutoBegin(); + InsertBuilder.IsReturnIdentity = true; PreToSql(); string sql = InsertBuilder.ToSqlString(); @@ -43,22 +50,72 @@ namespace SqlSugar var isDisableMasterSlaveSeparation = this.Context.Ado.IsDisableMasterSlaveSeparation; this.Context.Ado.IsDisableMasterSlaveSeparation = true; var count = Ado.ExecuteCommand(sql, InsertBuilder.Parameters == null ? null : InsertBuilder.Parameters.ToArray()); - var result = (this.GetIdentityKeys().IsNullOrEmpty() || count == 0) ? 0 :Convert.ToInt64(GetSeqValue(GetSeqName())); + var result = (this.GetIdentityKeys().IsNullOrEmpty() || count == 0) ? 0 : Convert.ToInt64(GetSeqValue(GetSeqName())); this.Context.Ado.IsDisableMasterSlaveSeparation = isDisableMasterSlaveSeparation; + + AutoEnd(oldIsAuto); return result; } + public async override Task ExecuteReturnIdentityAsync() + { + bool oldIsAuto = AutoBegin(); + + InsertBuilder.IsReturnIdentity = true; + PreToSql(); + string sql = InsertBuilder.ToSqlString(); + RestoreMapping(); + var isDisableMasterSlaveSeparation = this.Context.Ado.IsDisableMasterSlaveSeparation; + this.Context.Ado.IsDisableMasterSlaveSeparation = true; + var count = await Ado.ExecuteCommandAsync(sql, InsertBuilder.Parameters == null ? null : InsertBuilder.Parameters.ToArray()); + var result = (this.GetIdentityKeys().IsNullOrEmpty() || count == 0) ? 0 : GetSeqValue(GetSeqName()).ObjToInt(); + this.Context.Ado.IsDisableMasterSlaveSeparation = isDisableMasterSlaveSeparation; + + AutoEnd(oldIsAuto); + return result; + } + + public async override Task ExecuteReturnBigIdentityAsync() + { + bool oldIsAuto = AutoBegin(); + + InsertBuilder.IsReturnIdentity = true; + PreToSql(); + string sql = InsertBuilder.ToSqlString(); + RestoreMapping(); + var isDisableMasterSlaveSeparation = this.Context.Ado.IsDisableMasterSlaveSeparation; + this.Context.Ado.IsDisableMasterSlaveSeparation = true; + var count = await Ado.ExecuteCommandAsync(sql, InsertBuilder.Parameters == null ? null : InsertBuilder.Parameters.ToArray()); + var result = (this.GetIdentityKeys().IsNullOrEmpty() || count == 0) ? 0 : Convert.ToInt64(GetSeqValue(GetSeqName())); + this.Context.Ado.IsDisableMasterSlaveSeparation = isDisableMasterSlaveSeparation; + + AutoEnd(oldIsAuto); + return result; + } + + private void AutoEnd(bool oldIsAuto) + { + if (oldIsAuto) + { + this.Context.Context.CurrentConnectionConfig.IsAutoCloseConnection = oldIsAuto; + if (this.Ado.Transaction == null) + this.Context.Ado.Close(); + } + } + + private bool AutoBegin() + { + var oldIsAuto = this.Context.Context.CurrentConnectionConfig.IsAutoCloseConnection; + if (this.Context.Context.CurrentConnectionConfig.IsAutoCloseConnection) + { + this.Context.Context.CurrentConnectionConfig.IsAutoCloseConnection = false; + } + + return oldIsAuto; + } private object GetSeqValue(string seqName) { - try - { - return Ado.GetScalar(" SELECT " + seqName + ".currval FROM DUAL"); - } - catch - { - Ado.GetScalar(" SELECT " + seqName + ".nextval FROM DUAL"); - return Ado.GetScalar(" SELECT " + seqName + ".currval-1 FROM DUAL"); - } + return Ado.GetScalar(" SELECT " + seqName + ".currval FROM DUAL"); } protected override void PreToSql() { @@ -73,15 +130,15 @@ namespace SqlSugar int seqBeginValue = 0; seqBeginValue = this.Ado.GetInt("select " + seqName + ".Nextval from dual"); //Console.WriteLine(seqBeginValue); - var nextLength= insertCount - 1; + var nextLength = insertCount - 1; if (nextLength > 0) { StringBuilder sb = new StringBuilder(); - sb.AppendLine(" select "+ seqName + ".nextval,t.* from ("); + sb.AppendLine(" select " + seqName + ".nextval,t.* from ("); for (int i = 0; i < nextLength; i++) { sb.AppendLine(" select 1 from dual"); - if (i<(nextLength - 1) ) + if (i < (nextLength - 1)) { sb.AppendLine("union all"); } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/SqlBuilder/OracleExpressionContext.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/SqlBuilder/OracleExpressionContext.cs index 218fb722a..92220fd78 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/SqlBuilder/OracleExpressionContext.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/SqlBuilder/OracleExpressionContext.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; @@ -14,7 +15,7 @@ namespace SqlSugar public SqlSugarProvider Context { get; set; } public OracleExpressionContext() { - base.DbMehtods = new OracleMethod(); + base.DbMehtods = new OracleMethod(); } public override string SqlParameterKeyWord { @@ -40,6 +41,42 @@ namespace SqlSugar } public partial class OracleMethod : DefaultDbMethod, IDbMethods { + private void PageEach(IEnumerable pageItems, int pageSize, Action> action) + { + if (pageItems != null && pageItems.Any()) + { + int totalRecord = pageItems.Count(); + int pageCount = (totalRecord + pageSize - 1) / pageSize; + for (int i = 1; i <= pageCount; i++) + { + var list = pageItems.Skip((i - 1) * pageSize).Take(pageSize).ToList(); + action(list); + } + } + } + public override string ContainsArray(MethodCallExpressionModel model) + { + if (model.Args[0].MemberValue == null) + { + return base.ContainsArray(model); + } + var inValueIEnumerable = ((IEnumerable)model.Args[0].MemberValue).Cast().ToArray(); + if (inValueIEnumerable.Count() < 1000) + { + return base.ContainsArray(model); + } + else + { + string result = ""; + PageEach(inValueIEnumerable, 999, it => + { + model.Args.First().MemberValue = it; + result+= (base.ContainsArray(model) + " OR "); + + }); + return " ( "+result.TrimEnd(' ').TrimEnd('R').TrimEnd('O')+" ) "; + } + } public override string ToInt64(MethodCallExpressionModel model) { var parameter = model.Args[0]; @@ -128,6 +165,12 @@ namespace SqlSugar return string.Format(" CAST({0} AS VARCHAR2(4000))", parameter.MemberName); } + public override string ToDecimal(MethodCallExpressionModel model) + { + var parameter = model.Args[0]; + return string.Format(" CAST({0} AS Number)", parameter.MemberName); + } + public override string ToDate(MethodCallExpressionModel model) { var parameter = model.Args[0]; diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/SqlServer/DbMaintenance/SqlServerDbMaintenance.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/SqlServer/DbMaintenance/SqlServerDbMaintenance.cs index 78ec403de..b9d9147ec 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/SqlServer/DbMaintenance/SqlServerDbMaintenance.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/SqlServer/DbMaintenance/SqlServerDbMaintenance.cs @@ -51,8 +51,8 @@ namespace SqlSugar WHERE syscolumns.id IN (SELECT id FROM sysobjects - WHERE xtype IN('u', - 'v') ) + WHERE upper(xtype) IN('U', + 'V') ) AND (systypes.name <> 'sysname') AND sysobjects.name='{0}' AND systypes.name<>'geometry' diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteExpressionContext.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteExpressionContext.cs index 22494adfd..3b8d0d2c1 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteExpressionContext.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Sqlite/SqlBuilder/SqliteExpressionContext.cs @@ -118,7 +118,7 @@ namespace SqlSugar var parameter3 = model.Args[2].MemberValue; if (parameter2.ObjToInt() < 0) { - return string.Format(" DATETIME(DATETIME({0}), '+{1} {2}s')", parameter, Math.Abs(parameter2.ObjToInt()), parameter3); + return string.Format(" DATETIME(DATETIME({0}), '-{1} {2}s')", parameter, Math.Abs(parameter2.ObjToInt()), parameter3); } else { @@ -165,7 +165,7 @@ namespace SqlSugar var parameter = model.Args[0].MemberName; var parameter2 = model.Args[1].MemberName; int time = 1; - return string.Format(" Cast((JulianDay({0}) - JulianDay({1})) *{2} As INTEGER)=0 ", parameter, parameter2, time); + return string.Format(" date({0}, 'localtime', 'start of day')= date({1}, 'localtime', 'start of day') ", parameter, parameter2, time); } public override string DateIsSameByType(MethodCallExpressionModel model) {