From e285f1d14dcbe9a4d19d86897d638ba94c146f8c Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Tue, 20 Mar 2018 17:16:07 +0800 Subject: [PATCH] Upate core --- .../SqlSeverTest/OracleTest/Config.cs | 2 +- .../Abstract/AdoProvider/AdoProvider.cs | 2 +- .../DeleteProvider/DeleteableProvider.cs | 9 +- .../InsertableProvider/InsertableProvider.cs | 1 + .../ResolveItems/MemberExpressionResolve.cs | 19 ++- .../SqlSugar/Infrastructure/ContextMethods.cs | 3 + .../Infrastructure/DependencyManagement.cs | 4 +- .../SqlSugar/OnlyCore/DataExtensions.cs | 10 +- .../Realization/Oracle/DbBind/OracleDbBind.cs | 16 ++- .../DbMaintenance/OracleDbMaintenance.cs | 110 ++++++++++++------ .../Oracle/Insertable/OracleInsertable.cs | 19 ++- .../Realization/Oracle/OracleProvider.cs | 51 ++++++-- .../Oracle/SqlBuilder/OracleBuilder.cs | 7 ++ .../Oracle/SqlBuilder/OracleUpdateBuilder.cs | 2 +- .../Oracle/Updateable/OracleUpdateable.cs | 11 +- .../SqlSeverTest/SqlSugar/SqlSugar.csproj | 4 +- .../SqlSugar/SqlSugarForCore.nuspec | 2 +- .../SqliteTest/DataBase/SqlSugar4xTest.sqlite | Bin 274432 -> 282624 bytes 18 files changed, 200 insertions(+), 72 deletions(-) diff --git a/Src/Asp.NetCore2/SqlSeverTest/OracleTest/Config.cs b/Src/Asp.NetCore2/SqlSeverTest/OracleTest/Config.cs index dcdfe9e14..852739d7d 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/OracleTest/Config.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/OracleTest/Config.cs @@ -8,6 +8,6 @@ namespace OrmTest { public class Config { - public static string ConnectionString = "Data Source=kobato.meibu.net/orclpdb;User ID=sa;Password=123456;"; + public static string ConnectionString = "Data Source=SUNKAIXUAN.htinns.loc/ORCL;User ID=system;Password=manager;"; } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/AdoProvider/AdoProvider.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/AdoProvider/AdoProvider.cs index 787b2bcf6..41891ab39 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/AdoProvider/AdoProvider.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/AdoProvider/AdoProvider.cs @@ -653,7 +653,7 @@ namespace SqlSugar var hasParameter = parameters.HasValue(); if (hasParameter) { - foreach (var outputParameter in parameters.Where(it => it.Direction.IsIn(ParameterDirection.Output, ParameterDirection.InputOutput))) + foreach (var outputParameter in parameters.Where(it => it.Direction.IsIn(ParameterDirection.Output, ParameterDirection.InputOutput,ParameterDirection.ReturnValue))) { var gobalOutputParamter = this.OutputParameters.Single(it => it.ParameterName == outputParameter.ParameterName); outputParameter.Value = gobalOutputParamter.Value; diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs index 9a0714303..5ca27c5a0 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs @@ -121,7 +121,14 @@ namespace SqlSugar var entityPropertyName = this.Context.EntityMaintenance.GetPropertyName(primaryField); var columnInfo = EntityInfo.Columns.Single(it => it.PropertyName == entityPropertyName); var entityValue = columnInfo.PropertyInfo.GetValue(deleteObj, null); - andString.AppendFormat(DeleteBuilder.WhereInEqualTemplate, primaryField, entityValue); + if (this.Context.CurrentConnectionConfig.DbType == DbType.Oracle) + { + andString.AppendFormat(DeleteBuilder.WhereInEqualTemplate, primaryField.ToUpper(), entityValue); + } + else + { + andString.AppendFormat(DeleteBuilder.WhereInEqualTemplate, primaryField, entityValue); + } ++i; } orString.AppendFormat(DeleteBuilder.WhereInAreaTemplate, andString); diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs index 9f02593a7..79fd40639 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs @@ -266,6 +266,7 @@ namespace SqlSugar List insertItem = new List(); foreach (var column in EntityInfo.Columns) { + if (column.IsIgnore || column.IsOnlyIgnoreInsert) continue; var columnInfo = new DbColumnInfo() { Value = column.PropertyInfo.GetValue(item, null), diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MemberExpressionResolve.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MemberExpressionResolve.cs index 5caa0bbac..782126956 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MemberExpressionResolve.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/ExpressionsToSql/ResolveItems/MemberExpressionResolve.cs @@ -214,15 +214,24 @@ namespace SqlSugar parameter.CommonTempData = CommonTempDataType.Result; this.Expression = expression.Expression; var isConst = this.Expression is ConstantExpression; - this.Start(); - var result = this.Context.DbMehtods.DateValue(new MethodCallExpressionModel() + if (this.Expression.Type == UtilConstants.DateType && this.Expression.ToString() == "DateTime.Now") { - Args = new List() { + this.Expression = expression; + var parameterName=base.AppendParameter(ExpressionTool.GetMemberValue(expression.Member, expression)); + base.AppendMember(parameter, isLeft, parameterName); + } + else + { + this.Start(); + var result = this.Context.DbMehtods.DateValue(new MethodCallExpressionModel() + { + Args = new List() { new MethodCallExpressionArgs() { IsMember = !isConst, MemberName = parameter.CommonTempData, MemberValue = null }, new MethodCallExpressionArgs() { IsMember = true, MemberName = name, MemberValue = name } } - }); - base.AppendMember(parameter, isLeft, result); + }); + base.AppendMember(parameter, isLeft, result); + } parameter.CommonTempData = oldCommonTempDate; } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/ContextMethods.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/ContextMethods.cs index 4e066d790..9dd134071 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/ContextMethods.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/ContextMethods.cs @@ -213,6 +213,9 @@ namespace SqlSugar var addItem = readerValues[info]; if (addItem == DBNull.Value) addItem = null; + if (prop.PropertyType == UtilConstants.IntType) { + addItem = addItem.ObjToInt(); + } result.Add(name, addItem); } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/DependencyManagement.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/DependencyManagement.cs index 07f476277..c05280517 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/DependencyManagement.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Infrastructure/DependencyManagement.cs @@ -63,8 +63,8 @@ namespace SqlSugar catch { var message = ErrorMessage.GetThrowMessage( - "You need to refer to Oracle.ManagedDataAccess.dll", - "Oracle .NET Core官方驱动还没发布,暂不支持Oracle"); + "You need to refer to Oracle.ManagedDataAccess.Core", + "你需要引用 Oracle.ManagedDataAccess.Core"); throw new Exception(message); } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/OnlyCore/DataExtensions.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/OnlyCore/DataExtensions.cs index 3167fd199..e436c3bc8 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/OnlyCore/DataExtensions.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/OnlyCore/DataExtensions.cs @@ -1,9 +1,9 @@ using Microsoft.Data.Sqlite; using MySql.Data.MySqlClient; +using Oracle.ManagedDataAccess.Client; using System; using System.Collections; using System.Collections.Generic; -using System.Data.OracleClient; using System.Data.SqlClient; using System.Linq; using System.Threading.Tasks; @@ -784,7 +784,7 @@ namespace SqlSugar /// /// 数据填充器 /// - public class OracleDataAdapter : IDataAdapter + public class MyOracleDataAdapter : IDataAdapter { private OracleCommand command; private string sql; @@ -794,12 +794,12 @@ namespace SqlSugar /// SqlDataAdapter /// /// - public OracleDataAdapter(OracleCommand command) + public MyOracleDataAdapter(OracleCommand command) { this.command = command; } - public OracleDataAdapter() + public MyOracleDataAdapter() { } @@ -809,7 +809,7 @@ namespace SqlSugar /// /// /// - public OracleDataAdapter(string sql, OracleConnection _sqlConnection) + public MyOracleDataAdapter(string sql, OracleConnection _sqlConnection) { this.sql = sql; this._sqlConnection = _sqlConnection; diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/DbBind/OracleDbBind.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/DbBind/OracleDbBind.cs index 78010f067..7d0d62cd3 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/DbBind/OracleDbBind.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/DbBind/OracleDbBind.cs @@ -52,7 +52,18 @@ namespace SqlSugar { get { - return new List>() + var extService = this.Context.CurrentConnectionConfig.ConfigureExternalServices; + if (extService != null && extService.AppendDataReaderTypeMappings.HasValue()) + { + return extService.AppendDataReaderTypeMappings.Union(MappingTypesConst).ToList(); + } + else + { + return MappingTypesConst; + } + } + } + public static List> MappingTypesConst = new List>() { new KeyValuePair("int",CSharpDataType.@int), new KeyValuePair("integer",CSharpDataType.@int), @@ -94,9 +105,6 @@ namespace SqlSugar new KeyValuePair("raw",CSharpDataType.byteArray), new KeyValuePair("bfile",CSharpDataType.byteArray), new KeyValuePair("varbinary",CSharpDataType.byteArray) }; - - } - } public override List StringThrow { get diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/DbMaintenance/OracleDbMaintenance.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/DbMaintenance/OracleDbMaintenance.cs index 203aeecf6..9c1a5d9e6 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/DbMaintenance/OracleDbMaintenance.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/DbMaintenance/OracleDbMaintenance.cs @@ -169,51 +169,55 @@ namespace SqlSugar return "IDENTITY(1,1)"; } } - - public override bool CreateTable(string tableName, List columns, bool isCreatePrimaryKey = true) - { - throw new NotImplementedException(); - } #endregion #region Methods - public override List GetColumnInfosByTableName(string tableName,bool isCache) + public override List GetColumnInfosByTableName(string tableName,bool isCache=true) { string cacheKey = "DbMaintenanceProvider.GetColumnInfosByTableName." + this.SqlBuilder.GetNoTranslationColumnName(tableName).ToLower(); cacheKey = GetCacheKey(cacheKey); + if (!isCache) + return GetColumnInfosByTableName(tableName); + else return this.Context.Utilities.GetReflectionInoCacheInstance().GetOrCreate(cacheKey, () => { - string sql = "select * from " + tableName + " WHERE 1=2 "; - var oldIsEnableLog = this.Context.Ado.IsEnableLogEvent; - this.Context.Ado.IsEnableLogEvent = false; - using (DbDataReader reader = (DbDataReader)this.Context.Ado.GetDataReader(sql)) - { - this.Context.Ado.IsEnableLogEvent = oldIsEnableLog; - List result = new List(); - var schemaTable = reader.GetSchemaTable(); - foreach (DataRow row in schemaTable.Rows) - { - DbColumnInfo column = new DbColumnInfo() - { - TableName = tableName, - DataType = row["DataType"].ToString().Replace("System.", "").Trim(), - IsNullable = (bool)row["AllowDBNull"], - //IsIdentity = (bool)row["IsAutoIncrement"], - ColumnDescription = null, - DbColumnName = row["ColumnName"].ToString(), - //DefaultValue = row["defaultValue"].ToString(), - IsPrimarykey = GetPrimaryKeyByTableNames(tableName).Any(it=>it.Equals(row["ColumnName"].ToString(), StringComparison.CurrentCultureIgnoreCase)), - Length = row["ColumnSize"].ObjToInt(), - Scale = row["numericscale"].ObjToInt() - }; - result.Add(column); - } - return result; - } + return GetColumnInfosByTableName(tableName); }); } + + private List GetColumnInfosByTableName(string tableName) + { + string sql = "select * from " + tableName + " WHERE 1=2 "; + var oldIsEnableLog = this.Context.Ado.IsEnableLogEvent; + this.Context.Ado.IsEnableLogEvent = false; + using (DbDataReader reader = (DbDataReader)this.Context.Ado.GetDataReader(sql)) + { + this.Context.Ado.IsEnableLogEvent = oldIsEnableLog; + List result = new List(); + var schemaTable = reader.GetSchemaTable(); + foreach (System.Data.DataRow row in schemaTable.Rows) + { + DbColumnInfo column = new DbColumnInfo() + { + TableName = tableName, + DataType = row["DataType"].ToString().Replace("System.", "").Trim(), + IsNullable = (bool)row["AllowDBNull"], + //IsIdentity = (bool)row["IsAutoIncrement"], + ColumnDescription = GetFieldComment(tableName, row["ColumnName"].ToString()), + DbColumnName = row["ColumnName"].ToString(), + //DefaultValue = row["defaultValue"].ToString(), + IsPrimarykey = GetPrimaryKeyByTableNames(tableName).Any(it => it.Equals(row["ColumnName"].ToString(), StringComparison.CurrentCultureIgnoreCase)), + Length = row["ColumnSize"].ObjToInt(), + Scale = row["numericscale"].ObjToInt() + }; + result.Add(column); + } + return result; + } + } + private List GetPrimaryKeyByTableNames(string tableName) { string cacheKey = "DbMaintenanceProvider.GetPrimaryKeyByTableNames." + this.SqlBuilder.GetNoTranslationColumnName(tableName).ToLower(); @@ -225,12 +229,50 @@ namespace SqlSugar 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()+ @"'"; + 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; }); } + + 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; + }); + return comments.HasValue() ? comments.First() : ""; + } + + public string GetFieldComment(string tableName, string filedName) + { + string cacheKey = "DbMaintenanceProvider.GetFieldComment." + tableName; + var comments = this.Context.Utilities.GetReflectionInoCacheInstance().GetOrCreate(cacheKey, + () => + { + string sql = "SELECT TABLE_NAME AS TableName, COLUMN_NAME AS DbColumnName,COMMENTS AS ColumnDescription FROM user_col_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(it=>it.DbColumnName.Equals(filedName,StringComparison.CurrentCultureIgnoreCase)).ColumnDescription : ""; + + } + + public override bool CreateTable(string tableName, List columns, bool isCreatePrimaryKey = true) + { + throw new NotImplementedException(); + } #endregion } } 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 ee8f37a10..05dbb222d 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/Insertable/OracleInsertable.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/Insertable/OracleInsertable.cs @@ -27,21 +27,32 @@ namespace SqlSugar string sql = InsertBuilder.ToSqlString(); RestoreMapping(); var count = Ado.ExecuteCommand(sql, InsertBuilder.Parameters == null ? null : InsertBuilder.Parameters.ToArray()); - var result = (this.GetIdentityKeys().IsNullOrEmpty() || count == 0) ? 0 : GetSeqValue(GetSeqName()); + var result = (this.GetIdentityKeys().IsNullOrEmpty() || count == 0) ? 0 : GetSeqValue(GetSeqName()).ObjToInt(); return result; } + public override long ExecuteReturnBigIdentity() + { + InsertBuilder.IsReturnIdentity = true; + PreToSql(); + string sql = InsertBuilder.ToSqlString(); + RestoreMapping(); + var count = Ado.ExecuteCommand(sql, InsertBuilder.Parameters == null ? null : InsertBuilder.Parameters.ToArray()); + var result = (this.GetIdentityKeys().IsNullOrEmpty() || count == 0) ? 0 :Convert.ToInt64(GetSeqValue(GetSeqName())); + return result; + } + + public override int ExecuteCommand() { base.ExecuteCommand(); return base.InsertObjs.Count(); } - private int GetSeqValue(string seqName) + private object GetSeqValue(string seqName) { - return Ado.GetInt(" SELECT " + seqName + ".currval FROM DUAL"); + return Ado.GetScalar(" SELECT " + seqName + ".currval FROM DUAL"); } - protected override void PreToSql() { var identities = GetSeqNames(); diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/OracleProvider.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/OracleProvider.cs index f54b77f75..59e338b77 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/OracleProvider.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/OracleProvider.cs @@ -1,16 +1,34 @@ -using System; +using Oracle.ManagedDataAccess.Client; +using System; using System.Collections.Generic; using System.Data; -using System.Data.OracleClient; using System.Data.SqlClient; using System.Linq; using System.Text; +using System.Text.RegularExpressions; using System.Threading.Tasks; namespace SqlSugar { public class OracleProvider : AdoProvider { - public OracleProvider() { } + public OracleProvider() + { + this.FormatSql = sql => + { + if (sql.HasValue()&&sql.Contains("@")) { + var exceptionalCaseInfo = Regex.Matches(sql,@"\'.*?\@.*?\'| \w+\@\w+ "); + if (exceptionalCaseInfo != null) { + foreach (var item in exceptionalCaseInfo.Cast()) + { + sql = sql.Replace(item.Value, item.Value.Replace("@", UtilConstants.ReplaceKey)); + } + } + sql = sql .Replace("@",":"); + sql = sql.Replace(UtilConstants.ReplaceKey, "@"); + } + return sql; + }; + } public override string SqlParameterKeyWord { get @@ -24,7 +42,6 @@ namespace SqlSugar { try { - throw new NotSupportedException("NET Core 2.0 Oracle official driver has not yet, please wait"); if (base._DbConnection == null) { base._DbConnection = new OracleConnection(base.Context.CurrentConnectionConfig.ConnectionString); @@ -61,11 +78,12 @@ namespace SqlSugar } public override IDataAdapter GetAdapter() { - return new OracleDataAdapter(); + return new MyOracleDataAdapter(); } public override IDbCommand GetCommand(string sql, SugarParameter[] parameters) { OracleCommand sqlCommand = new OracleCommand(sql, (OracleConnection)this.Connection); + sqlCommand.BindByName = true; sqlCommand.CommandType = this.CommandType; sqlCommand.CommandTimeout = this.CommandTimeOut; if (this.Transaction != null) @@ -82,7 +100,7 @@ namespace SqlSugar } public override void SetCommandToAdapter(IDataAdapter dataAdapter, IDbCommand command) { - ((OracleDataAdapter)dataAdapter).SelectCommand = (OracleCommand)command; + ((MyOracleDataAdapter)dataAdapter).SelectCommand = (OracleCommand)command; } /// /// if mysql return MySqlParameter[] pars @@ -100,7 +118,7 @@ namespace SqlSugar if (parameter.Value == null) parameter.Value = DBNull.Value; var sqlParameter = new OracleParameter(); sqlParameter.Size = parameter.Size == -1 ? 0 : parameter.Size; - sqlParameter.ParameterName = parameter.ParameterName.ToLower(); + sqlParameter.ParameterName = parameter.ParameterName; if (sqlParameter.ParameterName[0] == '@') { sqlParameter.ParameterName = ':' + sqlParameter.ParameterName.Substring(1, sqlParameter.ParameterName.Length - 1); @@ -109,6 +127,10 @@ namespace SqlSugar { sqlParameter.ParameterName = sqlParameter.ParameterName.TrimStart(':'); } + if (parameter.IsRefCursor) + { + sqlParameter.OracleDbType = OracleDbType.RefCursor; + } if (sqlParameter.DbType == System.Data.DbType.Guid) { sqlParameter.DbType = System.Data.DbType.String; @@ -117,16 +139,27 @@ namespace SqlSugar else if (parameter.DbType == System.Data.DbType.Boolean) { sqlParameter.DbType = System.Data.DbType.Int16; - sqlParameter.Value = (bool)parameter.Value ? 1 : 0; + if (parameter.Value == DBNull.Value) + { + parameter.Value = 0; + } + else + { + sqlParameter.Value = (bool)parameter.Value ? 1 : 0; + } } else { + if (parameter.Value != null && parameter.Value.GetType() == UtilConstants.GuidType) + { + parameter.Value = parameter.Value.ToString(); + } sqlParameter.Value = parameter.Value; } if (parameter.Direction != 0) sqlParameter.Direction = parameter.Direction; result[index] = sqlParameter; - if (sqlParameter.Direction == ParameterDirection.Output) + if (sqlParameter.Direction.IsIn(ParameterDirection.Output, ParameterDirection.InputOutput,ParameterDirection.ReturnValue)) { if (this.OutputParameters == null) this.OutputParameters = new List(); this.OutputParameters.RemoveAll(it => it.ParameterName == sqlParameter.ParameterName); diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/SqlBuilder/OracleBuilder.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/SqlBuilder/OracleBuilder.cs index d2d062335..6a605dde5 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/SqlBuilder/OracleBuilder.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/SqlBuilder/OracleBuilder.cs @@ -23,6 +23,13 @@ namespace SqlSugar return "sysdate"; } } + public override string FullSqlDateNow + { + get + { + return "select sysdate from dual"; + } + } public override string SqlTranslationLeft { get { return "\""; } } public override string SqlTranslationRight { get { return "\""; } } public override string GetTranslationTableName(string name) diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/SqlBuilder/OracleUpdateBuilder.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/SqlBuilder/OracleUpdateBuilder.cs index ecb817b2f..b3955a613 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/SqlBuilder/OracleUpdateBuilder.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/SqlBuilder/OracleUpdateBuilder.cs @@ -25,7 +25,7 @@ namespace SqlSugar whereString += GetOracleUpdateColums(item); whereList.Add(whereString); } - return string.Format("{0} {1} WHERE {2};", updateTable, setValues, string.Join("AND",whereList)); + return string.Format("{0} {1} WHERE {2};", updateTable, setValues, string.Join("",whereList)); }).ToArray())); sb.AppendLine("End;"); return sb.ToString(); diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/Updateable/OracleUpdateable.cs b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/Updateable/OracleUpdateable.cs index 60b34b553..c8a985af7 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/Updateable/OracleUpdateable.cs +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/Realization/Oracle/Updateable/OracleUpdateable.cs @@ -13,8 +13,15 @@ namespace SqlSugar } public override int ExecuteCommand() { - base.ExecuteCommand(); - return base.UpdateObjs.Count(); + if (base.UpdateObjs.Count() == 1) + { + return base.ExecuteCommand(); + } + else + { + base.ExecuteCommand(); + return base.UpdateObjs.Count(); + } } } } diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugar.csproj b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugar.csproj index 9d37a8115..a93e98a5c 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugar.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 4.6.4.6 + 4.6.4.7 sun_kai_xuan https://github.com/sunkaixuan/SqlSugar @@ -12,9 +12,9 @@ - + diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugarForCore.nuspec b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugarForCore.nuspec index 0a67b7f54..e9eb24270 100644 --- a/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugarForCore.nuspec +++ b/Src/Asp.NetCore2/SqlSeverTest/SqlSugar/SqlSugarForCore.nuspec @@ -2,7 +2,7 @@ sqlSugarCore - 4.6.4.6 + 4.6.4.7 sunkaixuan Landa http://www.apache.org/licenses/LICENSE-2.0.html diff --git a/Src/Asp.NetCore2/SqlSeverTest/SqliteTest/DataBase/SqlSugar4xTest.sqlite b/Src/Asp.NetCore2/SqlSeverTest/SqliteTest/DataBase/SqlSugar4xTest.sqlite index b20300ec2cae5f9b608c741d4f9e1e943ccc7006..77e219d5d796a9f794832f10f52df0b444935bc9 100644 GIT binary patch literal 282624 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 QqyJ-kf2c?Q$F=(Z1qtG^O8@`> literal 274432 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%0DU}Ex%g+TKS1`y?k%^wsN`j52c@#&X>-VPM7|$ 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 HxK{r^@dim2