diff --git a/build/version.props b/build/version.props index 02ead273f..a1831e131 100644 --- a/build/version.props +++ b/build/version.props @@ -2,7 +2,7 @@ 7 1 - 68 + 70 $(VersionMajor).$(VersionMinor).$(VersionPatch) diff --git a/src/Util.Core/Helpers/Convert.cs b/src/Util.Core/Helpers/Convert.cs index 37ce66630..6011fb4b5 100644 --- a/src/Util.Core/Helpers/Convert.cs +++ b/src/Util.Core/Helpers/Convert.cs @@ -1,4 +1,4 @@ -namespace Util.Helpers; +namespace Util.Helpers; /// /// 类型转换 @@ -188,7 +188,7 @@ public static bool ToBool( object input ) { /// 输入值 public static bool? ToBoolOrNull( object input ) { var value = input.SafeString(); - switch ( value ) { + switch( value ) { case "1": return true; case "0": @@ -219,7 +219,7 @@ public static DateTime ToDateTime( object input ) { /// 输入值 public static DateTime? ToDateTimeOrNull( object input ) { var success = DateTime.TryParse( input.SafeString(), out var result ); - if ( success == false ) + if( success == false ) return null; return result; } @@ -245,6 +245,10 @@ public static Guid ToGuid( object input ) { /// /// 输入值 public static Guid? ToGuidOrNull( object input ) { + if( input == null ) + return null; + if( input.GetType() == typeof( byte[] ) ) + return new Guid( (byte[])input ); return Guid.TryParse( input.SafeString(), out var result ) ? result : null; } @@ -318,11 +322,11 @@ public static T To( object input ) { try { if( typeName == "STRING" || typeName == "GUID" ) return (T)TypeDescriptor.GetConverter( typeof( T ) ).ConvertFromInvariantString( input.ToString() ); - if ( type.IsEnum ) + if( type.IsEnum ) return Enum.Parse( input ); - if ( input is IConvertible ) + if( input is IConvertible ) return (T)System.Convert.ChangeType( input, type, CultureInfo.InvariantCulture ); - if ( input is JsonElement element ) { + if( input is JsonElement element ) { var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; return Json.ToObject( element.GetRawText(), options ); } @@ -343,11 +347,11 @@ public static T To( object input ) { /// 对象 public static IDictionary ToDictionary( object data ) { var result = new Dictionary(); - if ( data == null ) + if( data == null ) return result; - if ( data is IEnumerable> dic ) + if( data is IEnumerable> dic ) return new Dictionary( dic ); - foreach ( PropertyDescriptor property in TypeDescriptor.GetProperties( data ) ) { + foreach( PropertyDescriptor property in TypeDescriptor.GetProperties( data ) ) { var value = property.GetValue( data ); result.Add( property.Name, value ); } diff --git a/src/Util.Data.Core/DefaultDatabase.cs b/src/Util.Data.Core/DefaultDatabase.cs index 9f0f92683..04503a895 100644 --- a/src/Util.Data.Core/DefaultDatabase.cs +++ b/src/Util.Data.Core/DefaultDatabase.cs @@ -1,6 +1,4 @@ -using System.Data; - -namespace Util.Data; +namespace Util.Data; /// /// 数据库信息 diff --git a/src/Util.Data.Dapper.All/05-Util.Data.Dapper.All.csproj b/src/Util.Data.Dapper.All/06-Util.Data.Dapper.All.csproj similarity index 100% rename from src/Util.Data.Dapper.All/05-Util.Data.Dapper.All.csproj rename to src/Util.Data.Dapper.All/06-Util.Data.Dapper.All.csproj diff --git a/src/Util.Data.Dapper.Core/Sql/SqlQueryBase.cs b/src/Util.Data.Dapper.Core/Sql/SqlQueryBase.cs index 10e2d716b..9a2e3870c 100644 --- a/src/Util.Data.Dapper.Core/Sql/SqlQueryBase.cs +++ b/src/Util.Data.Dapper.Core/Sql/SqlQueryBase.cs @@ -163,7 +163,7 @@ protected DynamicParameters Params { get { _parameters = new DynamicParameters(); ParameterManager.GetParams().ToList().ForEach( t => _parameters.Add( t.Name, t.Value, t.DbType, t.Direction, t.Size, t.Precision, t.Scale ) ); - ParameterManager.GetDynamicParams().ToList().ForEach( p => _parameters.AddDynamicParams( p ) ); + ParameterManager.GetDynamicParams().ToList().ForEach( _parameters.AddDynamicParams ); return _parameters; } } diff --git a/src/Util.Data.Dapper.Oracle/05-Util.Data.Dapper.Oracle.csproj b/src/Util.Data.Dapper.Oracle/05-Util.Data.Dapper.Oracle.csproj new file mode 100644 index 000000000..1d9abe5b5 --- /dev/null +++ b/src/Util.Data.Dapper.Oracle/05-Util.Data.Dapper.Oracle.csproj @@ -0,0 +1,37 @@ + + + + $(NetTargetFramework) + icon.jpg + Util.Data.Dapper.Oracle + Util.Data.Dapper + Util.Data.Dapper.Oracle是Util应用框架基于Dapper的数据访问封装类库,用于处理Oracle数据库 + + + + + .\obj\Debug\$(NetTargetFramework)\Util.Data.Dapper.Oracle.xml + + + + + .\obj\Release\$(NetTargetFramework)\Util.Data.Dapper.Oracle.xml + + + + + True + False + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Util.Data.Dapper.Oracle/Infrastructure/OracleDapperServiceRegistrar.cs b/src/Util.Data.Dapper.Oracle/Infrastructure/OracleDapperServiceRegistrar.cs new file mode 100644 index 000000000..4499df56b --- /dev/null +++ b/src/Util.Data.Dapper.Oracle/Infrastructure/OracleDapperServiceRegistrar.cs @@ -0,0 +1,35 @@ +using Util.Data.Dapper.TypeHandlers; +using Util.Infrastructure; + +namespace Util.Data.Dapper.Infrastructure; + +/// +/// Oracle Dapper服务注册器 +/// +public class OracleDapperServiceRegistrar : IServiceRegistrar { + /// + /// 获取服务名 + /// + public static string ServiceName => "Util.Data.Dapper.Infrastructure.OracleDapperServiceRegistrar"; + + /// + /// 排序号 + /// + public int OrderId => 812; + + /// + /// 是否启用 + /// + public bool Enabled => ServiceRegistrarConfig.IsEnabled( ServiceName ); + + /// + /// 注册服务 + /// + /// 服务上下文 + public Action Register( ServiceContext serviceContext ) { + SqlMapper.RemoveTypeMap( typeof( Guid ) ); + SqlMapper.RemoveTypeMap( typeof( Guid? ) ); + SqlMapper.AddTypeHandler( typeof( Guid ), new GuidTypeHandler() ); + return null; + } +} \ No newline at end of file diff --git a/src/Util.Data.Dapper.Oracle/Infrastructure/ServiceRegistrarConfigExtensions.cs b/src/Util.Data.Dapper.Oracle/Infrastructure/ServiceRegistrarConfigExtensions.cs new file mode 100644 index 000000000..515a428d7 --- /dev/null +++ b/src/Util.Data.Dapper.Oracle/Infrastructure/ServiceRegistrarConfigExtensions.cs @@ -0,0 +1,26 @@ +using Util.Infrastructure; + +namespace Util.Data.Dapper.Infrastructure; + +/// +/// Oracle Dapper服务注册器配置扩展 +/// +public static class ServiceRegistrarConfigExtensions { + /// + /// 启用Oracle Dapper服务注册器 + /// + /// 服务注册器配置 + public static ServiceRegistrarConfig EnableOracleDapperServiceRegistrar( this ServiceRegistrarConfig config ) { + ServiceRegistrarConfig.Enable( OracleDapperServiceRegistrar.ServiceName ); + return config; + } + + /// + ///禁用Oracle Dapper服务注册器 + /// + /// 服务注册器配置 + public static ServiceRegistrarConfig DisableOracleDapperServiceRegistrar( this ServiceRegistrarConfig config ) { + ServiceRegistrarConfig.Disable( OracleDapperServiceRegistrar.ServiceName ); + return config; + } +} \ No newline at end of file diff --git a/src/Util.Data.Dapper.Oracle/Sql/AppBuilderExtensions.cs b/src/Util.Data.Dapper.Oracle/Sql/AppBuilderExtensions.cs new file mode 100644 index 000000000..42595f067 --- /dev/null +++ b/src/Util.Data.Dapper.Oracle/Sql/AppBuilderExtensions.cs @@ -0,0 +1,127 @@ +using Util.Configs; +using Util.Data.Sql; + +namespace Util.Data.Dapper.Sql; + +/// +/// Oracle数据库操作扩展 +/// +public static class AppBuilderExtensions { + + #region AddOracleSqlQuery(配置Oracle Sql查询对象) + + /// + /// 配置Oracle Sql查询对象 + /// + /// 应用生成器 + public static IAppBuilder AddOracleSqlQuery( this IAppBuilder builder ) { + return builder.AddOracleSqlQuery( "" ); + } + + /// + /// 配置Oracle Sql查询对象 + /// + /// 应用生成器 + /// 数据库连接字符串 + public static IAppBuilder AddOracleSqlQuery( this IAppBuilder builder, string connection ) { + return builder.AddOracleSqlQuery( connection ); + } + + /// + /// 配置Oracle Sql查询对象 + /// + /// 应用生成器 + /// 配置操作 + public static IAppBuilder AddOracleSqlQuery( this IAppBuilder builder, Action setupAction ) { + return builder.AddOracleSqlQuery( setupAction ); + } + + /// + /// 配置Oracle Sql查询对象 + /// + /// 应用生成器 + /// 数据库连接字符串 + public static IAppBuilder AddOracleSqlQuery( this IAppBuilder builder, string connection ) + where TService : ISqlQuery + where TImplementation : OracleSqlQueryBase, TService { + return builder.AddOracleSqlQuery( t => t.ConnectionString( connection ) ); + } + + /// + /// 配置Oracle Sql查询对象 + /// + /// 应用生成器 + /// 配置操作 + public static IAppBuilder AddOracleSqlQuery( this IAppBuilder builder, Action setupAction ) + where TService : ISqlQuery + where TImplementation : OracleSqlQueryBase, TService { + var options = new SqlOptions(); + setupAction?.Invoke( options ); + builder.CheckNull( nameof( builder ) ); + builder.Host.ConfigureServices( ( context, services ) => { + services.TryAddTransient( typeof( TService ), typeof( TImplementation ) ); + services.TryAddSingleton( typeof( SqlOptions ), ( sp ) => options ); + } ); + return builder; + } + + #endregion + + #region AddOracleSqlExecutor(配置Oracle Sql执行器) + + /// + /// 配置Oracle Sql执行器 + /// + /// 应用生成器 + public static IAppBuilder AddOracleSqlExecutor( this IAppBuilder builder ) { + return builder.AddOracleSqlExecutor( "" ); + } + + /// + /// 配置Oracle Sql执行器 + /// + /// 应用生成器 + /// 数据库连接字符串 + public static IAppBuilder AddOracleSqlExecutor( this IAppBuilder builder, string connection ) { + return builder.AddOracleSqlExecutor( connection ); + } + + /// + /// 配置Oracle Sql执行器 + /// + /// 应用生成器 + /// 配置操作 + public static IAppBuilder AddOracleSqlExecutor( this IAppBuilder builder, Action setupAction ) { + return builder.AddOracleSqlExecutor( setupAction ); + } + + /// + /// 配置Oracle Sql执行器 + /// + /// 应用生成器 + /// 数据库连接字符串 + public static IAppBuilder AddOracleSqlExecutor( this IAppBuilder builder, string connection ) + where TService : ISqlExecutor + where TImplementation : OracleSqlExecutorBase, TService { + return builder.AddOracleSqlExecutor( t => t.ConnectionString( connection ) ); + } + + /// + /// 配置Oracle Sql执行器 + /// + /// 应用生成器 + /// 配置操作 + public static IAppBuilder AddOracleSqlExecutor( this IAppBuilder builder, Action setupAction ) + where TService : ISqlExecutor + where TImplementation : OracleSqlExecutorBase, TService { + var options = new SqlOptions(); + setupAction?.Invoke( options ); + builder.Host.ConfigureServices( ( context, services ) => { + services.TryAddTransient( typeof( TService ), typeof( TImplementation ) ); + services.TryAddSingleton( typeof( SqlOptions ), ( sp ) => options ); + } ); + return builder; + } + + #endregion +} \ No newline at end of file diff --git a/src/Util.Data.Dapper.Oracle/Sql/Builders/OracleColumnCache.cs b/src/Util.Data.Dapper.Oracle/Sql/Builders/OracleColumnCache.cs new file mode 100644 index 000000000..a41defad7 --- /dev/null +++ b/src/Util.Data.Dapper.Oracle/Sql/Builders/OracleColumnCache.cs @@ -0,0 +1,35 @@ +using Util.Data.Sql.Builders.Caches; + +namespace Util.Data.Dapper.Sql.Builders; + +/// +/// Oracle列缓存 +/// +public class OracleColumnCache : ColumnCacheBase { + /// + /// 列名缓存 + /// + private readonly ConcurrentDictionary _cache; + + /// + /// 封闭构造方法 + /// + private OracleColumnCache() : base( OracleDialect.Instance ) { + _cache = new ConcurrentDictionary(); + } + + /// + /// Oracle列缓存实例 + /// + public static readonly IColumnCache Instance = new OracleColumnCache(); + + /// + public override string GetSafeColumns( string columns ) { + return _cache.GetOrAdd( columns.GetHashCode(), key => NormalizeColumns( columns ) ); + } + + /// + public override string GetSafeColumn( string column ) { + return _cache.GetOrAdd( column.GetHashCode(), key => NormalizeColumn( column ) ); + } +} \ No newline at end of file diff --git a/src/Util.Data.Dapper.Oracle/Sql/Builders/OracleDialect.cs b/src/Util.Data.Dapper.Oracle/Sql/Builders/OracleDialect.cs new file mode 100644 index 000000000..9824a1511 --- /dev/null +++ b/src/Util.Data.Dapper.Oracle/Sql/Builders/OracleDialect.cs @@ -0,0 +1,35 @@ +using Util.Data.Sql.Builders; +using Util.Data.Sql.Builders.Core; + +namespace Util.Data.Dapper.Sql.Builders; + +/// +/// Oracle方言 +/// +public class OracleDialect : DialectBase { + /// + /// 封闭构造方法 + /// + private OracleDialect() { + } + + /// + /// Oracle方言实例 + /// + public static readonly IDialect Instance = new OracleDialect(); + + /// + public override string GetOpeningIdentifier() { + return "\""; + } + + /// + public override string GetClosingIdentifier() { + return "\""; + } + + /// + public override string GetPrefix() { + return ":"; + } +} \ No newline at end of file diff --git a/src/Util.Data.Dapper.Oracle/Sql/Builders/OracleExistsSqlBuilder.cs b/src/Util.Data.Dapper.Oracle/Sql/Builders/OracleExistsSqlBuilder.cs new file mode 100644 index 000000000..11769a773 --- /dev/null +++ b/src/Util.Data.Dapper.Oracle/Sql/Builders/OracleExistsSqlBuilder.cs @@ -0,0 +1,53 @@ +using Util.Data.Sql; +using Util.Data.Sql.Builders; + +namespace Util.Data.Dapper.Sql.Builders; + +/// +/// 判断是否存在Sql生成器 +/// +public class OracleExistsSqlBuilder : IExistsSqlBuilder { + /// + /// Sql生成器 + /// + private readonly ISqlBuilder _sqlBuilder; + + /// + /// 初始化判断是否存在Sql生成器 + /// + /// Sql生成器 + public OracleExistsSqlBuilder( ISqlBuilder sqlBuilder ) { + _sqlBuilder = sqlBuilder; + } + + /// + /// 获取Sql + /// + public string GetSql() { + InitSelect(); + return GetResult(); + } + + /// + /// 将Select子句初始化为1 + /// + private void InitSelect() { + _sqlBuilder.ClearSelect(); + _sqlBuilder.AppendSelect( "1" ); + } + + /// + /// 获取结果 + /// + private string GetResult() { + var result = new StringBuilder(); + result.AppendLine( "Select Case" ); + result.AppendLine( " When Exists (" ); + _sqlBuilder.AppendTo( result ); + result.AppendLine( ")" ); + result.AppendLine( " Then 1" ); + result.AppendLine( " Else 0 " ); + result.Append( "End" ); + return result.ToString(); + } +} \ No newline at end of file diff --git a/src/Util.Data.Dapper.Oracle/Sql/Builders/OracleParameterManager.cs b/src/Util.Data.Dapper.Oracle/Sql/Builders/OracleParameterManager.cs new file mode 100644 index 000000000..38a15df09 --- /dev/null +++ b/src/Util.Data.Dapper.Oracle/Sql/Builders/OracleParameterManager.cs @@ -0,0 +1,30 @@ +using Util.Data.Sql.Builders; +using Util.Data.Sql.Builders.Params; + +namespace Util.Data.Dapper.Sql.Builders; + +/// +/// Oracle Sql参数管理器 +/// +public class OracleParameterManager : ParameterManager { + /// + /// 初始化Oracle Sql参数管理器 + /// + /// Sql方言 + public OracleParameterManager( IDialect dialect ) : base( dialect ) { + } + + /// + /// 初始化Oracle Sql参数管理器 + /// + /// Sql参数管理器 + public OracleParameterManager( ParameterManager manager ) : base( manager ) { + } + + /// + public override string GenerateName() { + var result = $"{Dialect.GetPrefix()}p_{ParamIndex}"; + ParamIndex++; + return result; + } +} \ No newline at end of file diff --git a/src/Util.Data.Dapper.Oracle/Sql/Builders/OracleSqlBuilder.cs b/src/Util.Data.Dapper.Oracle/Sql/Builders/OracleSqlBuilder.cs new file mode 100644 index 000000000..b31053e96 --- /dev/null +++ b/src/Util.Data.Dapper.Oracle/Sql/Builders/OracleSqlBuilder.cs @@ -0,0 +1,46 @@ +using Util.Data.Sql; +using Util.Data.Sql.Builders; +using Util.Data.Sql.Builders.Caches; +using Util.Data.Sql.Builders.Params; + +namespace Util.Data.Dapper.Sql.Builders; + +/// +/// Oracle Sql生成器 +/// +public class OracleSqlBuilder : SqlBuilderBase { + /// + /// 初始化Oracle Sql生成器 + /// + /// Sql参数管理器 + public OracleSqlBuilder( IParameterManager parameterManager = null ) + : base( parameterManager ) { + } + + /// + protected override IDialect CreateDialect() { + return OracleDialect.Instance; + } + + /// + protected override IColumnCache CreateColumnCache() { + return OracleColumnCache.Instance; + } + + /// + public override ISqlBuilder New() { + return new OracleSqlBuilder( ParameterManager ); + } + + /// + protected override IParameterManager CreateParameterManager() { + return new OracleParameterManager( Dialect ); + } + + /// + public override ISqlBuilder Clone() { + var result = new OracleSqlBuilder(); + result.Clone( this ); + return result; + } +} \ No newline at end of file diff --git a/src/Util.Data.Dapper.Oracle/Sql/OracleDatabaseFactory.cs b/src/Util.Data.Dapper.Oracle/Sql/OracleDatabaseFactory.cs new file mode 100644 index 000000000..6b5d1d2db --- /dev/null +++ b/src/Util.Data.Dapper.Oracle/Sql/OracleDatabaseFactory.cs @@ -0,0 +1,15 @@ +namespace Util.Data.Dapper.Sql; + +/// +/// Oracle数据库工厂 +/// +public class OracleDatabaseFactory : IDatabaseFactory { + /// + /// 创建数据库信息 + /// + /// 数据库连接字符串 + public IDatabase Create( string connection ) { + var con = new OracleConnection( connection ); + return new DefaultDatabase( con ); + } +} \ No newline at end of file diff --git a/src/Util.Data.Dapper.Oracle/Sql/OracleSqlExecutor.cs b/src/Util.Data.Dapper.Oracle/Sql/OracleSqlExecutor.cs new file mode 100644 index 000000000..2158c7d50 --- /dev/null +++ b/src/Util.Data.Dapper.Oracle/Sql/OracleSqlExecutor.cs @@ -0,0 +1,18 @@ +using Util.Data.Sql; + +namespace Util.Data.Dapper.Sql; + +/// +/// Oracle Sql执行器 +/// +public class OracleSqlExecutor : OracleSqlExecutorBase { + /// + /// 初始化Oracle Sql执行器 + /// + /// 服务提供器 + /// Sql配置 + /// 数据库信息,用于接入其它数据源,比如EF DbContext + public OracleSqlExecutor( IServiceProvider serviceProvider, SqlOptions options, IDatabase database = null ) + : base( serviceProvider, options, database ) { + } +} \ No newline at end of file diff --git a/src/Util.Data.Dapper.Oracle/Sql/OracleSqlExecutorBase.cs b/src/Util.Data.Dapper.Oracle/Sql/OracleSqlExecutorBase.cs new file mode 100644 index 000000000..9d59bc1dc --- /dev/null +++ b/src/Util.Data.Dapper.Oracle/Sql/OracleSqlExecutorBase.cs @@ -0,0 +1,40 @@ +using Util.Data.Dapper.Sql.Builders; +using Util.Data.Sql; +using Util.Data.Sql.Builders; + +namespace Util.Data.Dapper.Sql; + +/// +/// Oracle Sql执行器 +/// +public abstract class OracleSqlExecutorBase : SqlExecutorBase { + /// + /// 初始化Oracle Sql执行器 + /// + /// 服务提供器 + /// Sql配置 + /// 数据库信息,用于接入其它数据源,比如EF DbContext + protected OracleSqlExecutorBase( IServiceProvider serviceProvider, SqlOptions options, IDatabase database ) : base( serviceProvider, options, database ) { + } + + /// + /// 创建Sql生成器 + /// + protected override ISqlBuilder CreateSqlBuilder() { + return new OracleSqlBuilder(); + } + + /// + /// 创建判断是否存在Sql生成器 + /// + protected override IExistsSqlBuilder CreatExistsSqlBuilder( ISqlBuilder sqlBuilder ) { + return new OracleExistsSqlBuilder( sqlBuilder ); + } + + /// + /// 创建数据库工厂 + /// + protected override IDatabaseFactory CreateDatabaseFactory() { + return new OracleDatabaseFactory(); + } +} \ No newline at end of file diff --git a/src/Util.Data.Dapper.Oracle/Sql/OracleSqlQuery.cs b/src/Util.Data.Dapper.Oracle/Sql/OracleSqlQuery.cs new file mode 100644 index 000000000..93067a5a0 --- /dev/null +++ b/src/Util.Data.Dapper.Oracle/Sql/OracleSqlQuery.cs @@ -0,0 +1,18 @@ +using Util.Data.Sql; + +namespace Util.Data.Dapper.Sql; + +/// +/// Oracle Sql查询对象 +/// +public class OracleSqlQuery : OracleSqlQueryBase { + /// + /// 初始化Oracle Sql查询对象 + /// + /// 服务提供器 + /// Sql配置 + /// 数据库信息,用于接入其它数据源,比如EF DbContext + public OracleSqlQuery( IServiceProvider serviceProvider, SqlOptions options, IDatabase database = null ) + : base( serviceProvider, options, database ) { + } +} \ No newline at end of file diff --git a/src/Util.Data.Dapper.Oracle/Sql/OracleSqlQueryBase.cs b/src/Util.Data.Dapper.Oracle/Sql/OracleSqlQueryBase.cs new file mode 100644 index 000000000..3e074ab51 --- /dev/null +++ b/src/Util.Data.Dapper.Oracle/Sql/OracleSqlQueryBase.cs @@ -0,0 +1,34 @@ +using Util.Data.Dapper.Sql.Builders; +using Util.Data.Sql; +using Util.Data.Sql.Builders; + +namespace Util.Data.Dapper.Sql; + +/// +/// Oracle Sql查询对象 +/// +public abstract class OracleSqlQueryBase : SqlQueryBase { + /// + /// 初始化Oracle Sql查询对象 + /// + /// 服务提供器 + /// Sql配置 + /// 数据库信息,用于接入其它数据源,比如EF DbContext + protected OracleSqlQueryBase( IServiceProvider serviceProvider, SqlOptions options, IDatabase database ) : base( serviceProvider, options, database ) { + } + + /// + protected override ISqlBuilder CreateSqlBuilder() { + return new OracleSqlBuilder(); + } + + /// + protected override IExistsSqlBuilder CreatExistsSqlBuilder( ISqlBuilder sqlBuilder ) { + return new OracleExistsSqlBuilder( sqlBuilder ); + } + + /// + protected override IDatabaseFactory CreateDatabaseFactory() { + return new OracleDatabaseFactory(); + } +} \ No newline at end of file diff --git a/src/Util.Data.Dapper.Oracle/TypeHandlers/GuidTypeHandler.cs b/src/Util.Data.Dapper.Oracle/TypeHandlers/GuidTypeHandler.cs new file mode 100644 index 000000000..3ebf80204 --- /dev/null +++ b/src/Util.Data.Dapper.Oracle/TypeHandlers/GuidTypeHandler.cs @@ -0,0 +1,26 @@ +namespace Util.Data.Dapper.TypeHandlers; + +/// +/// Guid类型处理器 +/// +public class GuidTypeHandler : SqlMapper.ITypeHandler { + /// + /// 设置值 + /// + /// 参数 + /// 值 + public void SetValue( IDbDataParameter parameter, object value ) { + var oracleParameter = (OracleParameter)parameter; + oracleParameter.OracleDbType = OracleDbType.Raw; + parameter.Value = value; + } + + /// + /// 转换值 + /// + /// 目标类型 + /// 值 + public object Parse( Type destinationType, object value ) { + return Util.Helpers.Convert.ToGuid( value ); + } +} \ No newline at end of file diff --git a/src/Util.Data.Dapper.Oracle/Usings.cs b/src/Util.Data.Dapper.Oracle/Usings.cs new file mode 100644 index 000000000..15a05c57e --- /dev/null +++ b/src/Util.Data.Dapper.Oracle/Usings.cs @@ -0,0 +1,10 @@ +global using System; +global using System.Threading.Tasks; +global using System.Collections.Generic; +global using System.Linq; +global using System.Text; +global using System.Data; +global using System.Collections.Concurrent; +global using Microsoft.Extensions.DependencyInjection.Extensions; +global using Dapper; +global using Oracle.ManagedDataAccess.Client; diff --git a/src/Util.Data.Sql/Builders/Core/TableItem.cs b/src/Util.Data.Sql/Builders/Core/TableItem.cs index e41dc5255..0c47bb345 100644 --- a/src/Util.Data.Sql/Builders/Core/TableItem.cs +++ b/src/Util.Data.Sql/Builders/Core/TableItem.cs @@ -94,6 +94,6 @@ private void AppendTable( StringBuilder builder ) { private void AppendTableAlias( StringBuilder builder ) { if( TableAlias.IsEmpty() ) return; - builder.AppendFormat( " As {0}", _dialect.GetSafeName( TableAlias ) ); + builder.AppendFormat( " {0}", _dialect.GetSafeName( TableAlias ) ); } } \ No newline at end of file diff --git a/src/Util.Data.Sql/Builders/Params/ParameterManager.cs b/src/Util.Data.Sql/Builders/Params/ParameterManager.cs index 79d005786..36bbefb43 100644 --- a/src/Util.Data.Sql/Builders/Params/ParameterManager.cs +++ b/src/Util.Data.Sql/Builders/Params/ParameterManager.cs @@ -11,15 +11,15 @@ public class ParameterManager : IParameterManager { /// /// 参数集合 /// - private readonly IDictionary _params; + protected readonly IDictionary SqlParams; /// /// 动态参数集合 /// - private readonly List _dynamicParams; + protected readonly List DynamicParams; /// /// 参数索引 /// - private int _paramIndex; + protected int ParamIndex; /// /// 初始化Sql参数管理器 @@ -27,28 +27,28 @@ public class ParameterManager : IParameterManager { /// Sql方言 public ParameterManager( IDialect dialect ) { Dialect = dialect; - _paramIndex = 0; - _params = new Dictionary(); - _dynamicParams = new List(); + ParamIndex = 0; + SqlParams = new Dictionary(); + DynamicParams = new List(); } /// /// 初始化Sql参数管理器 /// - /// Sql方言 + /// Sql参数管理器 public ParameterManager( ParameterManager manager ) { Dialect = manager.Dialect; - _paramIndex = manager._paramIndex; - _params = new Dictionary( manager._params ); - _dynamicParams = new List( manager._dynamicParams ); + ParamIndex = manager.ParamIndex; + SqlParams = new Dictionary( manager.SqlParams ); + DynamicParams = new List( manager.DynamicParams ); } /// /// 创建参数名 /// public virtual string GenerateName() { - var result = $"{Dialect.GetPrefix()}_p_{_paramIndex}"; - _paramIndex++; + var result = $"{Dialect.GetPrefix()}_p_{ParamIndex}"; + ParamIndex++; return result; } @@ -72,7 +72,7 @@ public virtual string NormalizeName( string name ) { public virtual void AddDynamicParams( object param ) { if ( param == null ) return; - _dynamicParams.Add( param ); + DynamicParams.Add( param ); } /// @@ -89,24 +89,33 @@ public virtual void Add( string name, object value = null, DbType? dbType = null if ( name.IsEmpty() ) return; name = NormalizeName( name ); - if ( _params.ContainsKey( name ) ) - _params.Remove( name ); + if ( SqlParams.ContainsKey( name ) ) + SqlParams.Remove( name ); + value = ConvertValue( value ); var param = new SqlParam( name, value, dbType, direction, size, precision, scale ); - _params.Add( name, param ); + SqlParams.Add( name, param ); + } + + /// + /// 转换参数值 + /// + /// 参数值 + protected virtual object ConvertValue( object value ) { + return value; } /// /// 获取动态参数列表 /// public IReadOnlyList GetDynamicParams() { - return _dynamicParams; + return DynamicParams; } /// /// 获取参数列表 /// public IReadOnlyList GetParams() { - return _params.Values.ToList(); + return SqlParams.Values.ToList(); } /// @@ -115,7 +124,7 @@ public IReadOnlyList GetParams() { /// 参数名 public virtual bool Contains( string name ) { name = NormalizeName( name ); - return _params.ContainsKey( name ); + return SqlParams.ContainsKey( name ); } /// @@ -124,7 +133,7 @@ public virtual bool Contains( string name ) { /// 参数名 public virtual SqlParam GetParam( string name ) { name = NormalizeName( name ); - return _params.ContainsKey( name ) ? _params[name] : null; + return SqlParams.TryGetValue( name, out var param ) ? param : null; } /// @@ -133,15 +142,15 @@ public virtual SqlParam GetParam( string name ) { /// 参数名 public virtual object GetValue( string name ) { name = NormalizeName( name ); - return _params.ContainsKey( name ) ? _params[name].Value : null; + return SqlParams.TryGetValue( name, out var param ) ? param.Value : null; } /// /// 清空参数 /// public virtual void Clear() { - _paramIndex = 0; - _params.Clear(); + ParamIndex = 0; + SqlParams.Clear(); } /// diff --git a/src/Util.Generators/01-Util.Generators.csproj b/src/Util.Generators/01-Util.Generators.csproj index 051e24b2b..71f8847e6 100644 --- a/src/Util.Generators/01-Util.Generators.csproj +++ b/src/Util.Generators/01-Util.Generators.csproj @@ -31,7 +31,7 @@ - + diff --git a/src/Util.Validation/ValidationResultCollection.cs b/src/Util.Validation/ValidationResultCollection.cs index eec1dfb59..0361afd5a 100644 --- a/src/Util.Validation/ValidationResultCollection.cs +++ b/src/Util.Validation/ValidationResultCollection.cs @@ -4,7 +4,6 @@ /// 验证结果集合 /// public class ValidationResultCollection : List { - /// /// 初始化验证结果集合 /// @@ -24,7 +23,7 @@ public ValidationResultCollection( string result ) { /// /// 成功验证结果集合 /// - public static readonly ValidationResultCollection Success = new ValidationResultCollection(); + public static readonly ValidationResultCollection Success = new(); /// /// 是否有效 diff --git a/test/Util.Core.Tests/Helpers/ConvertTest.cs b/test/Util.Core.Tests/Helpers/ConvertTest.cs index a0b4c3af4..66f2988be 100644 --- a/test/Util.Core.Tests/Helpers/ConvertTest.cs +++ b/test/Util.Core.Tests/Helpers/ConvertTest.cs @@ -368,13 +368,33 @@ public void TestToGuidOrNull_Validate( object input, Guid? result ) { } /// - /// 转换为可空Guid + /// 转换为可空Guid - 转换字符串 /// [Fact] - public void TestToGuidOrNull() { + public void TestToGuidOrNull_1() { Assert.Equal( new Guid( "B9EB56E9-B720-40B4-9425-00483D311DDC" ), Convert.ToGuidOrNull( "B9EB56E9-B720-40B4-9425-00483D311DDC" ) ); } + /// + /// 转换为可空Guid - 转换字节数组 + /// + [Fact] + public void TestToGuidOrNull_2() { + var guid = Guid.NewGuid(); + var bytes = guid.ToByteArray(); + Assert.Equal( guid, Convert.ToGuidOrNull( bytes ) ); + } + + /// + /// 转换为可空Guid - 转换字节数组 - 空guid + /// + [Fact] + public void TestToGuidOrNull_3() { + var guid = Guid.Empty; + var bytes = guid.ToByteArray(); + Assert.Equal( guid, Convert.ToGuidOrNull( bytes ) ); + } + #endregion #region ToGuidList diff --git a/test/Util.Data.Dapper.MySql.Tests.Integration/SqlBuilders/MySqlExistsSqlBuilderTest.cs b/test/Util.Data.Dapper.MySql.Tests.Integration/SqlBuilders/MySqlExistsSqlBuilderTest.cs index fa0cfd208..b427661bf 100644 --- a/test/Util.Data.Dapper.MySql.Tests.Integration/SqlBuilders/MySqlExistsSqlBuilderTest.cs +++ b/test/Util.Data.Dapper.MySql.Tests.Integration/SqlBuilders/MySqlExistsSqlBuilderTest.cs @@ -1,7 +1,6 @@ using System.Text; using Util.Data.Dapper.Sql.Builders; using Util.Data.Sql; -using Util.Data.Sql.Builders; using Xunit; using Xunit.Abstractions; diff --git a/test/Util.Data.Dapper.MySql.Tests.Integration/Startup.cs b/test/Util.Data.Dapper.MySql.Tests.Integration/Startup.cs index 9b73dba3b..309564e42 100644 --- a/test/Util.Data.Dapper.MySql.Tests.Integration/Startup.cs +++ b/test/Util.Data.Dapper.MySql.Tests.Integration/Startup.cs @@ -23,9 +23,6 @@ public class Startup { public void ConfigureHost( IHostBuilder hostBuilder ) { Environment.SetDevelopment(); hostBuilder.ConfigureDefaults( null ) - .ConfigureServices( ( context, services ) => { - services.AddTransient(); - } ) .AsBuild() .AddAop() .AddMySqlQuery( Config.GetConnectionString( "connection" ) ) @@ -38,7 +35,8 @@ public void ConfigureHost( IHostBuilder hostBuilder ) { /// ÷ /// public void ConfigureServices( IServiceCollection services ) { - services.AddLogging( logBuilder => logBuilder.AddXunitOutput() ); + services.AddTransient(); + services.AddLogging( logBuilder => logBuilder.AddXunitOutput() ); services.AddSingleton(); InitDatabase( services ); } diff --git a/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlExecutor/OracleExecutorTest.Execute.cs b/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlExecutor/OracleExecutorTest.Execute.cs new file mode 100644 index 000000000..1d5e0f8e1 --- /dev/null +++ b/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlExecutor/OracleExecutorTest.Execute.cs @@ -0,0 +1,27 @@ +using System; +using System.Threading.Tasks; +using Util.Data.Sql; +using Util.Tests.Configs; + +namespace Util.Data.Dapper.Tests.SqlExecutor { + /// + /// Oracle Sql执行器测试 - 执行Sql测试 + /// + public partial class OracleExecutorTest { + /// + /// 测试执行Sql增删改操作 + /// + [Fact] + public async Task TestExecuteAsync() { + var id = Guid.NewGuid(); + await _sqlExecutor + .AppendLine( "Insert Into \"Product\"(\"ProductId\",\"Code\") " ) + .Append( "Values(:ProductId,:Code)" ) + .AddParam( ":ProductId", id ) + .AddParam( "Code", TestConfig.Value ) + .ExecuteAsync(); + var result = await _sqlExecutor.Select( "Code" ).From( "Product" ).Where( "ProductId", id ).ToStringAsync(); + Assert.Equal( TestConfig.Value, result ); + } + } +} diff --git a/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlExecutor/OracleExecutorTest.Id.cs b/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlExecutor/OracleExecutorTest.Id.cs new file mode 100644 index 000000000..a1370e749 --- /dev/null +++ b/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlExecutor/OracleExecutorTest.Id.cs @@ -0,0 +1,66 @@ +using System; +using System.Threading.Tasks; +using Util.Data.Sql; +using Util.Helpers; +using Util.Tests.Configs; + +namespace Util.Data.Dapper.Tests.SqlExecutor { + /// + /// Oracle Sql执行器测试 - 标识列测试 + /// + public partial class OracleExecutorTest { + /// + /// 测试插入Guid主键 + /// + [Fact] + public async Task TestInsert_Guid() { + var id = Guid.NewGuid(); + await _sqlExecutor + .Insert( "ProductId,Code", "Product" ) + .Values( id, TestConfig.Value ) + .ExecuteAsync(); + var result = await _sqlExecutor + .Select( "Code" ) + .From( "Product" ) + .Where( "ProductId", id ) + .ToStringAsync(); + Assert.Equal( TestConfig.Value, result ); + } + + /// + /// 测试插入int自增长主键 + /// + [Fact] + public async Task TestInsert_Int() { + var value = Id.Create(); + await _sqlExecutor + .Insert( "Code", "Customer" ) + .Values( value ) + .ExecuteAsync(); + var result = await _sqlExecutor + .Select( "CustomerId" ) + .From( "Customer" ) + .Where( "Code", value ) + .ToIntAsync(); + Assert.True( result > 0 ); + } + + /// + /// 测试插入string主键 + /// + [Fact] + public async Task TestInsert_String() { + var id = Id.Create(); + await _sqlExecutor + .Insert( "OrderId,CustomerName", "Order" ) + .Values( id, TestConfig.Value ) + .ExecuteAsync(); + var result = await _sqlExecutor + .Select( "CustomerName" ) + .From( "Order" ) + .Where( "OrderId", id ) + .ToStringAsync(); + Assert.Equal( TestConfig.Value, result ); + } + } +} diff --git a/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlExecutor/OracleExecutorTest.Insert.cs b/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlExecutor/OracleExecutorTest.Insert.cs new file mode 100644 index 000000000..70cb65081 --- /dev/null +++ b/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlExecutor/OracleExecutorTest.Insert.cs @@ -0,0 +1,60 @@ +using System; +using System.Threading.Tasks; +using Util.Data.Sql; +using Util.Tests.Configs; +using Xunit; + +namespace Util.Data.Dapper.Tests.SqlExecutor { + /// + /// Oracle Sql执行器测试 - 插入测试 + /// + public partial class OracleExecutorTest { + /// + /// 测试使用Insert Values语句插入一条数据 + /// + [Fact] + public async Task TestInsert_1() { + //插入一条数据 + var id = Guid.NewGuid(); + await _sqlExecutor + .Insert( "ProductId,Code", "Product" ) + .Values( id, TestConfig.Value ) + .ExecuteAsync(); + + //获取值 + var result = await _sqlExecutor + .Select( "Code" ) + .From( "Product" ) + .Where( "ProductId", id ) + .ToStringAsync(); + + //验证 + Assert.Equal( TestConfig.Value, result ); + } + + /// + /// 测试使用Insert Values语句插入2条数据 + /// + [Fact] + public async Task TestInsert_2() { + //插入一条数据 + var id = Guid.NewGuid(); + var id2 = Guid.NewGuid(); + await _sqlExecutor + .Insert( "ProductId,Code", "Product" ) + .Values( id, TestConfig.Value ) + .Values( id2, TestConfig.Value ) + .ExecuteAsync(); + + //获取值 + var result = await _sqlExecutor + .AppendSelect( "Count(*)" ) + .From( "Product" ) + .In( "ProductId", new[]{id,id2} ) + .ToIntAsync(); + + //验证 + Assert.Equal( 2, result ); + } + } +} diff --git a/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlExecutor/OracleExecutorTest.Param.cs b/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlExecutor/OracleExecutorTest.Param.cs new file mode 100644 index 000000000..42fe66d90 --- /dev/null +++ b/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlExecutor/OracleExecutorTest.Param.cs @@ -0,0 +1,55 @@ +using System; +using System.Data; +using System.Threading.Tasks; +using Util.Data.Sql; +using Util.Tests.Configs; +using Xunit; + +namespace Util.Data.Dapper.Tests.SqlExecutor { + /// + /// Oracle Sql执行器测试 - 执行存储过程参数测试 + /// + public partial class OracleExecutorTest { + /// + /// 测试添加动态参数 + /// + [Fact] + public async Task TestAddParam_Dynamic() { + var id = Guid.NewGuid(); + await _sqlExecutor + .AppendLine( "Insert Into \"Product\"(\"ProductId\",\"Code\") " ) + .Append( "Values(:ProductId,:Code)" ) + .AddDynamicParams( new { ProductId=id, Code= TestConfig.Value } ) + .ExecuteAsync(); + var result = await _sqlExecutor.Select( "Code" ).From( "Product" ).Where( "ProductId", id ).ToStringAsync(); + Assert.Equal( TestConfig.Value, result ); + } + + /// + /// 测试添加参数 - 在执行前添加并获取参数 + /// + [Fact] + public async Task TestAddParam_1() { + var id = Guid.NewGuid(); + + //添加第一个参数 + _sqlExecutor + .AppendLine( "Insert Into \"Product\"(\"ProductId\",\"Code\") " ) + .Append( "Values(:ProductId,:Code)" ) + .AddParam( "ProductId", id ); + + //获取参数 + var param = _sqlExecutor.GetParam( "ProductId" ); + Assert.Equal( id, param ); + + //添加第二个参数并执行 + await _sqlExecutor + .AddParam( "Code", TestConfig.Value ) + .ExecuteAsync(); + + //验证 + var result = await _sqlExecutor.Select( "Code" ).From( "Product" ).Where( "ProductId", id ).ToStringAsync(); + Assert.Equal( TestConfig.Value, result ); + } + } +} diff --git a/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlExecutor/OracleExecutorTest.Transaction.cs b/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlExecutor/OracleExecutorTest.Transaction.cs new file mode 100644 index 000000000..d7b82d782 --- /dev/null +++ b/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlExecutor/OracleExecutorTest.Transaction.cs @@ -0,0 +1,249 @@ +using System; +using System.Threading.Tasks; +using Util.Data.Sql; +using Util.Tests.Configs; + +namespace Util.Data.Dapper.Tests.SqlExecutor { + /// + /// Oracle Sql执行器测试 - 事务测试 + /// + public partial class OracleExecutorTest { + /// + /// 测试事务操作 - 不使用事务,第一次操作成功,第二次失败 + /// + [Fact] + public async Task TestTransaction_1() { + //创建两个Id + var id = Guid.NewGuid(); + var id2 = Guid.NewGuid(); + + try { + //插入Id成功 + await _sqlExecutor + .Insert( "ProductId,Code", "Product" ) + .Values( id, TestConfig.Value ) + .ExecuteAsync(); + + //Code2列名错误,插入Id2失败 + await _sqlExecutor + .Insert( "ProductId,Code,Code2", "Product" ) + .Values( id2, TestConfig.Value, TestConfig.Value ) + .ExecuteAsync(); + } + catch { + // ignored + } + + //断言 + var exists = await _sqlExecutor.From( "Product" ).Where( "ProductId", id ).ExecuteExistsAsync(); + var exists2 = await _sqlExecutor.From( "Product" ).Where( "ProductId", id2 ).ExecuteExistsAsync(); + Assert.True( exists ); + Assert.False( exists2 ); + } + + /// + /// 测试事务操作 - 调用BeginTransaction,CommitTransaction,RollbackTransaction + /// + [Fact] + public async Task TestTransaction_2() { + //开始事务 + _sqlExecutor.BeginTransaction(); + + //创建两个Id + var id = Guid.NewGuid(); + var id2 = Guid.NewGuid(); + + try { + //插入Id成功 + await _sqlExecutor + .Insert( "ProductId,Code", "Product" ) + .Values( id, TestConfig.Value ) + .ExecuteAsync(); + + //Code2列名错误,插入Id2失败 + await _sqlExecutor + .Insert( "ProductId,Code,Code2", "Product" ) + .Values( id2, TestConfig.Value, TestConfig.Value ) + .ExecuteAsync(); + + //提交事务 + _sqlExecutor.CommitTransaction(); + } + catch { + //回滚事务 + _sqlExecutor.RollbackTransaction(); + } + + //断言 + var exists = await _sqlExecutor.From( "Product" ).Where( "ProductId", id ).ExecuteExistsAsync(); + var exists2 = await _sqlExecutor.From( "Product" ).Where( "ProductId", id2 ).ExecuteExistsAsync(); + Assert.False( exists ); + Assert.False( exists2 ); + } + + /// + /// 测试事务操作 - 使用using调用BeginTransaction + /// + [Fact] + public async Task TestTransaction_3() { + //创建两个Id + var id = Guid.NewGuid(); + var id2 = Guid.NewGuid(); + + try { + using var transaction = _sqlExecutor.BeginTransaction(); + //插入Id成功 + await _sqlExecutor + .Insert( "ProductId,Code", "Product" ) + .Values( id, TestConfig.Value ) + .ExecuteAsync(); + + //Code2列名错误,插入Id2失败 + await _sqlExecutor + .Insert( "ProductId,Code,Code2", "Product" ) + .Values( id2, TestConfig.Value, TestConfig.Value ) + .ExecuteAsync(); + + //提交事务 + transaction.Commit(); + } + catch { + // ignored + } + + //断言 + var exists = await _sqlExecutor.From( "Product" ).Where( "ProductId", id ).ExecuteExistsAsync(); + var exists2 = await _sqlExecutor.From( "Product" ).Where( "ProductId", id2 ).ExecuteExistsAsync(); + Assert.False( exists ); + Assert.False( exists2 ); + } + + /// + /// 测试事务操作 - 外部传入事务 - 回滚 + /// + [Fact] + public async Task TestTransaction_4() { + //Sql执行器实例2开始事务 + _sqlExecutor2.BeginTransaction(); + var transaction = _sqlExecutor2.GetTransaction(); + + //设置Sql执行器实例1事务 + _sqlExecutor.SetTransaction( transaction ); + + //创建两个Id + var id = Guid.NewGuid(); + var id2 = Guid.NewGuid(); + + try { + //插入Id成功 + await _sqlExecutor + .Insert( "ProductId,Code", "Product" ) + .Values( id, TestConfig.Value ) + .ExecuteAsync(); + + //Code2列名错误,插入Id2失败 + await _sqlExecutor2 + .Insert( "ProductId,Code,Code2", "Product" ) + .Values( id2, TestConfig.Value, TestConfig.Value ) + .ExecuteAsync(); + + //提交事务 + _sqlExecutor.CommitTransaction(); + } + catch { + //回滚事务 + _sqlExecutor.RollbackTransaction(); + } + + //断言 + var exists = await _sqlExecutor.From( "Product" ).Where( "ProductId", id ).ExecuteExistsAsync(); + var exists2 = await _sqlExecutor.From( "Product" ).Where( "ProductId", id2 ).ExecuteExistsAsync(); + Assert.False( exists ); + Assert.False( exists2 ); + } + + /// + /// 测试事务操作 - 外部传入事务 - 成功 + /// + [Fact] + public async Task TestTransaction_5() { + //Sql执行器实例2开始事务 + _sqlExecutor2.BeginTransaction(); + var transaction = _sqlExecutor2.GetTransaction(); + + //设置Sql执行器实例1事务 + _sqlExecutor.SetTransaction( transaction ); + + //创建两个Id + var id = Guid.NewGuid(); + var id2 = Guid.NewGuid(); + + try { + //插入Id成功 + await _sqlExecutor + .Insert( "ProductId,Code", "Product" ) + .Values( id, TestConfig.Value ) + .ExecuteAsync(); + + //Code2列名错误,插入Id2失败 + await _sqlExecutor2 + .Insert( "ProductId,Code", "Product" ) + .Values( id2, TestConfig.Value ) + .ExecuteAsync(); + + //提交事务 + _sqlExecutor.CommitTransaction(); + } + catch { + //回滚事务 + _sqlExecutor.RollbackTransaction(); + } + + //断言 + var exists = await _sqlExecutor.From( "Product" ).Where( "ProductId", id ).ExecuteExistsAsync(); + var exists2 = await _sqlExecutor.From( "Product" ).Where( "ProductId", id2 ).ExecuteExistsAsync(); + Assert.True( exists ); + Assert.True( exists2 ); + } + + /// + /// 测试事务操作 - 成功提交 + /// + [Fact] + public async Task TestTransaction_6() { + //开始事务 + _sqlExecutor.BeginTransaction(); + + //创建两个Id + var id = Guid.NewGuid(); + var id2 = Guid.NewGuid(); + + try { + //插入Id成功 + await _sqlExecutor + .Insert( "ProductId,Code", "Product" ) + .Values( id, TestConfig.Value ) + .ExecuteAsync(); + + //插入Id2成功 + await _sqlExecutor + .Insert( "ProductId,Code", "Product" ) + .Values( id2, TestConfig.Value ) + .ExecuteAsync(); + + //提交事务 + _sqlExecutor.CommitTransaction(); + } + catch { + //回滚事务 + _sqlExecutor.RollbackTransaction(); + } + + //断言 + var exists = await _sqlExecutor.From( "Product" ).Where( "ProductId", id ).ExecuteExistsAsync(); + var exists2 = await _sqlExecutor.From( "Product" ).Where( "ProductId", id2 ).ExecuteExistsAsync(); + Assert.True( exists ); + Assert.True( exists2 ); + } + } +} diff --git a/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlExecutor/OracleExecutorTest.cs b/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlExecutor/OracleExecutorTest.cs new file mode 100644 index 000000000..06bd8d80e --- /dev/null +++ b/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlExecutor/OracleExecutorTest.cs @@ -0,0 +1,31 @@ +using Util.Data.Sql; +using Xunit.Abstractions; + +namespace Util.Data.Dapper.Tests.SqlExecutor { + /// + /// Oracle Sql执行器测试 + /// + public partial class OracleExecutorTest { + /// + /// 测试输出工具 + /// + private readonly ITestOutputHelper _output; + /// + /// Sql执行器 + /// + private readonly ISqlExecutor _sqlExecutor; + /// + /// Sql执行器2 + /// + private readonly ISqlExecutor _sqlExecutor2; + + /// + /// 测试初始化 + /// + public OracleExecutorTest( ITestOutputHelper output, ISqlExecutor sqlExecutor, ISqlExecutor sqlExecutor2 ) { + _output = output; + _sqlExecutor = sqlExecutor; + _sqlExecutor2 = sqlExecutor2; + } + } +} diff --git a/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlQuery/OracleQueryTest.Exists.cs b/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlQuery/OracleQueryTest.Exists.cs new file mode 100644 index 000000000..7d7afd8c0 --- /dev/null +++ b/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlQuery/OracleQueryTest.Exists.cs @@ -0,0 +1,47 @@ +using System; +using System.Threading.Tasks; +using Util.Data.Sql; +using Util.Tests.Configs; + +namespace Util.Data.Dapper.Tests.SqlQuery { + /// + /// Oracle Sqlѯ - жǷڲ + /// + public partial class OracleQueryTest { + /// + /// жǷ - + /// + [Fact] + public void TestExecuteExists_1() { + var result = _sqlQuery.Select("*").From( "Product" ).Where( "ProductId", TestConfig.Id ).ExecuteExists(); + Assert.True( result ); + } + + /// + /// жǷ - + /// + [Fact] + public void TestExecuteExists_2() { + var result = _sqlQuery.From( "Product" ).Where( "ProductId", Guid.NewGuid() ).ExecuteExists(); + Assert.False( result ); + } + + /// + /// жǷ - + /// + [Fact] + public async Task TestExecuteExistsAsync_1() { + var result = await _sqlQuery.From( "Product" ).Where( "ProductId", TestConfig.Id ).ExecuteExistsAsync(); + Assert.True( result ); + } + + /// + /// жǷ - + /// + [Fact] + public async Task TestExecuteExistsAsync_2() { + var result = await _sqlQuery.From( "Product" ).Where( "ProductId", Guid.NewGuid() ).ExecuteExistsAsync(); + Assert.False( result ); + } + } +} diff --git a/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlQuery/OracleQueryTest.Query.cs b/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlQuery/OracleQueryTest.Query.cs new file mode 100644 index 000000000..04b328ac0 --- /dev/null +++ b/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlQuery/OracleQueryTest.Query.cs @@ -0,0 +1,387 @@ +using System; +using System.Collections; +using System.Threading.Tasks; +using Util.Data.Sql; +using Util.Helpers; +using Util.Tests.Configs; +using Util.Tests.Models; + +namespace Util.Data.Dapper.Tests.SqlQuery { + /// + /// Oracle Sqlѯ - ѯ + /// + public partial class OracleQueryTest { + + #region ExecuteQuery + + /// + /// Իȡʵ弯 + /// + [Fact] + public async Task TestExecuteQuery_1() { + //2 + var id = Guid.NewGuid(); + var id2 = Guid.NewGuid(); + var code = "TestExecuteQuery_1"; + await _sqlExecutor.Insert( "ProductId,Code", "Product" ) + .Values( id, code ) + .Values( id2, code ) + .ExecuteAsync(); + + //ȡ + var result = _sqlQuery.Select().From( "Product" ).In( "ProductId", new[] { id, id2 } ).ExecuteQuery(); + + // + Assert.NotNull( result ); + Assert.Equal( 2, result.Count ); + Assert.Contains( result, t => new Guid( t.ProductId ) == id ); + Assert.Contains( result, t => new Guid( t.ProductId ) == id2 ); + Assert.Contains( result, t => t.Code == code ); + } + + /// + /// Իȡʵ弯 - 1Ͳ + /// + [Fact] + public async Task TestExecuteQuery_2() { + //2 + var id = Guid.NewGuid(); + var id2 = Guid.NewGuid(); + var code = "TestExecuteQuery_2"; + await _sqlExecutor.Insert( "ProductId,Code", "Product" ) + .Values( id, code ) + .Values( id2, code ) + .ExecuteAsync(); + + //ȡ + var result = _sqlQuery.Select( "ProductId As Id,Code" ).From( "Product" ).In( "ProductId", new[] { id, id2 } ).ExecuteQuery(); + + // + Assert.NotNull( result ); + Assert.Equal( 2, result.Count ); + Assert.Contains( result, t => t.Id == id ); + Assert.Contains( result, t => t.Id == id2 ); + Assert.Contains( result, t => t.Code == code ); + } + + /// + /// Իȡʵ弯 - 3Ͳ - ӱ,ù + /// + [Fact] + public async Task TestExecuteQuery_3() { + //붩 + var orderId = Id.Create(); + var customerName = "customerName"; + await _sqlExecutor.Insert( "OrderId,CustomerName", "Order" ) + .Values( orderId, customerName ) + .ExecuteAsync(); + + //붩ϸ + var orderItemId = Id.CreateGuid(); + await _sqlExecutor.Insert( "OrderItemId,OrderId,Price", "OrderItem" ) + .Values( orderItemId, orderId, TestConfig.DecimalValue ) + .ExecuteAsync(); + + ////ȡ + var result = _sqlQuery + .Select( "i.OrderItemId As Id,i.*" ) //OrderItemIdӳΪId,֮OrderItemص + .Select( "o.OrderId As Id,o.*" ) //OrderIdӳΪId,֮ǰOrderItemеϢ,֮Orderе + .From( "OrderItem As i" ) + .LeftJoin( "Order As o" ).On( "o.OrderId", "i.OrderId" ) + .Where( "i.OrderItemId", orderItemId ) + .ExecuteQuery( ( item, order ) => { + item.Order = order; + return item; + } ); + + // + Assert.Single( (IEnumerable)result ); + Assert.Equal( orderItemId, result[0].Id ); + Assert.Equal( TestConfig.DecimalValue, result[0].Price ); + Assert.Equal( orderId, result[0].OrderId ); + Assert.Equal( orderId, result[0].Order.Id ); + Assert.Equal( customerName, result[0].Order.CustomerName ); + } + + #endregion + + #region ExecuteQueryAsync + + /// + /// Իȡʵ弯 + /// + [Fact] + public async Task TestExecuteQueryAsync_1() { + //2 + var id = Guid.NewGuid(); + var id2 = Guid.NewGuid(); + var code = "TestExecuteQueryAsync_1"; + await _sqlExecutor.Insert( "ProductId,Code", "Product" ) + .Values( id, code ) + .Values( id2, code ) + .ExecuteAsync(); + + //ȡ + var result = await _sqlQuery.Select().From( "Product" ).In( "ProductId", new[] { id, id2 } ).ExecuteQueryAsync(); + + // + Assert.NotNull( result ); + Assert.Equal( 2, result.Count ); + Assert.Contains( result, t => new Guid( t.ProductId ) == id ); + Assert.Contains( result, t => new Guid( t.ProductId ) == id2 ); + Assert.Contains( result, t => t.Code == code ); + } + + /// + /// Իȡʵ弯 + /// + [Fact] + public async Task TestExecuteQueryAsync_2() { + //2 + var id = Guid.NewGuid(); + var id2 = Guid.NewGuid(); + var code = "TestExecuteQueryAsync_2"; + await _sqlExecutor.Insert( "ProductId,Code", "Product" ) + .Values( id, code ) + .Values( id2, code ) + .ExecuteAsync(); + + //ȡ + var result = await _sqlQuery.Select( "ProductId As Id,Code" ).From( "Product" ).In( "ProductId", new[] { id, id2 } ).ExecuteQueryAsync(); + + // + Assert.NotNull( result ); + Assert.Equal( 2, result.Count ); + Assert.Contains( result, t => t.Id == id ); + Assert.Contains( result, t => t.Id == id2 ); + Assert.Contains( result, t => t.Code == code ); + } + + /// + /// Իȡʵ弯 - 3Ͳ - ӱ,ù + /// + [Fact] + public async Task TestExecuteQueryAsync_3() { + //붩 + var orderId = Id.Create(); + var customerName = "customerName"; + await _sqlExecutor.Insert( "OrderId,CustomerName", "Order" ) + .Values( orderId, customerName ) + .ExecuteAsync(); + + //붩ϸ + var orderItemId = Id.CreateGuid(); + await _sqlExecutor.Insert( "OrderItemId,OrderId,Price", "OrderItem" ) + .Values( orderItemId, orderId, TestConfig.DecimalValue ) + .ExecuteAsync(); + + ////ȡ + var result = await _sqlQuery + .Select( "i.OrderItemId As Id,i.*" ) //OrderItemIdӳΪId,֮OrderItemص + .Select( "o.OrderId As Id,o.*" ) //OrderIdӳΪId,֮ǰOrderItemеϢ,֮Orderе + .From( "OrderItem As i" ) + .LeftJoin( "Order As o" ).On( "o.OrderId", "i.OrderId" ) + .Where( "i.OrderItemId", orderItemId ) + .ExecuteQueryAsync( ( item, order ) => { + item.Order = order; + return item; + } ); + + // + Assert.Single( (IEnumerable)result ); + Assert.Equal( orderItemId, result[0].Id ); + Assert.Equal( TestConfig.DecimalValue, result[0].Price ); + Assert.Equal( orderId, result[0].OrderId ); + Assert.Equal( orderId, result[0].Order.Id ); + Assert.Equal( customerName, result[0].Order.CustomerName ); + } + + #endregion + + #region ToList + + /// + /// Իȡʵ弯 + /// + [Fact] + public async Task TestToList_1() { + //2 + var id = Guid.NewGuid(); + var id2 = Guid.NewGuid(); + var code = "TestToList_1"; + await _sqlExecutor.Insert( "ProductId,Code", "Product" ) + .Values( id, code ) + .Values( id2, code ) + .ExecuteAsync(); + + //ȡ + var result = _sqlQuery.Select().From( "Product" ).In( "ProductId", new[] { id, id2 } ).ToList(); + + // + Assert.NotNull( result ); + Assert.Equal( 2, result.Count ); + Assert.Contains( result, t => new Guid( t.ProductId ) == id ); + Assert.Contains( result, t => new Guid( t.ProductId ) == id2 ); + Assert.Contains( result, t => t.Code == code ); + } + + /// + /// Իȡʵ弯 - 1Ͳ + /// + [Fact] + public async Task TestToList_2() { + //2 + var id = Guid.NewGuid(); + var id2 = Guid.NewGuid(); + var code = "TestToList_2"; + await _sqlExecutor.Insert( "ProductId,Code", "Product" ) + .Values( id, code ) + .Values( id2, code ) + .ExecuteAsync(); + + //ȡ + var result = _sqlQuery.Select( "ProductId As Id,Code" ).From( "Product" ).In( "ProductId", new[] { id, id2 } ).ToList(); + + // + Assert.NotNull( result ); + Assert.Equal( 2, result.Count ); + Assert.Contains( result, t => t.Id == id ); + Assert.Contains( result, t => t.Id == id2 ); + Assert.Contains( result, t => t.Code == code ); + } + + /// + /// Իȡʵ弯 - 3Ͳ - ӱ,ù + /// + [Fact] + public async Task TestToList_3() { + //붩 + var orderId = Id.Create(); + var customerName = "customerName"; + await _sqlExecutor.Insert( "OrderId,CustomerName", "Order" ) + .Values( orderId, customerName ) + .ExecuteAsync(); + + //붩ϸ + var orderItemId = Id.CreateGuid(); + await _sqlExecutor.Insert( "OrderItemId,OrderId,Price", "OrderItem" ) + .Values( orderItemId, orderId, TestConfig.DecimalValue ) + .ExecuteAsync(); + + ////ȡ + var result = _sqlQuery + .Select( "i.OrderItemId As Id,i.*" ) //OrderItemIdӳΪId,֮OrderItemص + .Select( "o.OrderId As Id,o.*" ) //OrderIdӳΪId,֮ǰOrderItemеϢ,֮Orderе + .From( "OrderItem As i" ) + .LeftJoin( "Order As o" ).On( "o.OrderId", "i.OrderId" ) + .Where( "i.OrderItemId", orderItemId ) + .ToList( ( item, order ) => { + item.Order = order; + return item; + } ); + + // + Assert.Single( (IEnumerable)result ); + Assert.Equal( orderItemId, result[0].Id ); + Assert.Equal( TestConfig.DecimalValue, result[0].Price ); + Assert.Equal( orderId, result[0].OrderId ); + Assert.Equal( orderId, result[0].Order.Id ); + Assert.Equal( customerName, result[0].Order.CustomerName ); + } + + #endregion + + #region ToListAsync + + /// + /// Իȡʵ弯 + /// + [Fact] + public async Task TestToListAsync_1() { + //2 + var id = Guid.NewGuid(); + var id2 = Guid.NewGuid(); + var code = "TestToListAsync_1"; + await _sqlExecutor.Insert( "ProductId,Code", "Product" ) + .Values( id, code ) + .Values( id2, code ) + .ExecuteAsync(); + + //ȡ + var result = await _sqlQuery.Select().From( "Product" ).In( "ProductId", new[] { id, id2 } ).ToListAsync(); + + // + Assert.NotNull( result ); + Assert.Equal( 2, result.Count ); + Assert.Contains( result, t => new Guid( t.ProductId ) == id ); + Assert.Contains( result, t => new Guid( t.ProductId ) == id2 ); + Assert.Contains( result, t => t.Code == code ); + } + + /// + /// Իȡʵ弯 + /// + [Fact] + public async Task TestToListAsync_2() { + //2 + var id = Guid.NewGuid(); + var id2 = Guid.NewGuid(); + var code = "TestToListAsync_2"; + await _sqlExecutor.Insert( "ProductId,Code", "Product" ) + .Values( id, code ) + .Values( id2, code ) + .ExecuteAsync(); + + //ȡ + var result = await _sqlQuery.Select( "ProductId As Id,Code" ).From( "Product" ).In( "ProductId", new[] { id, id2 } ).ToListAsync(); + + // + Assert.NotNull( result ); + Assert.Equal( 2, result.Count ); + Assert.Contains( result, t => t.Id == id ); + Assert.Contains( result, t => t.Id == id2 ); + Assert.Contains( result, t => t.Code == code ); + } + + /// + /// Իȡʵ弯 - 3Ͳ - ӱ,ù + /// + [Fact] + public async Task TestToListAsync_3() { + //붩 + var orderId = Id.Create(); + var customerName = "customerName"; + await _sqlExecutor.Insert( "OrderId,CustomerName", "Order" ) + .Values( orderId, customerName ) + .ExecuteAsync(); + + //붩ϸ + var orderItemId = Id.CreateGuid(); + await _sqlExecutor.Insert( "OrderItemId,OrderId,Price", "OrderItem" ) + .Values( orderItemId, orderId, TestConfig.DecimalValue ) + .ExecuteAsync(); + + ////ȡ + var result = await _sqlQuery + .Select( "i.OrderItemId As Id,i.*" ) //OrderItemIdӳΪId,֮OrderItemص + .Select( "o.OrderId As Id,o.*" ) //OrderIdӳΪId,֮ǰOrderItemеϢ,֮Orderе + .From( "OrderItem As i" ) + .LeftJoin( "Order As o" ).On( "o.OrderId", "i.OrderId" ) + .Where( "i.OrderItemId", orderItemId ) + .ToListAsync( ( item, order ) => { + item.Order = order; + return item; + } ); + + // + Assert.Single( (IEnumerable)result ); + Assert.Equal( orderItemId, result[0].Id ); + Assert.Equal( TestConfig.DecimalValue, result[0].Price ); + Assert.Equal( orderId, result[0].OrderId ); + Assert.Equal( orderId, result[0].Order.Id ); + Assert.Equal( customerName, result[0].Order.CustomerName ); + } + + #endregion + } +} diff --git a/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlQuery/OracleQueryTest.Scalar.cs b/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlQuery/OracleQueryTest.Scalar.cs new file mode 100644 index 000000000..519870bb6 --- /dev/null +++ b/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlQuery/OracleQueryTest.Scalar.cs @@ -0,0 +1,628 @@ +using System.Threading.Tasks; +using Util.Data.Sql; +using Util.Tests.Configs; + +namespace Util.Data.Dapper.Tests.SqlQuery { + /// + /// Oracle Sqlѯ - ֵ + /// + public partial class OracleQueryTest { + + #region ExecuteScalar + + /// + /// Իȡֵ + /// + [Fact] + public void TestExecuteScalar_1() { + var result = _sqlQuery.Select( "Code" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ExecuteScalar(); + Assert.Equal( TestConfig.Value, result.SafeString() ); + } + + /// + /// Իȡֵ - + /// + [Fact] + public void TestExecuteScalar_2() { + var result = _sqlQuery.Select( "Code" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ExecuteScalar(); + Assert.Equal( TestConfig.Value, result ); + } + + #endregion + + #region ExecuteScalarAsync + + /// + /// Իȡֵ + /// + [Fact] + public async Task TestExecuteScalarAsync_1() { + var result = await _sqlQuery.Select( "Code" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ExecuteScalarAsync(); + Assert.Equal( TestConfig.Value, result.SafeString() ); + } + + /// + /// Իȡֵ - + /// + [Fact] + public async Task TestExecuteScalarAsync_2() { + var result = await _sqlQuery.Select( "Code" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ExecuteScalarAsync(); + Assert.Equal( TestConfig.Value, result ); + } + + #endregion + + #region ToStringAsync + + /// + /// Իȡֵַ + /// + [Fact] + public async Task TestToStringAsync() { + var result = await _sqlQuery.Select( "Code" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToStringAsync(); + Assert.Equal( TestConfig.Value, result ); + } + + #endregion + + #region ToInt + + /// + /// Իȡ32λֵ + /// + [Fact] + public void TestToInt() { + var result = _sqlQuery.Select( "IntPrice" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToInt(); + Assert.Equal( TestConfig.IntValue, result ); + } + + #endregion + + #region ToIntAsync + + /// + /// Իȡ32λֵ + /// + [Fact] + public async Task TestToIntAsync() { + var result = await _sqlQuery.Select( "IntPrice" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToIntAsync(); + Assert.Equal( TestConfig.IntValue, result ); + } + + #endregion + + #region ToIntOrNull + + /// + /// Իȡ32λֵ - ֵ + /// + [Fact] + public void TestToIntOrNull_1() { + var result = _sqlQuery.Select( "IntPrice" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToIntOrNull(); + Assert.Equal( TestConfig.IntValue, result ); + } + + /// + /// Իȡ32λɿֵ - ֵ + /// + [Fact] + public void TestToIntOrNull_2() { + var result = _sqlQuery.Select( "Code" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToIntOrNull(); + Assert.Null( result ); + } + + #endregion + + #region ToIntOrNullAsync + + /// + /// Իȡ32λɿֵ - ֵ + /// + [Fact] + public async Task TestToIntOrNullAsync_1() { + var result = await _sqlQuery.Select( "IntPrice" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToIntOrNullAsync(); + Assert.Equal( TestConfig.IntValue, result ); + } + + /// + /// Իȡ32λɿֵ - ֵ + /// + [Fact] + public async Task TestToIntOrNullAsync_2() { + var result = await _sqlQuery.Select( "Code" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToIntOrNullAsync(); + Assert.Null( result ); + } + + #endregion + + #region ToLong + + /// + /// Իȡ64λֵ + /// + [Fact] + public void TestToLong() { + var result = _sqlQuery.Select( "LongPrice" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToLong(); + Assert.Equal( TestConfig.LongValue, result ); + } + + #endregion + + #region ToLongAsync + + /// + /// Իȡ64λֵ + /// + [Fact] + public async Task TestToLongAsync() { + var result = await _sqlQuery.Select( "LongPrice" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToLongAsync(); + Assert.Equal( TestConfig.LongValue, result ); + } + + #endregion + + #region ToLongOrNull + + /// + /// Իȡ64λɿֵ - ֵ + /// + [Fact] + public void TestToLongOrNull_1() { + var result = _sqlQuery.Select( "LongPrice" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToLongOrNull(); + Assert.Equal( TestConfig.LongValue, result ); + } + + /// + /// Իȡ64λɿֵ - ֵ + /// + [Fact] + public void TestToLongOrNull_2() { + var result = _sqlQuery.Select( "Code" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToLongOrNull(); + Assert.Null( result ); + } + + #endregion + + #region ToLongOrNullAsync + + /// + /// Իȡ64λɿֵ - ֵ + /// + [Fact] + public async Task TestToLongOrNullAsync_1() { + var result = await _sqlQuery.Select( "LongPrice" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToLongOrNullAsync(); + Assert.Equal( TestConfig.LongValue, result ); + } + + /// + /// Իȡ64λɿֵ - ֵ + /// + [Fact] + public async Task TestToLongOrNullAsync_2() { + var result = await _sqlQuery.Select( "Code" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToLongOrNullAsync(); + Assert.Null( result ); + } + + #endregion + + #region ToGuid + + /// + /// ԻȡGuidֵ + /// + [Fact] + public void TestToGuid() { + var result = _sqlQuery.Select( "ProductId" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToGuid(); + Assert.Equal( TestConfig.Id, result ); + } + + #endregion + + #region ToGuidAsync + + /// + /// ԻȡGuidֵ + /// + [Fact] + public async Task TestToGuidAsync() { + var result = await _sqlQuery.Select( "ProductId" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToGuidAsync(); + Assert.Equal( TestConfig.Id, result ); + } + + #endregion + + #region ToGuidOrNull + + /// + /// ԻȡɿGuidֵ - ֵ + /// + [Fact] + public void TestToGuidOrNull_1() { + var result = _sqlQuery.Select( "ProductId" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToGuidOrNull(); + Assert.Equal( TestConfig.Id, result ); + } + + /// + /// ԻȡɿGuidֵ - ֵ + /// + [Fact] + public void TestToGuidOrNull_2() { + var result = _sqlQuery.Select( "Code" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToGuidOrNull(); + Assert.Null( result ); + } + + #endregion + + #region ToGuidOrNullAsync + + /// + /// ԻȡɿGuidֵ - ֵ + /// + [Fact] + public async Task TestToGuidOrNullAsync_1() { + var result = await _sqlQuery.Select( "ProductId" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToGuidOrNullAsync(); + Assert.Equal( TestConfig.Id, result ); + } + + /// + /// ԻȡɿGuidֵ - ֵ + /// + [Fact] + public async Task TestToGuidOrNullAsync_2() { + var result = await _sqlQuery.Select( "Code" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToGuidOrNullAsync(); + Assert.Null( result ); + } + + #endregion + + #region ToBool + + /// + /// Իȡֵ + /// + [Fact] + public void TestToBool() { + var result = _sqlQuery.Select( "Enabled" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToBool(); + Assert.Equal( TestConfig.BoolValue, result ); + } + + #endregion + + #region ToBoolAsync + + /// + /// Իȡֵ + /// + [Fact] + public async Task TestToBoolAsync() { + var result = await _sqlQuery.Select( "Enabled" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToBoolAsync(); + Assert.Equal( TestConfig.BoolValue, result ); + } + + #endregion + + #region ToBoolOrNull + + /// + /// Իȡɿղֵ - ֵ + /// + [Fact] + public void TestToBoolOrNull_1() { + var result = _sqlQuery.Select( "Enabled" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToBoolOrNull(); + Assert.Equal( TestConfig.BoolValue, result ); + } + + /// + /// Իȡɿղֵ - ֵ + /// + [Fact] + public void TestToBoolOrNull_2() { + var result = _sqlQuery.Select( "Code" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToBoolOrNull(); + Assert.Null( result ); + } + + #endregion + + #region ToBoolOrNullAsync + + /// + /// Իȡɿղֵ - ֵ + /// + [Fact] + public async Task TestToBoolOrNullAsync_1() { + var result = await _sqlQuery.Select( "Enabled" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToBoolOrNullAsync(); + Assert.Equal( TestConfig.BoolValue, result ); + } + + /// + /// Իȡɿղֵ - ֵ + /// + [Fact] + public async Task TestToBoolOrNullAsync_2() { + var result = await _sqlQuery.Select( "Code" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToBoolOrNullAsync(); + Assert.Null( result ); + } + + #endregion + + #region ToFloat + + /// + /// ԻȡFloatֵ + /// + [Fact] + public void TestToFloat() { + var result = _sqlQuery.Select( "FloatPrice" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToFloat(); + Assert.Equal( TestConfig.FloatValue, result ); + } + + #endregion + + #region ToFloatAsync + + /// + /// ԻȡFloatֵ + /// + [Fact] + public async Task TestToFloatAsync() { + var result = await _sqlQuery.Select( "FloatPrice" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToFloatAsync(); + Assert.Equal( TestConfig.FloatValue, result ); + } + + #endregion + + #region ToFloatOrNull + + /// + /// ԻȡɿFloatֵ - ֵ + /// + [Fact] + public void TestToFloatOrNull_1() { + var result = _sqlQuery.Select( "FloatPrice" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToFloatOrNull(); + Assert.Equal( TestConfig.FloatValue, result ); + } + + /// + /// ԻȡɿFloatֵ - ֵ + /// + [Fact] + public void TestToFloatOrNull_2() { + var result = _sqlQuery.Select( "Code" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToFloatOrNull(); + Assert.Null( result ); + } + + #endregion + + #region ToFloatOrNullAsync + + /// + /// ԻȡɿFloatֵ - ֵ + /// + [Fact] + public async Task TestToFloatOrNullAsync_1() { + var result = await _sqlQuery.Select( "FloatPrice" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToFloatOrNullAsync(); + Assert.Equal( TestConfig.FloatValue, result ); + } + + /// + /// ԻȡɿFloatֵ - ֵ + /// + [Fact] + public async Task TestToFloatOrNullAsync_2() { + var result = await _sqlQuery.Select( "Code" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToFloatOrNullAsync(); + Assert.Null( result ); + } + + #endregion + + #region ToDouble + + /// + /// ԻȡDoubleֵ + /// + [Fact] + public void TestToDouble() { + var result = _sqlQuery.Select( "Price" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToDouble(); + Assert.Equal( TestConfig.DoubleValue, result ); + } + + #endregion + + #region ToDoubleAsync + + /// + /// ԻȡDoubleֵ + /// + [Fact] + public async Task TestToDoubleAsync() { + var result = await _sqlQuery.Select( "Price" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToDoubleAsync(); + Assert.Equal( TestConfig.DoubleValue, result ); + } + + #endregion + + #region ToDoubleOrNull + + /// + /// ԻȡɿDoubleֵ - ֵ + /// + [Fact] + public void TestToDoubleOrNull_1() { + var result = _sqlQuery.Select( "Price" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToDoubleOrNull(); + Assert.Equal( TestConfig.DoubleValue, result ); + } + + /// + /// ԻȡɿDoubleֵ - ֵ + /// + [Fact] + public void TestToDoubleOrNull_2() { + var result = _sqlQuery.Select( "Code" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToDoubleOrNull(); + Assert.Null( result ); + } + + #endregion + + #region ToDoubleOrNullAsync + + /// + /// ԻȡɿDoubleֵ - ֵ + /// + [Fact] + public async Task TestToDoubleOrNullAsync_1() { + var result = await _sqlQuery.Select( "Price" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToDoubleOrNullAsync(); + Assert.Equal( TestConfig.DoubleValue, result ); + } + + /// + /// ԻȡɿDoubleֵ - ֵ + /// + [Fact] + public async Task TestToDoubleOrNullAsync_2() { + var result = await _sqlQuery.Select( "Code" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToDoubleOrNullAsync(); + Assert.Null( result ); + } + + #endregion + + #region ToDecimal + + /// + /// ԻȡDecimalֵ + /// + [Fact] + public void TestToDecimal() { + var result = _sqlQuery.Select( "Price" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToDecimal(); + Assert.Equal( TestConfig.DecimalValue, result ); + } + + #endregion + + #region ToDecimalAsync + + /// + /// ԻȡDecimalֵ + /// + [Fact] + public async Task TestToDecimalAsync() { + var result = await _sqlQuery.Select( "Price" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToDecimalAsync(); + Assert.Equal( TestConfig.DecimalValue, result ); + } + + #endregion + + #region ToDecimalOrNull + + /// + /// ԻȡDecimalֵ - ֵ + /// + [Fact] + public void TestToDecimalOrNull_1() { + var result = _sqlQuery.Select( "Price" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToDecimalOrNull(); + Assert.Equal( TestConfig.DecimalValue, result ); + } + + /// + /// ԻȡDecimalֵ - ֵ + /// + [Fact] + public void TestToDecimalOrNull_2() { + var result = _sqlQuery.Select( "Code" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToDecimalOrNull(); + Assert.Null( result ); + } + + #endregion + + #region ToDecimalOrNullAsync + + /// + /// ԻȡɿDecimalֵ - ֵ + /// + [Fact] + public async Task TestToDecimalOrNullAsync_1() { + var result = await _sqlQuery.Select( "Price" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToDecimalOrNullAsync(); + Assert.Equal( TestConfig.DecimalValue, result ); + } + + /// + /// ԻȡɿDecimalֵ - ֵ + /// + [Fact] + public async Task TestToDecimalOrNullAsync_2() { + var result = await _sqlQuery.Select( "Code" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToDecimalOrNullAsync(); + Assert.Null( result ); + } + + #endregion + + #region ToDateTime + + /// + /// Իȡֵ + /// + [Fact] + public void TestToDateTime() { + var result = _sqlQuery.Select( "Birthday" ).From( "Customer" ).Where( "CustomerId", 1 ).ToDateTime(); + Assert.Equal( TestConfig.DateTimeValue, result ); + } + + #endregion + + #region ToDateTimeAsync + + /// + /// Իȡֵ + /// + [Fact] + public async Task TestToDateTimeAsync() { + var result = await _sqlQuery.Select( "Birthday" ).From( "Customer" ).Where( "CustomerId", 1 ).ToDateTimeAsync(); + Assert.Equal( TestConfig.DateTimeValue, result ); + } + + #endregion + + #region ToDateTimeOrNull + + /// + /// Իȡɿֵ - ֵ + /// + [Fact] + public void TestToDateTimeOrNull_1() { + var result = _sqlQuery.Select( "Birthday" ).From( "Customer" ).Where( "CustomerId", 1 ).ToDateTimeOrNull(); + Assert.Equal( TestConfig.DateTimeValue, result ); + } + + /// + /// Իȡɿֵ - ֵ + /// + [Fact] + public void TestToDateTimeOrNull_2() { + var result = _sqlQuery.Select( "Code" ).From( "Customer" ).Where( "CustomerId", 1 ).ToDateTimeOrNull(); + Assert.Null( result ); + } + + #endregion + + #region ToDateTimeOrNullAsync + + /// + /// Իȡɿֵ - ֵ + /// + [Fact] + public async Task TestToDateTimeOrNullAsync_1() { + var result = await _sqlQuery.Select( "Birthday" ).From( "Customer" ).Where( "CustomerId", 1 ).ToDateTimeOrNullAsync(); + Assert.Equal( TestConfig.DateTimeValue, result ); + } + + /// + /// Իȡɿֵ - ֵ + /// + [Fact] + public async Task TestToDateTimeOrNullAsync_2() { + var result = await _sqlQuery.Select( "Code" ).From( "Customer" ).Where( "CustomerId", 1 ).ToDateTimeOrNullAsync(); + Assert.Null( result ); + } + + #endregion + } +} diff --git a/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlQuery/OracleQueryTest.Single.cs b/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlQuery/OracleQueryTest.Single.cs new file mode 100644 index 000000000..e124adfe0 --- /dev/null +++ b/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlQuery/OracleQueryTest.Single.cs @@ -0,0 +1,51 @@ +using System.Threading.Tasks; +using Util.Data.Sql; +using Util.Tests.Configs; +using Util.Tests.Models; + +namespace Util.Data.Dapper.Tests.SqlQuery { + /// + /// Oracle Sqlѯ - ȡ + /// + public partial class OracleQueryTest { + /// + /// Իȡʵ + /// + [Fact] + public void TestExecuteSingle() { + var result = _sqlQuery.Select( "ProductId as Id,Code" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ExecuteSingle(); + Assert.Equal( TestConfig.Id, result.Id ); + Assert.Equal( TestConfig.Value, result.Code ); + } + + /// + /// Իȡʵ + /// + [Fact] + public async Task TestExecuteSingleAsync() { + var result = await _sqlQuery.Select( "ProductId as Id,Code" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ExecuteSingleAsync(); + Assert.Equal( TestConfig.Id, result.Id ); + Assert.Equal( TestConfig.Value, result.Code ); + } + + /// + /// Իȡʵ + /// + [Fact] + public void TestToEntity() { + var result = _sqlQuery.Select( "ProductId as Id,Code" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToEntity(); + Assert.Equal( TestConfig.Id, result.Id ); + Assert.Equal( TestConfig.Value, result.Code ); + } + + /// + /// Իȡʵ + /// + [Fact] + public async Task TestToEntityAsync() { + var result = await _sqlQuery.Select( "ProductId as Id,Code" ).From( "Product" ).Where( "ProductId", TestConfig.Id ).ToEntityAsync(); + Assert.Equal( TestConfig.Id, result.Id ); + Assert.Equal( TestConfig.Value, result.Code ); + } + } +} diff --git a/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlQuery/OracleQueryTest.cs b/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlQuery/OracleQueryTest.cs new file mode 100644 index 000000000..4a6bdaf58 --- /dev/null +++ b/test/Util.Data.Dapper.Oracle.Tests.Integration/SqlQuery/OracleQueryTest.cs @@ -0,0 +1,25 @@ +using Util.Data.Sql; + +namespace Util.Data.Dapper.Tests.SqlQuery { + /// + /// Oracle Sqlѯ + /// + public partial class OracleQueryTest { + /// + /// Sqlִ + /// + private readonly ISqlExecutor _sqlExecutor; + /// + /// Sqlѯ + /// + private readonly ISqlQuery _sqlQuery; + + /// + /// Գʼ + /// + public OracleQueryTest( ISqlExecutor sqlExecutor, ISqlQuery sqlQuery ) { + _sqlExecutor = sqlExecutor; + _sqlQuery = sqlQuery; + } + } +} diff --git a/test/Util.Data.Dapper.Oracle.Tests.Integration/Startup.cs b/test/Util.Data.Dapper.Oracle.Tests.Integration/Startup.cs new file mode 100644 index 000000000..66123b171 --- /dev/null +++ b/test/Util.Data.Dapper.Oracle.Tests.Integration/Startup.cs @@ -0,0 +1,51 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Util.Aop; +using Util.Data.Dapper.Sql; +using Util.Data.EntityFrameworkCore; +using Util.Helpers; +using Util.Logging.Serilog; +using Util.Sessions; +using Util.Tests.Infrastructure; +using Util.Tests.UnitOfWorks; +using Xunit.DependencyInjection.Logging; + +namespace Util.Data.Dapper.Tests { + /// + /// + /// + public class Startup { + /// + /// + /// + public void ConfigureHost( IHostBuilder hostBuilder ) { + Environment.SetDevelopment(); + hostBuilder.ConfigureDefaults( null ) + .AsBuild() + .AddAop() + .AddSerilog() + .AddOracleSqlQuery( Config.GetConnectionString( "connection" ) ) + .AddOracleSqlExecutor( Config.GetConnectionString( "connection" ) ) + .AddOracleUnitOfWork( Config.GetConnectionString( "connection" ) ) + .AddUtil(); + } + + /// + /// ÷ + /// + public void ConfigureServices( IServiceCollection services ) { + services.AddLogging( logBuilder => logBuilder.AddXunitOutput() ); + services.AddSingleton(); + InitDatabase( services ); + } + + /// + /// ʼݿ + /// + private void InitDatabase( IServiceCollection services ) { + var unitOfWork = (OracleUnitOfWork)services.BuildServiceProvider().GetService(); + unitOfWork.EnsureDeleted(); + unitOfWork.EnsureCreated(); + } + } +} diff --git a/test/Util.Data.Dapper.Oracle.Tests.Integration/Usings.cs b/test/Util.Data.Dapper.Oracle.Tests.Integration/Usings.cs new file mode 100644 index 000000000..8c927eb74 --- /dev/null +++ b/test/Util.Data.Dapper.Oracle.Tests.Integration/Usings.cs @@ -0,0 +1 @@ +global using Xunit; \ No newline at end of file diff --git a/test/Util.Data.Dapper.Oracle.Tests.Integration/Util.Data.Dapper.Oracle.Tests.Integration.csproj b/test/Util.Data.Dapper.Oracle.Tests.Integration/Util.Data.Dapper.Oracle.Tests.Integration.csproj new file mode 100644 index 000000000..f67649379 --- /dev/null +++ b/test/Util.Data.Dapper.Oracle.Tests.Integration/Util.Data.Dapper.Oracle.Tests.Integration.csproj @@ -0,0 +1,50 @@ + + + + $(NetTargetFramework) + false + true + Util.Data.Dapper.Tests + Util.Data.Dapper.Tests.Startup + + + + + + + + + + Always + + + Always + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + + diff --git a/test/Util.Data.Dapper.Oracle.Tests.Integration/appsettings.Development.json b/test/Util.Data.Dapper.Oracle.Tests.Integration/appsettings.Development.json new file mode 100644 index 000000000..1ba2c378d --- /dev/null +++ b/test/Util.Data.Dapper.Oracle.Tests.Integration/appsettings.Development.json @@ -0,0 +1,11 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Trace", + "Microsoft": "Trace" + } + }, + "ConnectionStrings": { + "connection": "User Id=c##test;Password=test;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)));" + } +} diff --git a/test/Util.Data.Dapper.Oracle.Tests.Integration/appsettings.json b/test/Util.Data.Dapper.Oracle.Tests.Integration/appsettings.json new file mode 100644 index 000000000..39722103e --- /dev/null +++ b/test/Util.Data.Dapper.Oracle.Tests.Integration/appsettings.json @@ -0,0 +1,11 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Error", + "Microsoft": "Error" + } + }, + "ConnectionStrings": { + "connection": "" + } +} \ No newline at end of file diff --git a/test/Util.Data.Dapper.PostgreSql.Tests.Integration/SqlBuilders/PostgreSqlExistsSqlBuilderTest.cs b/test/Util.Data.Dapper.PostgreSql.Tests.Integration/SqlBuilders/PostgreSqlExistsSqlBuilderTest.cs index 5fb9be8c5..aa1265beb 100644 --- a/test/Util.Data.Dapper.PostgreSql.Tests.Integration/SqlBuilders/PostgreSqlExistsSqlBuilderTest.cs +++ b/test/Util.Data.Dapper.PostgreSql.Tests.Integration/SqlBuilders/PostgreSqlExistsSqlBuilderTest.cs @@ -1,7 +1,6 @@ using System.Text; using Util.Data.Dapper.Sql.Builders; using Util.Data.Sql; -using Util.Data.Sql.Builders; using Xunit; using Xunit.Abstractions; diff --git a/test/Util.Data.EntityFrameworkCore.Oracle.Tests.Integration/appsettings.Development.json b/test/Util.Data.EntityFrameworkCore.Oracle.Tests.Integration/appsettings.Development.json index 90b5ef378..1ba2c378d 100644 --- a/test/Util.Data.EntityFrameworkCore.Oracle.Tests.Integration/appsettings.Development.json +++ b/test/Util.Data.EntityFrameworkCore.Oracle.Tests.Integration/appsettings.Development.json @@ -6,6 +6,6 @@ } }, "ConnectionStrings": { - "connection": "User Id=admin;Password=admin;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)));" + "connection": "User Id=c##test;Password=test;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)));" } } diff --git a/test/Util.Data.EntityFrameworkCore.Oracle.Tests.Integration/appsettings.json b/test/Util.Data.EntityFrameworkCore.Oracle.Tests.Integration/appsettings.json index 3c4dafa1b..39722103e 100644 --- a/test/Util.Data.EntityFrameworkCore.Oracle.Tests.Integration/appsettings.json +++ b/test/Util.Data.EntityFrameworkCore.Oracle.Tests.Integration/appsettings.json @@ -6,6 +6,6 @@ } }, "ConnectionStrings": { - "connection": "User Id=TEST;Password=123456;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=gateway.docker.internal)(PORT=11521)))(CONNECT_DATA=(SERVICE_NAME=xe)))" + "connection": "" } } \ No newline at end of file diff --git a/test/Util.Data.Sql.Tests/Builders/Clauses/FromClauseTest.cs b/test/Util.Data.Sql.Tests/Builders/Clauses/FromClauseTest.cs index 1bd057e6a..1419e85c2 100644 --- a/test/Util.Data.Sql.Tests/Builders/Clauses/FromClauseTest.cs +++ b/test/Util.Data.Sql.Tests/Builders/Clauses/FromClauseTest.cs @@ -74,7 +74,7 @@ public void TestFrom_2() { [Fact] public void TestFrom_3() { _clause.From( "a as b" ); - Assert.Equal( "From [a] As [b]", GetSql() ); + Assert.Equal( "From [a] [b]", GetSql() ); } /// @@ -83,7 +83,7 @@ public void TestFrom_3() { [Fact] public void TestFrom_4() { _clause.From( "a.b as c" ); - Assert.Equal( "From [a].[b] As [c]", GetSql() ); + Assert.Equal( "From [a].[b] [c]", GetSql() ); } /// diff --git a/test/Util.Data.Sql.Tests/Builders/Clauses/JoinClauseTest.cs b/test/Util.Data.Sql.Tests/Builders/Clauses/JoinClauseTest.cs index 2f6fe9a15..a5d7f421b 100644 --- a/test/Util.Data.Sql.Tests/Builders/Clauses/JoinClauseTest.cs +++ b/test/Util.Data.Sql.Tests/Builders/Clauses/JoinClauseTest.cs @@ -75,7 +75,7 @@ public void TestOn_1() { [Fact] public void TestJoin_1() { _clause.Join( "a.b as c" ); - Assert.Equal( "Join [a].[b] As [c]", GetSql() ); + Assert.Equal( "Join [a].[b] [c]", GetSql() ); } /// @@ -173,7 +173,7 @@ public void TestJoin_6() { [Fact] public void TestLeftJoin_1() { _clause.LeftJoin( "a.b as c" ); - Assert.Equal( "Left Join [a].[b] As [c]", GetSql() ); + Assert.Equal( "Left Join [a].[b] [c]", GetSql() ); } /// @@ -221,7 +221,7 @@ public void TestLeftJoin_3() { [Fact] public void TestRightJoin_1() { _clause.RightJoin( "a.b as c" ); - Assert.Equal( "Right Join [a].[b] As [c]", GetSql() ); + Assert.Equal( "Right Join [a].[b] [c]", GetSql() ); } /// diff --git a/test/Util.Data.Sql.Tests/Builders/Core/TableItemTest.cs b/test/Util.Data.Sql.Tests/Builders/Core/TableItemTest.cs index 909f2507e..be4ea2bae 100644 --- a/test/Util.Data.Sql.Tests/Builders/Core/TableItemTest.cs +++ b/test/Util.Data.Sql.Tests/Builders/Core/TableItemTest.cs @@ -121,7 +121,7 @@ public void TestToResult_2() { [Fact] public void TestToResult_3() { var item = new TableItem( _dialect, "a.b as c" ); - Assert.Equal( "[a].[b] As [c]", item.ToResult() ); + Assert.Equal( "[a].[b] [c]", item.ToResult() ); } /// @@ -130,6 +130,6 @@ public void TestToResult_3() { [Fact] public void TestToResult_4() { var item = new TableItem( _dialect, " [a] . [b] as [c] " ); - Assert.Equal( "[a].[b] As [c]", item.ToResult() ); + Assert.Equal( "[a].[b] [c]", item.ToResult() ); } } \ No newline at end of file diff --git a/test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.End.cs b/test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.End.cs index d781518c4..9f83ff856 100644 --- a/test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.End.cs +++ b/test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.End.cs @@ -19,7 +19,7 @@ public void TestTake() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [c].[D] As [e] " ); - result.AppendLine( "From [a].[B] As [c] " ); + result.AppendLine( "From [a].[B] [c] " ); result.Append( "Limit @_p_0 OFFSET @_p_1" ); //执行 @@ -46,7 +46,7 @@ public void TestSkip() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [c].[D] As [e] " ); - result.AppendLine( "From [a].[B] As [c] " ); + result.AppendLine( "From [a].[B] [c] " ); result.Append( "Limit @_p_1 OFFSET @_p_0" ); //执行 @@ -74,7 +74,7 @@ public void TestPage() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [c].[D] As [e] " ); - result.AppendLine( "From [a].[B] As [c] " ); + result.AppendLine( "From [a].[B] [c] " ); result.Append( "Limit @_p_1 OFFSET @_p_0" ); //执行 @@ -102,7 +102,7 @@ public void TestAppendEnd_1() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [c].[D] As [e] " ); - result.AppendLine( "From [a].[B] As [c] " ); + result.AppendLine( "From [a].[B] [c] " ); result.Append( "Order By abc" ); //执行 @@ -127,7 +127,7 @@ public void TestClearPage() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [c].[D] As [e] " ); - result.Append( "From [a].[B] As [c]" ); + result.Append( "From [a].[B] [c]" ); //执行 var page = new Pager( 3, 40 ); @@ -153,7 +153,7 @@ public void TestClearEnd() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [c].[D] As [e] " ); - result.Append( "From [a].[B] As [c]" ); + result.Append( "From [a].[B] [c]" ); //执行 var page = new Pager( 3, 40 ); diff --git a/test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.From.cs b/test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.From.cs index 8dcb48475..97277911b 100644 --- a/test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.From.cs +++ b/test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.From.cs @@ -19,7 +19,7 @@ public void TestFrom_1() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [c].[D] As [e] " ); - result.Append( "From [a].[B] As [c]" ); + result.Append( "From [a].[B] [c]" ); //执行 _builder.Select( "c.D as e" ) diff --git a/test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.Join.cs b/test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.Join.cs index 428b87ed4..08819a8d1 100644 --- a/test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.Join.cs +++ b/test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.Join.cs @@ -20,7 +20,7 @@ public void TestJoin_1() { var result = new StringBuilder(); result.AppendLine( "Select [a] " ); result.AppendLine( "From [b] " ); - result.Append( "Join [c] As [d]" ); + result.Append( "Join [c] [d]" ); //执行 _builder.Select( "a" ) @@ -87,7 +87,7 @@ public void TestLeftJoin_1() { var result = new StringBuilder(); result.AppendLine( "Select [a] " ); result.AppendLine( "From [b] " ); - result.Append( "Left Join [c] As [d]" ); + result.Append( "Left Join [c] [d]" ); //执行 _builder.Select( "a" ) @@ -154,7 +154,7 @@ public void TestRightJoin_1() { var result = new StringBuilder(); result.AppendLine( "Select [a] " ); result.AppendLine( "From [b] " ); - result.Append( "Right Join [c] As [d]" ); + result.Append( "Right Join [c] [d]" ); //执行 _builder.Select( "a" ) @@ -221,7 +221,7 @@ public void TestOn_1() { var result = new StringBuilder(); result.AppendLine( "Select [a] " ); result.AppendLine( "From [b] " ); - result.Append( "Join [c] As [d] On [b].[Id]<>[d].[Id]" ); + result.Append( "Join [c] [d] On [b].[Id]<>[d].[Id]" ); //执行 _builder.Select( "a" ) diff --git a/test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.OrderBy.cs b/test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.OrderBy.cs index 1c1bdf3dd..1e995aff1 100644 --- a/test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.OrderBy.cs +++ b/test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.OrderBy.cs @@ -18,7 +18,7 @@ public void TestOrderBy_1() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [c].[D] As [e] " ); - result.AppendLine( "From [a].[B] As [c] " ); + result.AppendLine( "From [a].[B] [c] " ); result.Append( "Order By [c].[b] Desc" ); //执行 @@ -42,7 +42,7 @@ public void TestAppendOrderBy_1() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [c].[D] As [e] " ); - result.AppendLine( "From [a].[B] As [c] " ); + result.AppendLine( "From [a].[B] [c] " ); result.Append( "Order By [c].[b] Desc" ); //执行 @@ -66,7 +66,7 @@ public void TestClearOrderBy() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [c].[D] As [e] " ); - result.Append( "From [a].[B] As [c]" ); + result.Append( "From [a].[B] [c]" ); //执行 _builder.Select( "c.D as e" ) diff --git a/test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.Start.cs b/test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.Start.cs index bf3fc8c9a..2e0755a42 100644 --- a/test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.Start.cs +++ b/test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.Start.cs @@ -91,7 +91,7 @@ public void TestAppendStart_1() { var result = new StringBuilder(); result.AppendLine( "with(a) " ); result.AppendLine( "Select [c].[D] As [e] " ); - result.Append( "From [a].[B] As [c]" ); + result.Append( "From [a].[B] [c]" ); //执行 _builder.AppendStart( "with(a)" ) diff --git a/test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.Where.cs b/test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.Where.cs index 21db5dec9..7a912e763 100644 --- a/test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.Where.cs +++ b/test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.Where.cs @@ -101,7 +101,7 @@ public void TestIn_1() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [a].[Email] " ); - result.AppendLine( "From [Sample] As [a] " ); + result.AppendLine( "From [Sample] [a] " ); result.Append( "Where [a].[Email] In (@_p_0,@_p_1)" ); //执行 @@ -125,7 +125,7 @@ public void TestIn_2() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [a].[Email] " ); - result.AppendLine( "From [Sample] As [a] " ); + result.AppendLine( "From [Sample] [a] " ); result.Append( "Where [a].[Email] In (@_p_0,@_p_1)" ); //执行 @@ -149,7 +149,7 @@ public void TestIn_3() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [a].[Email] " ); - result.AppendLine( "From [Sample] As [a] " ); + result.AppendLine( "From [Sample] [a] " ); result.Append( "Where [a].[Name]=@_p_1 And " ); result.Append( "[a].[Email] In (" ); result.AppendLine( "Select [a] " ); @@ -179,7 +179,7 @@ public void TestIn_4() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [a].[Email] " ); - result.AppendLine( "From [Sample] As [a] " ); + result.AppendLine( "From [Sample] [a] " ); result.Append( "Where [a].[Name]=@_p_0 And " ); result.Append( "[a].[Email] In (" ); result.AppendLine( "Select [a] " ); @@ -212,7 +212,7 @@ public void TestNotIn_1() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [a].[Email] " ); - result.AppendLine( "From [Sample] As [a] " ); + result.AppendLine( "From [Sample] [a] " ); result.Append( "Where [a].[Email] Not In (@_p_0,@_p_1)" ); //执行 @@ -236,7 +236,7 @@ public void TestNotIn_2() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [a].[Email] " ); - result.AppendLine( "From [Sample] As [a] " ); + result.AppendLine( "From [Sample] [a] " ); result.Append( "Where [a].[Email] Not In (@_p_0,@_p_1)" ); //执行 @@ -260,7 +260,7 @@ public void TestNotIn_3() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [a].[Email] " ); - result.AppendLine( "From [Sample] As [a] " ); + result.AppendLine( "From [Sample] [a] " ); result.Append( "Where [a].[Name]=@_p_1 And " ); result.Append( "[a].[Email] Not In (" ); result.AppendLine( "Select [a] " ); @@ -290,7 +290,7 @@ public void TestNotIn_4() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [a].[Email] " ); - result.AppendLine( "From [Sample] As [a] " ); + result.AppendLine( "From [Sample] [a] " ); result.Append( "Where [a].[Name]=@_p_0 And " ); result.Append( "[a].[Email] Not In (" ); result.AppendLine( "Select [a] " ); @@ -323,7 +323,7 @@ public void TestIsNull() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [a].[Email] " ); - result.AppendLine( "From [Sample] As [a] " ); + result.AppendLine( "From [Sample] [a] " ); result.Append( "Where [a].[Email] Is Null" ); //执行 @@ -347,7 +347,7 @@ public void TestIsNotNull() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [a].[Email] " ); - result.AppendLine( "From [Sample] As [a] " ); + result.AppendLine( "From [Sample] [a] " ); result.Append( "Where [a].[Email] Is Not Null" ); //执行 @@ -371,7 +371,7 @@ public void TestIsEmpty() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [a].[Email] " ); - result.AppendLine( "From [Sample] As [a] " ); + result.AppendLine( "From [Sample] [a] " ); result.Append( "Where ([a].[Email] Is Null Or [a].[Email]='')" ); //执行 @@ -395,7 +395,7 @@ public void TestIsNotEmpty() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [a].[Email] " ); - result.AppendLine( "From [Sample] As [a] " ); + result.AppendLine( "From [Sample] [a] " ); result.Append( "Where [a].[Email] Is Not Null And [a].[Email]<>''" ); //执行 @@ -419,7 +419,7 @@ public void TestBetween_1() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [a].[Email] " ); - result.AppendLine( "From [Sample] As [a] " ); + result.AppendLine( "From [Sample] [a] " ); result.Append( "Where [a].[B]>=@_p_0 And [a].[B]<@_p_1" ); //执行 @@ -441,7 +441,7 @@ public void TestBetween_2() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [a].[Email] " ); - result.AppendLine( "From [Sample] As [a] " ); + result.AppendLine( "From [Sample] [a] " ); result.Append( "Where [a].[B]>=@_p_0 And [a].[B]<@_p_1" ); //执行 @@ -463,7 +463,7 @@ public void TestBetween_3() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [a].[Email] " ); - result.AppendLine( "From [Sample] As [a] " ); + result.AppendLine( "From [Sample] [a] " ); result.Append( "Where [a].[B]>=@_p_0 And [a].[B]<@_p_1" ); //执行 @@ -485,7 +485,7 @@ public void TestBetween_4() { //结果 var result = new StringBuilder(); result.AppendLine( "Select [a].[Email] " ); - result.AppendLine( "From [Sample] As [a] " ); + result.AppendLine( "From [Sample] [a] " ); result.Append( "Where [a].[B]>=@_p_0 And [a].[B]<@_p_1" ); //日期 diff --git a/test/Util.TestShare.Oracle/EntityTypeConfigurations/CustomerConfiguration.cs b/test/Util.TestShare.Oracle/EntityTypeConfigurations/CustomerConfiguration.cs index e9d013e79..5a2dbd713 100644 --- a/test/Util.TestShare.Oracle/EntityTypeConfigurations/CustomerConfiguration.cs +++ b/test/Util.TestShare.Oracle/EntityTypeConfigurations/CustomerConfiguration.cs @@ -16,14 +16,14 @@ public void Configure( EntityTypeBuilder builder ) { ConfigTable( builder ); ConfigId( builder ); ConfigProperties( builder ); - //InitData( builder ); + InitData( builder ); } /// /// 配置表 /// private void ConfigTable( EntityTypeBuilder builder ) { - builder.ToTable( "Customer" ).HasComment( "客户" ); + builder.ToTable( "Customer",t => t.HasComment( "客户" ) ); } /// diff --git a/test/Util.TestShare.Oracle/EntityTypeConfigurations/OperationLogConfiguration.cs b/test/Util.TestShare.Oracle/EntityTypeConfigurations/OperationLogConfiguration.cs index a85415b1c..878c2fd0e 100644 --- a/test/Util.TestShare.Oracle/EntityTypeConfigurations/OperationLogConfiguration.cs +++ b/test/Util.TestShare.Oracle/EntityTypeConfigurations/OperationLogConfiguration.cs @@ -21,7 +21,7 @@ public void Configure( EntityTypeBuilder builder ) { /// 配置表 /// private void ConfigTable( EntityTypeBuilder builder ) { - builder.ToTable( "OperationLog" ).HasComment( "操作日志" ); + builder.ToTable( "OperationLog",t => t.HasComment( "操作日志" ) ); } /// diff --git a/test/Util.TestShare.Oracle/EntityTypeConfigurations/OrderConfiguration.cs b/test/Util.TestShare.Oracle/EntityTypeConfigurations/OrderConfiguration.cs index de27bea6e..2e974caff 100644 --- a/test/Util.TestShare.Oracle/EntityTypeConfigurations/OrderConfiguration.cs +++ b/test/Util.TestShare.Oracle/EntityTypeConfigurations/OrderConfiguration.cs @@ -22,7 +22,7 @@ public void Configure( EntityTypeBuilder builder ) { /// 配置表 /// private void ConfigTable( EntityTypeBuilder builder ) { - builder.ToTable( "Order" ).HasComment( "订单" ); + builder.ToTable( "Order",t => t.HasComment( "订单" ) ); } /// diff --git a/test/Util.TestShare.Oracle/EntityTypeConfigurations/OrderItemConfiguration.cs b/test/Util.TestShare.Oracle/EntityTypeConfigurations/OrderItemConfiguration.cs index 5f3103ec6..aa54d6e8b 100644 --- a/test/Util.TestShare.Oracle/EntityTypeConfigurations/OrderItemConfiguration.cs +++ b/test/Util.TestShare.Oracle/EntityTypeConfigurations/OrderItemConfiguration.cs @@ -22,7 +22,7 @@ public void Configure( EntityTypeBuilder builder ) { /// 配置表 /// private void ConfigTable( EntityTypeBuilder builder ) { - builder.ToTable( "OrderItem" ).HasComment( "订单明细" ); + builder.ToTable( "OrderItem",t => t.HasComment( "订单明细" ) ); } /// diff --git a/test/Util.TestShare.Oracle/EntityTypeConfigurations/PostConfiguration.cs b/test/Util.TestShare.Oracle/EntityTypeConfigurations/PostConfiguration.cs index bb6c6da89..1475e06fa 100644 --- a/test/Util.TestShare.Oracle/EntityTypeConfigurations/PostConfiguration.cs +++ b/test/Util.TestShare.Oracle/EntityTypeConfigurations/PostConfiguration.cs @@ -21,7 +21,7 @@ public void Configure( EntityTypeBuilder builder ) { /// 配置表 /// private void ConfigTable( EntityTypeBuilder builder ) { - builder.ToTable( "Post" ).HasComment( "贴子" ); + builder.ToTable( "Post",t => t.HasComment( "贴子" ) ); } /// diff --git a/test/Util.TestShare.Oracle/EntityTypeConfigurations/ProductConfiguration.cs b/test/Util.TestShare.Oracle/EntityTypeConfigurations/ProductConfiguration.cs index bb057341b..9481d67d8 100644 --- a/test/Util.TestShare.Oracle/EntityTypeConfigurations/ProductConfiguration.cs +++ b/test/Util.TestShare.Oracle/EntityTypeConfigurations/ProductConfiguration.cs @@ -23,7 +23,7 @@ public void Configure( EntityTypeBuilder builder ) { /// 配置表 /// private void ConfigTable( EntityTypeBuilder builder ) { - builder.ToTable( "Product" ).HasComment( "产品" ); + builder.ToTable( "Product",t => t.HasComment( "产品" ) ); } /// diff --git a/test/Util.TestShare.Oracle/EntityTypeConfigurations/TagConfiguration.cs b/test/Util.TestShare.Oracle/EntityTypeConfigurations/TagConfiguration.cs index f6b3a0f09..933ab60ba 100644 --- a/test/Util.TestShare.Oracle/EntityTypeConfigurations/TagConfiguration.cs +++ b/test/Util.TestShare.Oracle/EntityTypeConfigurations/TagConfiguration.cs @@ -21,7 +21,7 @@ public void Configure( EntityTypeBuilder builder ) { /// 配置表 /// private void ConfigTable( EntityTypeBuilder builder ) { - builder.ToTable( "Tag" ).HasComment( "标签" ); + builder.ToTable( "Tag",t => t.HasComment( "标签" ) ); } ///