diff --git a/Src/Asp.NetCore2/SqlSugar.OceanBaseForOracle/OceanBase/Deleteable/OceanBaseForOracleDeleteable.cs b/Src/Asp.NetCore2/SqlSugar.OceanBaseForOracle/OceanBase/Deleteable/OceanBaseForOracleDeleteable.cs new file mode 100644 index 000000000..c5dd36605 --- /dev/null +++ b/Src/Asp.NetCore2/SqlSugar.OceanBaseForOracle/OceanBase/Deleteable/OceanBaseForOracleDeleteable.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using SqlSugar; + +namespace SqlSugar.OceanBaseForOracle +{ + public class OceanBaseForOracleDeleteable : DeleteableProvider where T : class, new() + { + protected override List GetIdentityKeys() + { + return this.EntityInfo.Columns.Where(it => it.OracleSequenceName.HasValue()).Select(it => it.DbColumnName).ToList(); + } + } +} diff --git a/Src/Asp.NetCore2/SqlSugar.OceanBaseForOracle/OceanBase/Insertable/OceanBaseForOracleInsertable.cs b/Src/Asp.NetCore2/SqlSugar.OceanBaseForOracle/OceanBase/Insertable/OceanBaseForOracleInsertable.cs new file mode 100644 index 000000000..7aaa012f9 --- /dev/null +++ b/Src/Asp.NetCore2/SqlSugar.OceanBaseForOracle/OceanBase/Insertable/OceanBaseForOracleInsertable.cs @@ -0,0 +1,223 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar.OceanBaseForOracle +{ + public class OceanBaseForOracleInsertable : InsertableProvider where T : class, new() + { + + protected override List GetIdentityKeys() + { + return this.EntityInfo.Columns.Where(it => it.OracleSequenceName.HasValue()).Select(it => it.DbColumnName).ToList(); + } + protected string GetSeqName() + { + return this.EntityInfo.Columns.Where(it => it.OracleSequenceName.HasValue()).Select(it => it.OracleSequenceName).First(); + } + protected List GetSeqNames() + { + return this.EntityInfo.Columns.Where(it => it.OracleSequenceName.HasValue()).Select(it => it.OracleSequenceName).ToList(); + } + public override int ExecuteReturnIdentity() + { + bool oldIsAuto = AutoBegin(); + + InsertBuilder.IsReturnIdentity = true; + PreToSql(); + string sql = InsertBuilder.ToSqlString(); + if (isIdEntityEnable()) + { + if (sql?.StartsWith("INSERT ALL")==true) + { + return this.UseParameter().ExecuteCommand(); + } + else + { + sql = sql + " RETURNING ID INTO :newId01 "; + } + InsertBuilder.Parameters.Add(new SugarParameter(":newId01", 0,true)); + } + RestoreMapping(); + 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 : GetSeqValue(GetSeqName()).ObjToInt(); + this.Context.Ado.IsDisableMasterSlaveSeparation = isDisableMasterSlaveSeparation; + After(sql,result); + AutoEnd(oldIsAuto); + if (isIdEntityEnable()) + { + return this.InsertBuilder.Parameters.FirstOrDefault(it => it.ParameterName == ":newId01")?.Value?.ObjToInt()??0; + } + return result; + } + private bool isIdEntityEnable() + { + return this.Context.CurrentConnectionConfig?.MoreSettings?.EnableOracleIdentity == true; + } + + public override long ExecuteReturnBigIdentity() + { + bool oldIsAuto = AutoBegin(); + + InsertBuilder.IsReturnIdentity = true; + PreToSql(); + string sql = InsertBuilder.ToSqlString(); + if (isIdEntityEnable()) + { + if (sql?.StartsWith("INSERT ALL") == true) + { + return this.UseParameter().ExecuteCommand(); + } + else + { + sql = sql + " RETURNING ID INTO :newId01 "; + } + InsertBuilder.Parameters.Add(new SugarParameter(":newId01", Convert.ToInt64(0), true)); + } + RestoreMapping(); + 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())); + this.Context.Ado.IsDisableMasterSlaveSeparation = isDisableMasterSlaveSeparation; + After(sql, result); + AutoEnd(oldIsAuto); + if (isIdEntityEnable()) + { + return this.InsertBuilder.Parameters.FirstOrDefault(it => it.ParameterName == ":newId01")?.Value?.ObjToLong() ?? 0; + } + return result; + } + + public async override Task ExecuteReturnIdentityAsync() + { + bool oldIsAuto = AutoBegin(); + + InsertBuilder.IsReturnIdentity = true; + PreToSql(); + string sql = InsertBuilder.ToSqlString(); + if (isIdEntityEnable()) + { + if (sql?.StartsWith("INSERT ALL") == true) + { + return await this.UseParameter().ExecuteCommandAsync(); + } + else + { + sql = sql + " RETURNING ID INTO :newId01 "; + } + InsertBuilder.Parameters.Add(new SugarParameter(":newId01", 0, true)); + } + 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; + After(sql, result); + AutoEnd(oldIsAuto); + if (isIdEntityEnable()) + { + return this.InsertBuilder.Parameters.FirstOrDefault(it => it.ParameterName == ":newId01")?.Value?.ObjToInt() ?? 0; + } + return result; + } + + public async override Task ExecuteReturnBigIdentityAsync() + { + bool oldIsAuto = AutoBegin(); + + InsertBuilder.IsReturnIdentity = true; + PreToSql(); + string sql = InsertBuilder.ToSqlString(); + if (isIdEntityEnable()) + { + if (sql?.StartsWith("INSERT ALL") == true) + { + return await this.UseParameter().ExecuteCommandAsync(); + } + else + { + sql = sql + " RETURNING ID INTO :newId01 "; + } + InsertBuilder.Parameters.Add(new SugarParameter(":newId01", Convert.ToInt64(0), true)); + } + 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; + After(sql, result); + AutoEnd(oldIsAuto); + if (isIdEntityEnable()) + { + return this.InsertBuilder.Parameters.FirstOrDefault(it => it.ParameterName == ":newId01")?.Value?.ObjToLong() ?? 0; + } + 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) + { + return Ado.GetScalar(" SELECT " + seqName + ".currval FROM DUAL"); + } + protected override void PreToSql() + { + var identities = GetSeqNames(); + var insertCount = InsertObjs.Count(); + InsertBuilder.OracleSeqInfoList = new Dictionary(); + if ((identities.HasValue() && insertCount > 1)|| InsertBuilder.IsBlukCopy) + { + Check.Exception(identities.Count != identities.Distinct().Count(), "The field sequence needs to be unique"); + foreach (var seqName in identities) + { + int seqBeginValue = 0; + seqBeginValue = this.Ado.GetInt("select " + seqName + ".Nextval from dual"); + //Console.WriteLine(seqBeginValue); + var nextLength = insertCount - 1; + if (nextLength > 0) + { + StringBuilder sb = new StringBuilder(); + sb.AppendLine(" select " + seqName + ".nextval,t.* from ("); + for (int i = 0; i < nextLength; i++) + { + sb.AppendLine(" select 1 from dual"); + if (i < (nextLength - 1)) + { + sb.AppendLine("union all"); + } + } + sb.AppendLine(" )t"); + this.Ado.SqlQuery(sb.ToString()); + } + InsertBuilder.OracleSeqInfoList.Add(seqName, seqBeginValue); + } + } + base.PreToSql(); + } + } +} diff --git a/Src/Asp.NetCore2/SqlSugar.OceanBaseForOracle/OceanBase/Updateable/OceanBaseForOracleUpdateable.cs b/Src/Asp.NetCore2/SqlSugar.OceanBaseForOracle/OceanBase/Updateable/OceanBaseForOracleUpdateable.cs new file mode 100644 index 000000000..6126974df --- /dev/null +++ b/Src/Asp.NetCore2/SqlSugar.OceanBaseForOracle/OceanBase/Updateable/OceanBaseForOracleUpdateable.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar.OceanBaseForOracle +{ + public class OceanBaseForOracleUpdateable : UpdateableProvider where T : class, new() + { + protected override List GetIdentityKeys() + { + return this.EntityInfo.Columns.Where(it => it.OracleSequenceName.HasValue()).Select(it => it.DbColumnName).ToList(); + } + public override int ExecuteCommand() + { + if (base.UpdateObjs.Count() == 1) + { + var resultl= base.ExecuteCommand(); + if (resultl == -1) + { + return 1; + } + else + { + return resultl; + } + } + else if (base.UpdateObjs.Count() == 0) + { + return 0; + } + else + { + base.ExecuteCommand(); + return base.UpdateObjs.Count(); + } + } + public async override Task ExecuteCommandAsync() + { + if (base.UpdateObjs.Count() == 1) + { + var result= await base.ExecuteCommandAsync(); + if (result == -1) + { + return 1; + } + else + { + return result; + } + } + else if (base.UpdateObjs.Count() == 0) + { + return 0; + } + else + { + await base.ExecuteCommandAsync(); + return base.UpdateObjs.Count(); + } + } + } +} diff --git a/Src/Asp.NetCore2/SqlSugar.OceanBaseForOracle/Tools/UtilExtensions.cs b/Src/Asp.NetCore2/SqlSugar.OceanBaseForOracle/Tools/UtilExtensions.cs index 45162073a..92ef9ef8d 100644 --- a/Src/Asp.NetCore2/SqlSugar.OceanBaseForOracle/Tools/UtilExtensions.cs +++ b/Src/Asp.NetCore2/SqlSugar.OceanBaseForOracle/Tools/UtilExtensions.cs @@ -9,17 +9,6 @@ namespace SqlSugar.OceanBaseForOracle /// public static class UtilExtensions { - public static bool EqualCase(this string thisValue, string equalValue) - { - if (thisValue != null && equalValue != null) - { - return thisValue.ToLower() == equalValue.ToLower(); - } - else - { - return thisValue == equalValue; - } - } public static string ToLower(this string value, bool isLower) { if (isLower) @@ -28,116 +17,6 @@ namespace SqlSugar.OceanBaseForOracle } return value.ObjToString(); } - public static int ObjToInt(this object thisValue) - { - int reval = 0; - if (thisValue == null) return 0; - if (thisValue is Enum) - { - return (int)thisValue; - } - if (thisValue != null && thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out reval)) - { - return reval; - } - return reval; - } - - public static int ObjToInt(this object thisValue, int errorValue) - { - int reval = 0; - if (thisValue is Enum) - { - return (int)thisValue; - } - if (thisValue != null && thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out reval)) - { - return reval; - } - return errorValue; - } - - public static double ObjToMoney(this object thisValue) - { - double reval = 0; - if (thisValue != null && thisValue != DBNull.Value && double.TryParse(thisValue.ToString(), out reval)) - { - return reval; - } - return 0; - } - - public static double ObjToMoney(this object thisValue, double errorValue) - { - double reval = 0; - if (thisValue != null && thisValue != DBNull.Value && double.TryParse(thisValue.ToString(), out reval)) - { - return reval; - } - return errorValue; - } - - public static string ObjToString(this object thisValue) - { - if (thisValue != null) return thisValue.ToString().Trim(); - return ""; - } - - public static string ObjToString(this object thisValue, string errorValue) - { - if (thisValue != null) return thisValue.ToString().Trim(); - return errorValue; - } - - public static Decimal ObjToDecimal(this object thisValue) - { - Decimal reval = 0; - if (thisValue != null && thisValue != DBNull.Value && decimal.TryParse(thisValue.ToString(), out reval)) - { - return reval; - } - return 0; - } - - public static Decimal ObjToDecimal(this object thisValue, decimal errorValue) - { - Decimal reval = 0; - if (thisValue != null && thisValue != DBNull.Value && decimal.TryParse(thisValue.ToString(), out reval)) - { - return reval; - } - return errorValue; - } - - public static DateTime ObjToDate(this object thisValue) - { - DateTime reval = DateTime.MinValue; - if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval)) - { - reval = Convert.ToDateTime(thisValue); - } - return reval; - } - - public static DateTime ObjToDate(this object thisValue, DateTime errorValue) - { - DateTime reval = DateTime.MinValue; - if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval)) - { - return reval; - } - return errorValue; - } - - public static bool ObjToBool(this object thisValue) - { - bool reval = false; - if (thisValue != null && thisValue != DBNull.Value && bool.TryParse(thisValue.ToString(), out reval)) - { - return reval; - } - return reval; - } public static string ToUpper(this string value, bool isAutoToUpper) { if (value == null) return null; diff --git a/Src/Asp.NetCore2/SqlSugar.OceanBaseForOracle/Utilities/UtilConvert.cs b/Src/Asp.NetCore2/SqlSugar.OceanBaseForOracle/Utilities/UtilConvert.cs new file mode 100644 index 000000000..fc1f2e3c1 --- /dev/null +++ b/Src/Asp.NetCore2/SqlSugar.OceanBaseForOracle/Utilities/UtilConvert.cs @@ -0,0 +1,192 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +namespace SqlSugar.OceanBaseForOracle +{ + internal static class UtilConvert + { + public static int ObjToInt(this object thisValue) + { + int reval = 0; + if (thisValue == null) return 0; + if (thisValue is Enum) + { + return Convert.ToInt32(thisValue); + } + if (thisValue != null && thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out reval)) + { + return reval; + } + return reval; + } + + public static long ObjToLong(this object thisValue) + { + long reval = 0; + if (thisValue == null) return 0; + if (thisValue is Enum) + { + return Convert.ToInt64(thisValue); + } + if (thisValue != null && thisValue != DBNull.Value && long.TryParse(thisValue.ToString(), out reval)) + { + return reval; + } + return reval; + } + + public static int ObjToInt(this object thisValue, int errorValue) + { + int reval = 0; + if (thisValue is Enum) + { + return (int)thisValue; + } + if (thisValue != null && thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out reval)) + { + return reval; + } + return errorValue; + } + + public static double ObjToMoney(this object thisValue) + { + double reval = 0; + if (thisValue != null && thisValue != DBNull.Value && double.TryParse(thisValue.ToString(), out reval)) + { + return reval; + } + return 0; + } + + public static double ObjToMoney(this object thisValue, double errorValue) + { + double reval = 0; + if (thisValue != null && thisValue != DBNull.Value && double.TryParse(thisValue.ToString(), out reval)) + { + return reval; + } + return errorValue; + } + public static bool EqualCase(this string thisValue,string equalValue) + { + if ( thisValue!=null && equalValue != null) + { + return thisValue.ToLower() == equalValue.ToLower(); + } + else + { + return thisValue == equalValue; + } + } + public static string ObjToString(this object thisValue,Func formatTime) + { + if (formatTime != null&&thisValue is DateTime) + { + var dt = Convert.ToDateTime(thisValue); + return formatTime(dt); + } + else + { + return thisValue.ObjToStringNoTrim(); + } + } + public static string ObjToString(this object thisValue) + { + if (thisValue != null) return thisValue.ToString().Trim(); + return ""; + } + public static string ObjToStringNoTrim(this object thisValue) + { + if (thisValue != null) return thisValue.ToString(); + return ""; + } + public static string ObjToStringNew(this object thisValue) + { + if (thisValue != null && thisValue is byte[]) + { + return string.Join("|",thisValue as byte[]); + } + if (thisValue != null) return thisValue.ToString().Trim(); + return ""; + } + + public static string ObjToString(this object thisValue, string errorValue) + { + if (thisValue != null) return thisValue.ToString().Trim(); + return errorValue; + } + + public static Decimal ObjToDecimal(this object thisValue) + { + Decimal reval = 0; + if (thisValue != null && thisValue != DBNull.Value && decimal.TryParse(thisValue.ToString(), out reval)) + { + return reval; + } + return 0; + } + + public static Decimal ObjToDecimal(this object thisValue, decimal errorValue) + { + Decimal reval = 0; + if (thisValue != null && thisValue != DBNull.Value && decimal.TryParse(thisValue.ToString(), out reval)) + { + return reval; + } + return errorValue; + } + + public static DateTime ObjToDate(this object thisValue) + { + if (thisValue is DateTime) + { + return (DateTime)thisValue; + } + DateTime reval = DateTime.MinValue; + if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval)) + { + reval = Convert.ToDateTime(thisValue); + } + return reval; + } + + public static DateTime ObjToDate(this object thisValue, DateTime errorValue) + { + if (thisValue is DateTime) + { + return (DateTime)thisValue; + } + DateTime reval = DateTime.MinValue; + if (thisValue != null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reval)) + { + return reval; + } + return errorValue; + } + + public static bool ObjToBool(this object thisValue) + { + bool reval = false; + if (thisValue != null && thisValue != DBNull.Value && bool.TryParse(thisValue.ToString(), out reval)) + { + return reval; + } + return reval; + } + + internal static MemberExpression ToMemberExpression(Expression parentIdExpression) + { + if (parentIdExpression is UnaryExpression) + { + return (parentIdExpression as UnaryExpression).Operand as MemberExpression; + } + else + { + return parentIdExpression as MemberExpression; + } + } + } +}