Skip to content

Commit

Permalink
添加 Dapper Oracle SqlQuery
Browse files Browse the repository at this point in the history
  • Loading branch information
UtilCore committed Nov 9, 2023
1 parent 7d5f37a commit 33eb174
Show file tree
Hide file tree
Showing 63 changed files with 2,458 additions and 97 deletions.
2 changes: 1 addition & 1 deletion build/version.props
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<PropertyGroup>
<VersionMajor>7</VersionMajor>
<VersionMinor>1</VersionMinor>
<VersionPatch>68</VersionPatch>
<VersionPatch>70</VersionPatch>
<VersionPrefix>$(VersionMajor).$(VersionMinor).$(VersionPatch)</VersionPrefix>
<VersionSuffix></VersionSuffix>
</PropertyGroup>
Expand Down
22 changes: 13 additions & 9 deletions src/Util.Core/Helpers/Convert.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace Util.Helpers;
namespace Util.Helpers;

/// <summary>
/// 类型转换
Expand Down Expand Up @@ -188,7 +188,7 @@ public static bool ToBool( object input ) {
/// <param name="input">输入值</param>
public static bool? ToBoolOrNull( object input ) {
var value = input.SafeString();
switch ( value ) {
switch( value ) {
case "1":
return true;
case "0":
Expand Down Expand Up @@ -219,7 +219,7 @@ public static DateTime ToDateTime( object input ) {
/// <param name="input">输入值</param>
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;
}
Expand All @@ -245,6 +245,10 @@ public static Guid ToGuid( object input ) {
/// </summary>
/// <param name="input">输入值</param>
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;
}

Expand Down Expand Up @@ -318,11 +322,11 @@ public static T To<T>( 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<T>( 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<T>( element.GetRawText(), options );
}
Expand All @@ -343,11 +347,11 @@ public static T To<T>( object input ) {
/// <param name="data">对象</param>
public static IDictionary<string, object> ToDictionary( object data ) {
var result = new Dictionary<string, object>();
if ( data == null )
if( data == null )
return result;
if ( data is IEnumerable<KeyValuePair<string, object>> dic )
if( data is IEnumerable<KeyValuePair<string, object>> dic )
return new Dictionary<string, object>( 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 );
}
Expand Down
4 changes: 1 addition & 3 deletions src/Util.Data.Core/DefaultDatabase.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System.Data;

namespace Util.Data;
namespace Util.Data;

/// <summary>
/// 数据库信息
Expand Down
2 changes: 1 addition & 1 deletion src/Util.Data.Dapper.Core/Sql/SqlQueryBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Expand Down
37 changes: 37 additions & 0 deletions src/Util.Data.Dapper.Oracle/05-Util.Data.Dapper.Oracle.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>$(NetTargetFramework)</TargetFramework>
<PackageIcon>icon.jpg</PackageIcon>
<AssemblyName>Util.Data.Dapper.Oracle</AssemblyName>
<RootNamespace>Util.Data.Dapper</RootNamespace>
<Description>Util.Data.Dapper.Oracle是Util应用框架基于Dapper的数据访问封装类库,用于处理Oracle数据库</Description>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<OutputPath></OutputPath>
<DocumentationFile>.\obj\Debug\$(NetTargetFramework)\Util.Data.Dapper.Oracle.xml</DocumentationFile>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<OutputPath></OutputPath>
<DocumentationFile>.\obj\Release\$(NetTargetFramework)\Util.Data.Dapper.Oracle.xml</DocumentationFile>
</PropertyGroup>

<ItemGroup>
<None Include="..\..\build\icon.jpg">
<Pack>True</Pack>
<Visible>False</Visible>
<PackagePath></PackagePath>
</None>
</ItemGroup>

<ItemGroup>
<PackageReference Include="Oracle.ManagedDataAccess.Core" Version="3.21.120" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\Util.Data.Dapper.Core\01-Util.Data.Dapper.Core.csproj" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using Util.Data.Dapper.TypeHandlers;
using Util.Infrastructure;

namespace Util.Data.Dapper.Infrastructure;

/// <summary>
/// Oracle Dapper服务注册器
/// </summary>
public class OracleDapperServiceRegistrar : IServiceRegistrar {
/// <summary>
/// 获取服务名
/// </summary>
public static string ServiceName => "Util.Data.Dapper.Infrastructure.OracleDapperServiceRegistrar";

/// <summary>
/// 排序号
/// </summary>
public int OrderId => 812;

/// <summary>
/// 是否启用
/// </summary>
public bool Enabled => ServiceRegistrarConfig.IsEnabled( ServiceName );

/// <summary>
/// 注册服务
/// </summary>
/// <param name="serviceContext">服务上下文</param>
public Action Register( ServiceContext serviceContext ) {
SqlMapper.RemoveTypeMap( typeof( Guid ) );
SqlMapper.RemoveTypeMap( typeof( Guid? ) );
SqlMapper.AddTypeHandler( typeof( Guid ), new GuidTypeHandler() );
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using Util.Infrastructure;

namespace Util.Data.Dapper.Infrastructure;

/// <summary>
/// Oracle Dapper服务注册器配置扩展
/// </summary>
public static class ServiceRegistrarConfigExtensions {
/// <summary>
/// 启用Oracle Dapper服务注册器
/// </summary>
/// <param name="config">服务注册器配置</param>
public static ServiceRegistrarConfig EnableOracleDapperServiceRegistrar( this ServiceRegistrarConfig config ) {
ServiceRegistrarConfig.Enable( OracleDapperServiceRegistrar.ServiceName );
return config;
}

/// <summary>
///禁用Oracle Dapper服务注册器
/// </summary>
/// <param name="config">服务注册器配置</param>
public static ServiceRegistrarConfig DisableOracleDapperServiceRegistrar( this ServiceRegistrarConfig config ) {
ServiceRegistrarConfig.Disable( OracleDapperServiceRegistrar.ServiceName );
return config;
}
}
127 changes: 127 additions & 0 deletions src/Util.Data.Dapper.Oracle/Sql/AppBuilderExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
using Util.Configs;
using Util.Data.Sql;

namespace Util.Data.Dapper.Sql;

/// <summary>
/// Oracle数据库操作扩展
/// </summary>
public static class AppBuilderExtensions {

#region AddOracleSqlQuery(配置Oracle Sql查询对象)

/// <summary>
/// 配置Oracle Sql查询对象
/// </summary>
/// <param name="builder">应用生成器</param>
public static IAppBuilder AddOracleSqlQuery( this IAppBuilder builder ) {
return builder.AddOracleSqlQuery( "" );
}

/// <summary>
/// 配置Oracle Sql查询对象
/// </summary>
/// <param name="builder">应用生成器</param>
/// <param name="connection">数据库连接字符串</param>
public static IAppBuilder AddOracleSqlQuery( this IAppBuilder builder, string connection ) {
return builder.AddOracleSqlQuery<ISqlQuery, OracleSqlQuery>( connection );
}

/// <summary>
/// 配置Oracle Sql查询对象
/// </summary>
/// <param name="builder">应用生成器</param>
/// <param name="setupAction">配置操作</param>
public static IAppBuilder AddOracleSqlQuery( this IAppBuilder builder, Action<SqlOptions> setupAction ) {
return builder.AddOracleSqlQuery<ISqlQuery, OracleSqlQuery>( setupAction );
}

/// <summary>
/// 配置Oracle Sql查询对象
/// </summary>
/// <param name="builder">应用生成器</param>
/// <param name="connection">数据库连接字符串</param>
public static IAppBuilder AddOracleSqlQuery<TService, TImplementation>( this IAppBuilder builder, string connection )
where TService : ISqlQuery
where TImplementation : OracleSqlQueryBase, TService {
return builder.AddOracleSqlQuery<TService, TImplementation>( t => t.ConnectionString( connection ) );
}

/// <summary>
/// 配置Oracle Sql查询对象
/// </summary>
/// <param name="builder">应用生成器</param>
/// <param name="setupAction">配置操作</param>
public static IAppBuilder AddOracleSqlQuery<TService, TImplementation>( this IAppBuilder builder, Action<SqlOptions> setupAction )
where TService : ISqlQuery
where TImplementation : OracleSqlQueryBase, TService {
var options = new SqlOptions<TImplementation>();
setupAction?.Invoke( options );
builder.CheckNull( nameof( builder ) );
builder.Host.ConfigureServices( ( context, services ) => {
services.TryAddTransient( typeof( TService ), typeof( TImplementation ) );
services.TryAddSingleton( typeof( SqlOptions<TImplementation> ), ( sp ) => options );
} );
return builder;
}

#endregion

#region AddOracleSqlExecutor(配置Oracle Sql执行器)

/// <summary>
/// 配置Oracle Sql执行器
/// </summary>
/// <param name="builder">应用生成器</param>
public static IAppBuilder AddOracleSqlExecutor( this IAppBuilder builder ) {
return builder.AddOracleSqlExecutor( "" );
}

/// <summary>
/// 配置Oracle Sql执行器
/// </summary>
/// <param name="builder">应用生成器</param>
/// <param name="connection">数据库连接字符串</param>
public static IAppBuilder AddOracleSqlExecutor( this IAppBuilder builder, string connection ) {
return builder.AddOracleSqlExecutor<ISqlExecutor, OracleSqlExecutor>( connection );
}

/// <summary>
/// 配置Oracle Sql执行器
/// </summary>
/// <param name="builder">应用生成器</param>
/// <param name="setupAction">配置操作</param>
public static IAppBuilder AddOracleSqlExecutor( this IAppBuilder builder, Action<SqlOptions> setupAction ) {
return builder.AddOracleSqlExecutor<ISqlExecutor, OracleSqlExecutor>( setupAction );
}

/// <summary>
/// 配置Oracle Sql执行器
/// </summary>
/// <param name="builder">应用生成器</param>
/// <param name="connection">数据库连接字符串</param>
public static IAppBuilder AddOracleSqlExecutor<TService, TImplementation>( this IAppBuilder builder, string connection )
where TService : ISqlExecutor
where TImplementation : OracleSqlExecutorBase, TService {
return builder.AddOracleSqlExecutor<TService, TImplementation>( t => t.ConnectionString( connection ) );
}

/// <summary>
/// 配置Oracle Sql执行器
/// </summary>
/// <param name="builder">应用生成器</param>
/// <param name="setupAction">配置操作</param>
public static IAppBuilder AddOracleSqlExecutor<TService, TImplementation>( this IAppBuilder builder, Action<SqlOptions> setupAction )
where TService : ISqlExecutor
where TImplementation : OracleSqlExecutorBase, TService {
var options = new SqlOptions<TImplementation>();
setupAction?.Invoke( options );
builder.Host.ConfigureServices( ( context, services ) => {
services.TryAddTransient( typeof( TService ), typeof( TImplementation ) );
services.TryAddSingleton( typeof( SqlOptions<TImplementation> ), ( sp ) => options );
} );
return builder;
}

#endregion
}
35 changes: 35 additions & 0 deletions src/Util.Data.Dapper.Oracle/Sql/Builders/OracleColumnCache.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using Util.Data.Sql.Builders.Caches;

namespace Util.Data.Dapper.Sql.Builders;

/// <summary>
/// Oracle列缓存
/// </summary>
public class OracleColumnCache : ColumnCacheBase {
/// <summary>
/// 列名缓存
/// </summary>
private readonly ConcurrentDictionary<int, string> _cache;

/// <summary>
/// 封闭构造方法
/// </summary>
private OracleColumnCache() : base( OracleDialect.Instance ) {
_cache = new ConcurrentDictionary<int, string>();
}

/// <summary>
/// Oracle列缓存实例
/// </summary>
public static readonly IColumnCache Instance = new OracleColumnCache();

/// <inheritdoc />
public override string GetSafeColumns( string columns ) {
return _cache.GetOrAdd( columns.GetHashCode(), key => NormalizeColumns( columns ) );
}

/// <inheritdoc />
public override string GetSafeColumn( string column ) {
return _cache.GetOrAdd( column.GetHashCode(), key => NormalizeColumn( column ) );
}
}
35 changes: 35 additions & 0 deletions src/Util.Data.Dapper.Oracle/Sql/Builders/OracleDialect.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using Util.Data.Sql.Builders;
using Util.Data.Sql.Builders.Core;

namespace Util.Data.Dapper.Sql.Builders;

/// <summary>
/// Oracle方言
/// </summary>
public class OracleDialect : DialectBase {
/// <summary>
/// 封闭构造方法
/// </summary>
private OracleDialect() {
}

/// <summary>
/// Oracle方言实例
/// </summary>
public static readonly IDialect Instance = new OracleDialect();

/// <inheritdoc />
public override string GetOpeningIdentifier() {
return "\"";
}

/// <inheritdoc />
public override string GetClosingIdentifier() {
return "\"";
}

/// <inheritdoc />
public override string GetPrefix() {
return ":";
}
}
Loading

0 comments on commit 33eb174

Please sign in to comment.