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