diff --git a/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs b/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs index cbc10f259..d390000cd 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs @@ -236,7 +236,7 @@ namespace SqlSugar method = getString; if (bindProperyTypeName == "guid") { - method = getConvertStringGuid; + method =isNullableType? getConvertStringGuid : getStringGuid; } break; case CSharpDataType.DateTime: diff --git a/Src/Asp.Net/SqlSugar/Realization/MySql/MySqlProvider.cs b/Src/Asp.Net/SqlSugar/Realization/MySql/MySqlProvider.cs index 5fbc0a717..978cd4190 100644 --- a/Src/Asp.Net/SqlSugar/Realization/MySql/MySqlProvider.cs +++ b/Src/Asp.Net/SqlSugar/Realization/MySql/MySqlProvider.cs @@ -34,7 +34,7 @@ namespace SqlSugar public override void BeginTran(string transactionName) { - ((MySqlConnection)this.Connection).BeginTransaction(); + base.BeginTran(); } /// /// Only SqlServer @@ -43,7 +43,7 @@ namespace SqlSugar /// public override void BeginTran(IsolationLevel iso, string transactionName) { - ((MySqlConnection)this.Connection).BeginTransaction(iso); + base.BeginTran(iso); } public override IDataAdapter GetAdapter() { diff --git a/Src/Asp.Net/SqlSugar/Realization/Oracle/CodeFirst/OracleCodeFirst.cs b/Src/Asp.Net/SqlSugar/Realization/Oracle/CodeFirst/OracleCodeFirst.cs new file mode 100644 index 000000000..d54c937a5 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Realization/Oracle/CodeFirst/OracleCodeFirst.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace SqlSugar +{ + public class OracleCodeFirst : CodeFirstProvider + { + } +} diff --git a/Src/Asp.Net/SqlSugar/Realization/Oracle/DbBind/OracleDbBind.cs b/Src/Asp.Net/SqlSugar/Realization/Oracle/DbBind/OracleDbBind.cs new file mode 100644 index 000000000..15a7e1609 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Realization/Oracle/DbBind/OracleDbBind.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +namespace SqlSugar +{ + public class OracleDbBind : DbBindProvider + { + public override List> MappingTypes + { + get + { + return new List>() + { + new KeyValuePair("int",CSharpDataType.@int), + new KeyValuePair("varchar",CSharpDataType.@string), + new KeyValuePair("nvarchar",CSharpDataType.@string), + new KeyValuePair("sql_variant",CSharpDataType.@string), + new KeyValuePair("text",CSharpDataType.@string), + new KeyValuePair("char",CSharpDataType.@string), + new KeyValuePair("ntext",CSharpDataType.@string), + new KeyValuePair("nchar",CSharpDataType.@string), + new KeyValuePair("bigint",CSharpDataType.@long), + new KeyValuePair("bit",CSharpDataType.@bool), + new KeyValuePair("datetime",CSharpDataType.DateTime), + new KeyValuePair("time",CSharpDataType.DateTime), + new KeyValuePair("smalldatetime",CSharpDataType.DateTime), + new KeyValuePair("timestamp",CSharpDataType.DateTime), + new KeyValuePair("datetime2",CSharpDataType.DateTime), + new KeyValuePair("date",CSharpDataType.DateTime), + new KeyValuePair("decimal",CSharpDataType.@decimal), + new KeyValuePair("single",CSharpDataType.@decimal), + new KeyValuePair("money",CSharpDataType.@decimal), + new KeyValuePair("numeric",CSharpDataType.@decimal), + new KeyValuePair("smallmoney",CSharpDataType.@decimal), + new KeyValuePair("float",CSharpDataType.@double), + new KeyValuePair("real",CSharpDataType.@float), + new KeyValuePair("smallint",CSharpDataType.@short), + new KeyValuePair("tinyint",CSharpDataType.@byte), + new KeyValuePair("uniqueidentifier",CSharpDataType.Guid), + new KeyValuePair("binary",CSharpDataType.byteArray), + new KeyValuePair("image",CSharpDataType.byteArray), + new KeyValuePair("varbinary",CSharpDataType.byteArray)}; + } + } + } +} diff --git a/Src/Asp.Net/SqlSugar/Realization/Oracle/DbFirst/OracleDbFirst.cs b/Src/Asp.Net/SqlSugar/Realization/Oracle/DbFirst/OracleDbFirst.cs new file mode 100644 index 000000000..f58fefb4e --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Realization/Oracle/DbFirst/OracleDbFirst.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace SqlSugar +{ + public class OracleDbFirst : DbFirstProvider + { + } +} diff --git a/Src/Asp.Net/SqlSugar/Realization/Oracle/DbMaintenance/OracleDbMaintenance.cs b/Src/Asp.Net/SqlSugar/Realization/Oracle/DbMaintenance/OracleDbMaintenance.cs new file mode 100644 index 000000000..a8fbf80f9 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Realization/Oracle/DbMaintenance/OracleDbMaintenance.cs @@ -0,0 +1,205 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace SqlSugar +{ + public class OracleDbMaintenance : DbMaintenanceProvider + { + #region DML + protected override string GetColumnInfosByTableNameSql + { + get + { + string sql = @"SELECT Sysobjects.name AS TableName, + syscolumns.Id AS TableId, + syscolumns.name AS DbColumnName, + systypes.name AS DataType, + syscolumns.length AS [Length], + sys.extended_properties.[value] AS [ColumnDescription], + syscomments.text AS DefaultValue, + syscolumns.isnullable AS IsNullable, + columnproperty(syscolumns.id,syscolumns.name,'IsIdentity')as IsIdentity, + (CASE + WHEN EXISTS + ( + select 1 + from sysindexes i + join sysindexkeys k on i.id = k.id and i.indid = k.indid + join sysobjects o on i.id = o.id + join syscolumns c on i.id=c.id and k.colid = c.colid + where o.xtype = 'U' + and exists(select 1 from sysobjects where xtype = 'PK' and name = i.name) + and o.name=sysobjects.name and c.name=syscolumns.name + ) THEN 1 + ELSE 0 + END) AS IsPrimaryKey + FROM syscolumns + INNER JOIN systypes ON syscolumns.xtype = systypes.xtype + LEFT JOIN sysobjects ON syscolumns.id = sysobjects.id + LEFT OUTER JOIN sys.extended_properties ON (sys.extended_properties.minor_id = syscolumns.colid + AND sys.extended_properties.major_id = syscolumns.id) + LEFT OUTER JOIN syscomments ON syscolumns.cdefault = syscomments.id + WHERE syscolumns.id IN + (SELECT id + FROM sysobjects + WHERE xtype IN('u', + 'v') ) + AND (systypes.name <> 'sysname') + AND sysobjects.name='{0}' + AND systypes.name<>'geometry' + AND systypes.name<>'geography' + ORDER BY syscolumns.colid"; + return sql; + } + } + protected override string GetTableInfoListSql + { + get + { + return @"SELECT s.Name,Convert(varchar(max),tbp.value) as Description + FROM sysobjects s + LEFT JOIN sys.extended_properties as tbp ON s.id=tbp.major_id and tbp.minor_id=0 WHERE s.xtype IN('U') AND (tbp.Name='MS_Description' OR tbp.Name is null)"; + } + } + protected override string GetViewInfoListSql + { + get + { + return @"SELECT s.Name,Convert(varchar(max),tbp.value) as Description + FROM sysobjects s + LEFT JOIN sys.extended_properties as tbp ON s.id=tbp.major_id and tbp.minor_id=0 WHERE s.xtype IN('V') AND (tbp.Name='MS_Description' OR tbp.Name is null)"; + } + } + #endregion + + #region DDL + protected override string AddPrimaryKeySql + { + get + { + return "ALTER TABLE {0} ADD CONSTRAINT {1} PRIMARY KEY({2})"; + } + } + protected override string AddColumnToTableSql + { + get + { + return "ALTER TABLE {0} ADD {1} {2}{3} {4} {5} {6}"; + } + } + protected override string AlterColumnToTableSql + { + get + { + return "ALTER TABLE {0} ALTER COLUMN {1} {2}{3} {4} {5} {6}"; + } + } + protected override string BackupDataBaseSql + { + get + { + return @"USE master;BACKUP DATABASE {0} TO disk = '{1}'"; + } + } + protected override string CreateTableSql + { + get + { + return "CREATE TABLE {0}(\r\n{1})"; + } + } + protected override string CreateTableColumn + { + get + { + return "{0} {1}{2} {3} {4} {5}"; + } + } + protected override string TruncateTableSql + { + get + { + return "TRUNCATE TABLE {0}"; + } + } + protected override string BackupTableSql + { + get + { + return "SELECT TOP {0} * INTO {1} FROM {2}"; + } + } + protected override string DropTableSql + { + get + { + return "DROP TABLE {0}"; + } + } + protected override string DropColumnToTableSql + { + get + { + return "ALTER TABLE {0} DROP COLUMN {1}"; + } + } + protected override string DropConstraintSql + { + get + { + return "ALTER TABLE {0} DROP CONSTRAINT {1}"; + } + } + protected override string RenameColumnSql + { + get + { + return "exec sp_rename '{0}.{1}','{2}','column';"; + } + } + #endregion + + #region Check + protected override string CheckSystemTablePermissionsSql + { + get + { + return "select top 1 id from sysobjects"; + } + } + #endregion + + #region Scattered + protected override string CreateTableNull + { + get + { + return "NULL"; + } + } + protected override string CreateTableNotNull + { + get + { + return "NOT NULL"; + } + } + protected override string CreateTablePirmaryKey + { + get + { + return "PRIMARY KEY"; + } + } + protected override string CreateTableIdentity + { + get + { + return "IDENTITY(1,1)"; + } + } + #endregion + } +} diff --git a/Src/Asp.Net/SqlSugar/Realization/Oracle/OracleProvider.cs b/Src/Asp.Net/SqlSugar/Realization/Oracle/OracleProvider.cs new file mode 100644 index 000000000..a00f3528f --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Realization/Oracle/OracleProvider.cs @@ -0,0 +1,103 @@ +using Oracle.ManagedDataAccess.Client; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.SqlClient; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +namespace SqlSugar +{ + public class OracleProvider : AdoProvider + { + public OracleProvider() { } + public override IDbConnection Connection + { + get + { + if (base._DbConnection == null) + { + base._DbConnection = new OracleConnection(base.Context.CurrentConnectionConfig.ConnectionString); + } + return base._DbConnection; + } + set + { + base._DbConnection = value; + } + } + /// + /// Only SqlServer + /// + /// + public override void BeginTran(string transactionName) + { + ((OracleConnection)this.Connection).BeginTransaction(); + } + /// + /// Only SqlServer + /// + /// + /// + public override void BeginTran(IsolationLevel iso, string transactionName) + { + ((OracleConnection)this.Connection).BeginTransaction(iso); + } + public override IDataAdapter GetAdapter() + { + return new SqlDataAdapter(); + } + public override IDbCommand GetCommand(string sql, SugarParameter[] parameters) + { + OracleCommand sqlCommand = new OracleCommand(sql, (OracleConnection)this.Connection); + sqlCommand.CommandType = this.CommandType; + sqlCommand.CommandTimeout = this.CommandTimeOut; + if (this.Transaction != null) + { + sqlCommand.Transaction = (OracleTransaction)this.Transaction; + } + if (parameters.IsValuable()) + { + IDataParameter[] ipars = ToIDbDataParameter(parameters); + sqlCommand.Parameters.AddRange((OracleParameter[])ipars); + } + CheckConnection(); + return sqlCommand; + } + public override void SetCommandToAdapter(IDataAdapter dataAdapter, IDbCommand command) + { + ((OracleDataAdapter)dataAdapter).SelectCommand = (OracleCommand)command; + } + /// + /// if mysql return MySqlParameter[] pars + /// if sqlerver return SqlParameter[] pars ... + /// + /// + /// + public override IDataParameter[] ToIDbDataParameter(params SugarParameter[] parameters) + { + if (parameters == null || parameters.Length == 0) return null; + OracleParameter[] result = new OracleParameter[parameters.Length]; + int index = 0; + foreach (var parameter in parameters) + { + if (parameter.Value == null) parameter.Value = DBNull.Value; + var sqlParameter = new OracleParameter(); + sqlParameter.ParameterName = parameter.ParameterName; + sqlParameter.UdtTypeName = parameter.UdtTypeName; + sqlParameter.Size = parameter.Size; + sqlParameter.Value = parameter.Value; + sqlParameter.DbType = parameter.DbType; + sqlParameter.Direction = parameter.Direction; + result[index] = sqlParameter; + if (sqlParameter.Direction == ParameterDirection.Output) { + if (this.OutputParameters == null) this.OutputParameters = new List(); + this.OutputParameters.RemoveAll(it => it.ParameterName == sqlParameter.ParameterName); + this.OutputParameters.Add(sqlParameter); + } + ++index; + } + return result; + } + } +} diff --git a/Src/Asp.Net/SqlSugar/Realization/Oracle/Queryable/OracleQueryable.cs b/Src/Asp.Net/SqlSugar/Realization/Oracle/Queryable/OracleQueryable.cs new file mode 100644 index 000000000..ef832c8f8 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Realization/Oracle/Queryable/OracleQueryable.cs @@ -0,0 +1,45 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; + +namespace SqlSugar +{ + public class OracleQueryable : QueryableProvider + { + public override ISugarQueryable With(string withString) + { + return this; + } + } + public class OracleQueryable : QueryableProvider + { + + } + public class OracleQueryable : QueryableProvider + { + + } + public class OracleQueryable : QueryableProvider + { + + } + public class OracleQueryable : QueryableProvider + { + + } + public class OracleQueryable : QueryableProvider + { + + } + public class OracleQueryable : QueryableProvider + { + + } + public class OracleQueryable : QueryableProvider + { + + } +} diff --git a/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleBuilder.cs b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleBuilder.cs new file mode 100644 index 000000000..2c497ca5b --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleBuilder.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public class OracleBuilder : SqlBuilderProvider + { + public override string GetTranslationTableName(string name) + { + Check.ArgumentNullException(name, string.Format(ErrorMessage.ObjNotExist, "Table Name")); + var context = this.Context; + var mappingInfo = context + .MappingTables + .FirstOrDefault(it => it.EntityName.Equals(name, StringComparison.CurrentCultureIgnoreCase)); + name = (mappingInfo == null ? name : mappingInfo.DbTableName); + if (name.Contains("[")) + return name; + else + return "[" + name + "]"; + } + public override string GetTranslationColumnName(string entityName, string propertyName) + { + Check.ArgumentNullException(entityName, string.Format(ErrorMessage.ObjNotExist, "Table Name")); + Check.ArgumentNullException(propertyName, string.Format(ErrorMessage.ObjNotExist, "Column Name")); + var context = this.Context; + var mappingInfo = context + .MappingColumns + .FirstOrDefault(it => + it.EntityName.Equals(entityName, StringComparison.CurrentCultureIgnoreCase) && + it.PropertyName.Equals(propertyName, StringComparison.CurrentCultureIgnoreCase)); + return (mappingInfo == null ? "[" + propertyName + "]" : "[" + mappingInfo.DbColumnName + "]"); + } + + public override string GetTranslationColumnName(string propertyName) + { + if (propertyName.Contains("[")) return propertyName; + else + return "[" + propertyName + "]"; + } + + public override string GetNoTranslationColumnName(string name) + { + if (!name.Contains("[")) return name; + return name == null ? string.Empty : Regex.Match(name, @".*\[(.*?)\]").Groups[1].Value; + } + } +} diff --git a/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleDeleteBuilder.cs b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleDeleteBuilder.cs new file mode 100644 index 000000000..504d0befa --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleDeleteBuilder.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public class OracleDeleteBuilder : DeleteBuilder + { + + } +} diff --git a/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleExpressionContext.cs b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleExpressionContext.cs new file mode 100644 index 000000000..1744f67f4 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleExpressionContext.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public partial class OracleExpressionContext : ExpressionContext, ILambdaExpressions + { + public SqlSugarClient Context { get; set; } + public OracleExpressionContext() + { + base.DbMehtods = new SqlServerMethod(); + } + + } + public partial class SqlServerMethod : DefaultDbMethod, IDbMethods + { + + } +} diff --git a/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleInsertBuilder.cs b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleInsertBuilder.cs new file mode 100644 index 000000000..36e75d746 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleInsertBuilder.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public class OracleInsertBuilder : InsertBuilder + { + } +} diff --git a/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleQueryBuilder.cs b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleQueryBuilder.cs new file mode 100644 index 000000000..dc4726cf4 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleQueryBuilder.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public class OracleQueryBuilder : QueryBuilder + { + public override string SqlTemplate + { + get + { + return "SELECT {0}{{$:OrderByString:$}} FROM {1}{2}{3}{4}"; + } + } + } +} diff --git a/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleUpdateBuilder.cs b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleUpdateBuilder.cs new file mode 100644 index 000000000..3e16302fd --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleUpdateBuilder.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public class OracleUpdateBuilder : UpdateBuilder + { + } +} diff --git a/Src/Asp.Net/SqlSugar/Realization/Sqlite/SqliteProvider.cs b/Src/Asp.Net/SqlSugar/Realization/Sqlite/SqliteProvider.cs index 394fe7a0a..73334e739 100644 --- a/Src/Asp.Net/SqlSugar/Realization/Sqlite/SqliteProvider.cs +++ b/Src/Asp.Net/SqlSugar/Realization/Sqlite/SqliteProvider.cs @@ -30,7 +30,7 @@ namespace SqlSugar public override void BeginTran(string transactionName) { - ((SQLiteConnection)this.Connection).BeginTransaction(); + base.BeginTran(); } /// /// Only SqlServer @@ -39,7 +39,7 @@ namespace SqlSugar /// public override void BeginTran(IsolationLevel iso, string transactionName) { - ((SQLiteConnection)this.Connection).BeginTransaction(iso); + base.BeginTran(iso); } public override IDataAdapter GetAdapter() { diff --git a/Src/Asp.Net/SqlSugar/References/Oracle.ManagedDataAccess.dll b/Src/Asp.Net/SqlSugar/References/Oracle.ManagedDataAccess.dll new file mode 100644 index 000000000..473ca83da Binary files /dev/null and b/Src/Asp.Net/SqlSugar/References/Oracle.ManagedDataAccess.dll differ diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index 3867a4af0..b39922f3d 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -39,6 +39,10 @@ False Lib\Newtonsoft.Json.dll + + False + References\Oracle.ManagedDataAccess.dll + @@ -71,6 +75,18 @@ + + + + + + + + + + + + @@ -207,10 +223,11 @@ + - +