From dab4f29a19ff83fc6c29da0231e33aae8b00607f Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Wed, 7 May 2025 15:17:24 +0800 Subject: [PATCH] Synchronous code --- .../Dm/DbMaintenance/DmDbMaintenance.cs | 22 +++++----- .../Dm/SqlBuilder/DmExpressionContext.cs | 42 ++++++++++++++++++- .../DbMaintenance/OracleDbMaintenance.cs | 24 +++++++---- .../Realization/Oracle/OracleProvider.cs | 10 ++--- .../SqlBuilder/OracleExpressionContext.cs | 42 ++++++++++++++++++- .../Oracle/SqlBuilder/OracleUpdateBuilder.cs | 20 +++++++-- 6 files changed, 130 insertions(+), 30 deletions(-) diff --git a/Src/Asp.Net/SqlSugar/Realization/Dm/DbMaintenance/DmDbMaintenance.cs b/Src/Asp.Net/SqlSugar/Realization/Dm/DbMaintenance/DmDbMaintenance.cs index 3787e1b61..e03dde7b3 100644 --- a/Src/Asp.Net/SqlSugar/Realization/Dm/DbMaintenance/DmDbMaintenance.cs +++ b/Src/Asp.Net/SqlSugar/Realization/Dm/DbMaintenance/DmDbMaintenance.cs @@ -29,17 +29,16 @@ namespace SqlSugar { get { - return @"SELECT - table_name name, - (select TOP 1 COMMENTS from user_tab_comments where t.table_name=table_name ) as Description - from user_tables t where - table_name!='HELP' - AND table_name NOT LIKE '%$%' - AND table_name NOT LIKE 'LOGMNRC_%' - AND table_name!='LOGMNRP_CTAS_PART_MAP' - AND table_name!='LOGMNR_LOGMNR_BUILDLOG' - AND table_name!='SQLPLUS_PRODUCT_PROFILE' - "; + return @"SELECT a.TABLE_NAME AS Name,b.COMMENTS AS Description +FROM USER_TABLES a +LEFT JOIN (SELECT DISTINCT TABLE_NAME,COMMENTS FROM USER_TAB_COMMENTS WHERE COMMENTS IS NOT NULL) b ON a.TABLE_NAME=b.TABLE_NAME +WHERE +a.table_name!='HELP' +AND a.table_name NOT LIKE '%$%' +AND a.table_name NOT LIKE 'LOGMNRC_%' +AND a.table_name!='LOGMNRP_CTAS_PART_MAP' +AND a.table_name!='LOGMNR_LOGMNR_BUILDLOG' +AND a.table_name!='SQLPLUS_PRODUCT_PROFILE'"; } } protected override string GetViewInfoListSql @@ -329,6 +328,7 @@ WHERE table_name = '" + tableName + "'"); columnInfo.DataType = "varchar2"; columnInfo.Length = 50; } + ConvertCreateColumnInfo(columnInfo); return base.AddColumn(tableName, columnInfo); } public override bool CreateIndex(string tableName, string[] columnNames, bool isUnique = false) diff --git a/Src/Asp.Net/SqlSugar/Realization/Dm/SqlBuilder/DmExpressionContext.cs b/Src/Asp.Net/SqlSugar/Realization/Dm/SqlBuilder/DmExpressionContext.cs index 005e27e63..e97dcf298 100644 --- a/Src/Asp.Net/SqlSugar/Realization/Dm/SqlBuilder/DmExpressionContext.cs +++ b/Src/Asp.Net/SqlSugar/Realization/Dm/SqlBuilder/DmExpressionContext.cs @@ -192,7 +192,47 @@ namespace SqlSugar } public override string DateIsSameByType(MethodCallExpressionModel model) { - throw new NotSupportedException("Oracle NotSupportedException DateIsSameDay"); + var parameter = model.Args[0]; + var parameter2 = model.Args[1]; + var parameter3 = model.Args[2]; + + var dateType = parameter3.MemberValue.ObjToString().ToLower(); + var date1 = parameter.MemberName; + var date2 = parameter2.MemberName; + + if (dateType == "year") + { + return string.Format("(EXTRACT(YEAR FROM {0}) = EXTRACT(YEAR FROM {1}))", date1, date2); + } + else if (dateType == "month") + { + return string.Format("(EXTRACT(YEAR FROM {0}) = EXTRACT(YEAR FROM {1}) AND EXTRACT(MONTH FROM {0}) = EXTRACT(MONTH FROM {1}))", date1, date2); + } + else if (dateType == "day") + { + return string.Format("(TRUNC({0}) = TRUNC({1}))", date1, date2); + } + else if (dateType == "hour") + { + return string.Format("(TRUNC({0}, 'HH24') = TRUNC({1}, 'HH24'))", date1, date2); + } + else if (dateType == "minute") + { + return string.Format("(TRUNC({0}, 'MI') = TRUNC({1}, 'MI'))", date1, date2); + } + else if (dateType == "second") + { + return string.Format("(TRUNC({0}, 'SS') = TRUNC({1}, 'SS'))", date1, date2); + } + else if (dateType == "week" || dateType == "weekday") + { + return string.Format("(TRUNC({0}, 'IW') = TRUNC({1}, 'IW'))", date1, date2); + } + else + { + // 默认按天比较 + return string.Format("(TRUNC({0}) = TRUNC({1}))", date1, date2); + } } public override string Length(MethodCallExpressionModel model) { diff --git a/Src/Asp.Net/SqlSugar/Realization/Oracle/DbMaintenance/OracleDbMaintenance.cs b/Src/Asp.Net/SqlSugar/Realization/Oracle/DbMaintenance/OracleDbMaintenance.cs index c6028232c..e4c1cf4f9 100644 --- a/Src/Asp.Net/SqlSugar/Realization/Oracle/DbMaintenance/OracleDbMaintenance.cs +++ b/Src/Asp.Net/SqlSugar/Realization/Oracle/DbMaintenance/OracleDbMaintenance.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Linq; -using System.Text; +using System.Text; namespace SqlSugar { @@ -358,6 +358,7 @@ WHERE table_name = '"+tableName+"'"); columnInfo.DataType = "varchar2"; columnInfo.Length = 50; } + ConvertCreateColumnInfo(columnInfo); return base.AddColumn(tableName,columnInfo); } public override bool CreateIndex(string tableName, string[] columnNames, bool isUnique=false) @@ -503,6 +504,10 @@ WHERE table_name = '"+tableName+"'"); column.Length = 22; } } + if (current.DefaultValue != null) + { + column.DefaultValue = current.DefaultValue.TrimEnd('\'').TrimStart('\''); + } } result.Add(column); } @@ -523,7 +528,8 @@ WHERE table_name = '"+tableName+"'"); t1.char_length, t1.data_precision, t1.data_scale, - t1.nullable, + t1.nullable, + t1.data_default as DefaultValue, t4.index_name, t4.column_position, t4.descend @@ -594,7 +600,7 @@ WHERE table_name = '"+tableName+"'"); this.Context.Ado.IsEnableLogEvent = oldIsEnableLog; return pks; }); - return comments.HasValue() ? comments.First(it => it.DbColumnName.Equals(filedName, StringComparison.CurrentCultureIgnoreCase)).ColumnDescription : ""; + return comments.HasValue() ? comments.FirstOrDefault(it => it.DbColumnName.EqualCase(filedName))?.ColumnDescription : ""; } @@ -680,17 +686,17 @@ WHERE table_name = '"+tableName+"'"); } private static void ConvertCreateColumnInfo(DbColumnInfo x) { - string[] array = new string[] { "int","date"}; + string[] array = new string[] { "int","date"}; + if (x.OracleDataType.HasValue()) + { + x.DataType = x.OracleDataType; + } if (array.Contains(x.DataType?.ToLower())) { x.Length = 0; x.DecimalDigits = 0; } - if (x.OracleDataType.HasValue()) - { - x.DataType = x.OracleDataType; - } - if(x.DecimalDigits>0&& x.DataType?.ToLower().IsIn("varchar", "clob", "varchar2", "nvarchar2", "nvarchar")==true) + if(x.DecimalDigits>0&& x.DataType?.ToLower()?.IsIn("varchar", "clob", "varchar2", "nvarchar2", "nvarchar")==true) { x.DecimalDigits = 0; } diff --git a/Src/Asp.Net/SqlSugar/Realization/Oracle/OracleProvider.cs b/Src/Asp.Net/SqlSugar/Realization/Oracle/OracleProvider.cs index 5fc8e4e2f..b48580a7c 100644 --- a/Src/Asp.Net/SqlSugar/Realization/Oracle/OracleProvider.cs +++ b/Src/Asp.Net/SqlSugar/Realization/Oracle/OracleProvider.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; using System.Data; using System.Data.Common; -using System.Linq; +using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; @@ -87,7 +87,7 @@ namespace SqlSugar public override void BeginTran(string transactionName) { ((OracleConnection)this.Connection).BeginTransaction(); - } + } /// /// Only SqlServer /// @@ -107,7 +107,7 @@ namespace SqlSugar { return base.ProcessingEventStartingSQL(sql, parameter); } - else + else { return new KeyValuePair(sql, parameter); } @@ -142,10 +142,10 @@ namespace SqlSugar return sqlCommand; } private static string[] KeyWord = new string[] { "@month",":month",":day", "@day","@group",":group",":index","@index","@order", ":order", "@user", "@level", ":user", ":level", ":type", "@type",":year","@year","@date",":date" }; - private static string ReplaceKeyWordParameterName(string sql, SugarParameter[] parameters) + private string ReplaceKeyWordParameterName(string sql, SugarParameter[] parameters) { sql = ReplaceKeyWordWithAd(sql, parameters); - if (parameters.HasValue()) + if (parameters.HasValue()&&this.CommandType!=CommandType.StoredProcedure) { foreach (var Parameter in parameters.OrderByDescending(x=>x.ParameterName?.Length)) { diff --git a/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleExpressionContext.cs b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleExpressionContext.cs index e50b8c561..f96149614 100644 --- a/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleExpressionContext.cs +++ b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleExpressionContext.cs @@ -322,7 +322,47 @@ namespace SqlSugar } public override string DateIsSameByType(MethodCallExpressionModel model) { - throw new NotSupportedException("Oracle NotSupportedException DateIsSameDay"); + var parameter = model.Args[0]; + var parameter2 = model.Args[1]; + var parameter3 = model.Args[2]; + + var dateType = parameter3.MemberValue.ObjToString().ToLower(); + var date1 = parameter.MemberName; + var date2 = parameter2.MemberName; + + if (dateType == "year") + { + return string.Format("(EXTRACT(YEAR FROM {0}) = EXTRACT(YEAR FROM {1}))", date1, date2); + } + else if (dateType == "month") + { + return string.Format("(EXTRACT(YEAR FROM {0}) = EXTRACT(YEAR FROM {1}) AND EXTRACT(MONTH FROM {0}) = EXTRACT(MONTH FROM {1}))", date1, date2); + } + else if (dateType == "day") + { + return string.Format("(TRUNC({0}) = TRUNC({1}))", date1, date2); + } + else if (dateType == "hour") + { + return string.Format("(TRUNC({0}, 'HH24') = TRUNC({1}, 'HH24'))", date1, date2); + } + else if (dateType == "minute") + { + return string.Format("(TRUNC({0}, 'MI') = TRUNC({1}, 'MI'))", date1, date2); + } + else if (dateType == "second") + { + return string.Format("(TRUNC({0}, 'SS') = TRUNC({1}, 'SS'))", date1, date2); + } + else if (dateType == "week" || dateType == "weekday") + { + return string.Format("(TRUNC({0}, 'IW') = TRUNC({1}, 'IW'))", date1, date2); + } + else + { + // 默认按天比较 + return string.Format("(TRUNC({0}) = TRUNC({1}))", date1, date2); + } } public override string Length(MethodCallExpressionModel model) { diff --git a/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleUpdateBuilder.cs b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleUpdateBuilder.cs index adc092434..85ba9d970 100644 --- a/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleUpdateBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleUpdateBuilder.cs @@ -22,12 +22,20 @@ namespace SqlSugar var updateTable = string.Format("UPDATE {0} SET", base.GetTableNameStringNoWith); var setValues = string.Join(",", t.Where(s => !s.IsPrimarykey).Where(s => OldPrimaryKeys == null || !OldPrimaryKeys.Contains(s.DbColumnName)).Select(m => GetOracleUpdateColums(m)).ToArray()); var pkList = t.Where(s => s.IsPrimarykey).ToList(); + if (this.IsWhereColumns && this.PrimaryKeys?.Any() == true) + { + var whereColumns = pkList.Where(it => this.PrimaryKeys?.Any(p => p.EqualCase(it.PropertyName) || p.EqualCase(it.DbColumnName)) == true).ToList(); + if (whereColumns.Any()) + { + pkList = whereColumns; + } + } List whereList = new List(); foreach (var item in pkList) { var isFirst = pkList.First() == item; var whereString = isFirst ? " " : " AND "; - whereString += GetOracleUpdateColums(item); + whereString += GetOracleUpdateColums(item,true); whereList.Add(whereString); } return string.Format("{0} {1} WHERE {2};", updateTable, setValues, string.Join("",whereList)); @@ -36,9 +44,15 @@ namespace SqlSugar return sb.ToString(); } - private string GetOracleUpdateColums(DbColumnInfo m) + private string GetOracleUpdateColums(DbColumnInfo m,bool isWhere=false) { - return string.Format("\"{0}\"={1} ", m.DbColumnName.ToUpper(IsUppper), base.GetDbColumn(m,FormatValue(m.Value,m.IsPrimarykey,m.PropertyName))); + + 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 "); + } + return result; } int i = 0; public object FormatValue(object value,bool isPrimaryKey,string name)