15 changed files with 502 additions and 431 deletions
			
			
		@ -1,38 +0,0 @@ | 
				
			|||||
<Project Sdk="Microsoft.NET.Sdk"> | 
					 | 
				
			||||
 | 
					 | 
				
			||||
	<PropertyGroup> | 
					 | 
				
			||||
		<OutputType>Exe</OutputType> | 
					 | 
				
			||||
		<!--<TargetFrameworks>net20</TargetFrameworks>--> | 
					 | 
				
			||||
		<!--<TargetFrameworks>net40</TargetFrameworks>--> | 
					 | 
				
			||||
		<!--<TargetFrameworks>net461</TargetFrameworks>--> | 
					 | 
				
			||||
		<TargetFrameworks>net461</TargetFrameworks> | 
					 | 
				
			||||
	</PropertyGroup> | 
					 | 
				
			||||
 | 
					 | 
				
			||||
	<!-- .NET Framework 4.6.1 --> | 
					 | 
				
			||||
	<PropertyGroup Condition="'$(TargetFramework)'=='net461'"> | 
					 | 
				
			||||
		<AssemblyTitle>$(AssemblyName) - .NET Framework 4.6.1</AssemblyTitle> | 
					 | 
				
			||||
		<DefineConstants>NETFX;NET461;NET45;HAVE_ASYNC;HAVE_BIG_INTEGER;$(DefineConstants);$(AdditionalConstants)</DefineConstants> | 
					 | 
				
			||||
	</PropertyGroup> | 
					 | 
				
			||||
	<ItemGroup Condition="'$(TargetFramework)'=='net461'"> | 
					 | 
				
			||||
		<Reference Include="CustomMarshalers" /> | 
					 | 
				
			||||
		<Reference Include="Microsoft.CSharp" /> | 
					 | 
				
			||||
		<Reference Include="PresentationCore" /> | 
					 | 
				
			||||
		<Reference Include="System.Core" /> | 
					 | 
				
			||||
		<Reference Include="System.Configuration" /> | 
					 | 
				
			||||
		<Reference Include="System.Design" /> | 
					 | 
				
			||||
		<Reference Include="System.Drawing" /> | 
					 | 
				
			||||
		<Reference Include="System.Management" /> | 
					 | 
				
			||||
		<Reference Include="System.Runtime.Caching" /> | 
					 | 
				
			||||
		<Reference Include="System.Security" /> | 
					 | 
				
			||||
		<Reference Include="System.Speech" /> | 
					 | 
				
			||||
		<Reference Include="System.Transactions" /> | 
					 | 
				
			||||
		<Reference Include="System.Web" /> | 
					 | 
				
			||||
		<Reference Include="System.Windows.Forms" /> | 
					 | 
				
			||||
		<Reference Include="WindowsBase" /> | 
					 | 
				
			||||
	</ItemGroup> | 
					 | 
				
			||||
 | 
					 | 
				
			||||
	<ItemGroup> | 
					 | 
				
			||||
		<ProjectReference Include="..\Apewer\Apewer.csproj" /> | 
					 | 
				
			||||
	</ItemGroup> | 
					 | 
				
			||||
 | 
					 | 
				
			||||
</Project> | 
					 | 
				
			||||
@ -1,11 +0,0 @@ | 
				
			|||||
namespace Apewer.Run | 
					 | 
				
			||||
{ | 
					 | 
				
			||||
 | 
					 | 
				
			||||
    class Program | 
					 | 
				
			||||
    { | 
					 | 
				
			||||
 | 
					 | 
				
			||||
        static void Main(string[] args) => RuntimeUtility.InvokePublicClass(); | 
					 | 
				
			||||
 | 
					 | 
				
			||||
    } | 
					 | 
				
			||||
 | 
					 | 
				
			||||
} | 
					 | 
				
			||||
@ -0,0 +1,223 @@ | 
				
			|||||
 | 
					using System; | 
				
			||||
 | 
					using System.Collections.Generic; | 
				
			||||
 | 
					using System.Text; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					namespace Apewer.Source | 
				
			||||
 | 
					{ | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    /// <summary>ORM 帮助程序。</summary>
 | 
				
			||||
 | 
					    public static class OrmHelper | 
				
			||||
 | 
					    { | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        private static List<T> Convert<T>(List<IRecord> input) where T : IRecord | 
				
			||||
 | 
					        { | 
				
			||||
 | 
					            if (input == null) return null; | 
				
			||||
 | 
					            var output = new List<T>(input.Count); | 
				
			||||
 | 
					            foreach (var record in input) | 
				
			||||
 | 
					            { | 
				
			||||
 | 
					                if (record == null) continue; | 
				
			||||
 | 
					                var t = (T)record; | 
				
			||||
 | 
					                output.Add(t); | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					            return output; | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        private static Result<T> Convert<T>(Result<IRecord> input) where T : IRecord | 
				
			||||
 | 
					        { | 
				
			||||
 | 
					            if (input == null) return null; | 
				
			||||
 | 
					            var result = new Result<T>(); | 
				
			||||
 | 
					            result.Code = input.Code; | 
				
			||||
 | 
					            result.Exception = input.Exception; | 
				
			||||
 | 
					            result.Message = input.Message; | 
				
			||||
 | 
					            if (input.HasEntity) result.Entity = (T)input.Entity; | 
				
			||||
 | 
					            return result; | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        private static Result<List<T>> Convert<T>(Result<List<IRecord>> input) where T : IRecord | 
				
			||||
 | 
					        { | 
				
			||||
 | 
					            if (input == null) return null; | 
				
			||||
 | 
					            var result = new Result<List<T>>(); | 
				
			||||
 | 
					            result.Code = input.Code; | 
				
			||||
 | 
					            result.Exception = input.Exception; | 
				
			||||
 | 
					            result.Message = input.Message; | 
				
			||||
 | 
					            result.Entity = Convert<T>(input.Entity); | 
				
			||||
 | 
					            return result; | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        /// <summary>查询记录。</summary>
 | 
				
			||||
 | 
					        /// <param name="database">数据库对象。</param>
 | 
				
			||||
 | 
					        /// <param name="model">记录模型。</param>
 | 
				
			||||
 | 
					        /// <param name="sql">SQL 语句。</param>
 | 
				
			||||
 | 
					        public static Result<List<IRecord>> Query(IDatabase database, Type model, string sql) | 
				
			||||
 | 
					        { | 
				
			||||
 | 
					            if (database == null) return Result<List<IRecord>>.Error("数据库无效。"); | 
				
			||||
 | 
					            if (model == null) return Result<List<IRecord>>.Error("模型类型无效。"); | 
				
			||||
 | 
					            if (string.IsNullOrEmpty(sql)) return Result<List<IRecord>>.Error("SQL 语句无效。"); | 
				
			||||
 | 
					            using (var query = database.Query(sql) as Query) | 
				
			||||
 | 
					            { | 
				
			||||
 | 
					                if (query == null) return Result<List<IRecord>>.Error("查询实例无效。"); | 
				
			||||
 | 
					                if (query.Exception != null) return Result<List<IRecord>>.Error(query.Exception); | 
				
			||||
 | 
					                try | 
				
			||||
 | 
					                { | 
				
			||||
 | 
					                    var list = query.Fill(model); | 
				
			||||
 | 
					                    return new Result<List<IRecord>>(list); | 
				
			||||
 | 
					                } | 
				
			||||
 | 
					                catch (Exception ex) | 
				
			||||
 | 
					                { | 
				
			||||
 | 
					                    return Result<List<IRecord>>.Error(ex); | 
				
			||||
 | 
					                } | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        /// <summary>查询记录。</summary>
 | 
				
			||||
 | 
					        /// <typeparam name="T">记录模型。</typeparam>
 | 
				
			||||
 | 
					        /// <param name="database">数据库对象。</param>
 | 
				
			||||
 | 
					        /// <param name="sql">SQL 语句。</param>
 | 
				
			||||
 | 
					        public static Result<List<T>> Query<T>(IDatabase database, string sql) where T : IRecord | 
				
			||||
 | 
					        { | 
				
			||||
 | 
					            return Convert<T>(Query(database, typeof(T), sql)); | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        /// <summary>查询记录。</summary>
 | 
				
			||||
 | 
					        /// <param name="database">数据库对象。</param>
 | 
				
			||||
 | 
					        /// <param name="model">记录模型。</param>
 | 
				
			||||
 | 
					        /// <param name="sqlGetter">生成 SQL 语句的函数,传入参数为表名。</param>
 | 
				
			||||
 | 
					        public static Result<List<IRecord>> Query(IDatabase database, Type model, Func<string, string> sqlGetter) | 
				
			||||
 | 
					        { | 
				
			||||
 | 
					            if (sqlGetter == null) return Result<List<IRecord>>.Error("SQL 语句获取函数无效。"); | 
				
			||||
 | 
					            try | 
				
			||||
 | 
					            { | 
				
			||||
 | 
					                var tableName = TableStructure.ParseModel(model).Table; | 
				
			||||
 | 
					                if (string.IsNullOrEmpty(tableName)) return Result<List<IRecord>>.Error("表名无效。"); | 
				
			||||
 | 
					                return Query(database, model, sqlGetter(tableName)); | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					            catch (Exception ex) | 
				
			||||
 | 
					            { | 
				
			||||
 | 
					                return Result<List<IRecord>>.Error(ex); | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        /// <summary>查询记录。</summary>
 | 
				
			||||
 | 
					        /// <typeparam name="T">记录模型。</typeparam>
 | 
				
			||||
 | 
					        /// <param name="database">数据库对象。</param>
 | 
				
			||||
 | 
					        /// <param name="sqlGetter">生成 SQL 语句的函数,传入参数为表名。</param>
 | 
				
			||||
 | 
					        public static Result<List<T>> Query<T>(IDatabase database, Func<string, string> sqlGetter) where T : IRecord | 
				
			||||
 | 
					        { | 
				
			||||
 | 
					            return Convert<T>(Query(database, typeof(T), sqlGetter)); | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        /// <summary>获取具有指定主键的记录。</summary>
 | 
				
			||||
 | 
					        /// <param name="database">数据库对象。</param>
 | 
				
			||||
 | 
					        /// <param name="model">记录模型。</param>
 | 
				
			||||
 | 
					        /// <param name="key">主键。</param>
 | 
				
			||||
 | 
					        /// <param name="sqlGetter">生成 SQL 语句的函数,传入参数为表名和主键值。</param>
 | 
				
			||||
 | 
					        public static Result<IRecord> Get(IDatabase database, Type model, string key, Func<string, string, string> sqlGetter) | 
				
			||||
 | 
					        { | 
				
			||||
 | 
					            if (sqlGetter == null) return Result<IRecord>.Error("SQL 语句获取函数无效。"); | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					            var safetyKey = TextUtility.SafeKey(key); | 
				
			||||
 | 
					            if (string.IsNullOrEmpty(safetyKey)) return Result<IRecord>.Error("主键无效。"); | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					            string tableName; | 
				
			||||
 | 
					            try | 
				
			||||
 | 
					            { | 
				
			||||
 | 
					                tableName = TableStructure.ParseModel(model).Table; | 
				
			||||
 | 
					                if (string.IsNullOrEmpty(tableName)) return Result<IRecord>.Error("表名无效。"); | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					            catch (Exception ex) | 
				
			||||
 | 
					            { | 
				
			||||
 | 
					                return new Result<IRecord>(ex); | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					            var sql = sqlGetter(tableName, safetyKey); | 
				
			||||
 | 
					            var list = Query(database, model, sql); | 
				
			||||
 | 
					            var result = new Result<IRecord>(); | 
				
			||||
 | 
					            result.Code = list.Code; | 
				
			||||
 | 
					            result.Exception = list.Exception; | 
				
			||||
 | 
					            result.Message = list.Message; | 
				
			||||
 | 
					            result.Entity = list.Entity.SafeFirst(); | 
				
			||||
 | 
					            return result; | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        /// <summary>获取具有指定主键的记录。</summary>
 | 
				
			||||
 | 
					        /// <typeparam name="T">记录模型。</typeparam>
 | 
				
			||||
 | 
					        /// <param name="database">数据库对象。</param>
 | 
				
			||||
 | 
					        /// <param name="key">主键。</param>
 | 
				
			||||
 | 
					        /// <param name="sqlGetter">生成 SQL 语句的函数,传入参数为表名和主键值。</param>
 | 
				
			||||
 | 
					        public static Result<T> Get<T>(IDatabase database, string key, Func<string, string, string> sqlGetter) where T : IRecord | 
				
			||||
 | 
					        { | 
				
			||||
 | 
					            return Convert<T>(Get(database, typeof(T), key, sqlGetter)); | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        /// <summary>获取主键。</summary>
 | 
				
			||||
 | 
					        /// <param name="database">数据库对象。</param>
 | 
				
			||||
 | 
					        /// <param name="model">记录模型。</param>
 | 
				
			||||
 | 
					        /// <param name="sqlGetter">生成 SQL 语句的函数,传入参数为表名。</param>
 | 
				
			||||
 | 
					        public static Result<List<string>> Keys(IDatabase database, Type model, Func<string, string> sqlGetter) | 
				
			||||
 | 
					        { | 
				
			||||
 | 
					            if (database == null) return Result<List<string>>.Error("数据库无效。"); | 
				
			||||
 | 
					            if (model == null) return Result<List<string>>.Error("模型类型无效。"); | 
				
			||||
 | 
					            if (sqlGetter == null) return Result<List<string>>.Error("SQL 语句获取函数无效。"); | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					            var tableStructure = null as TableStructure; | 
				
			||||
 | 
					            try | 
				
			||||
 | 
					            { | 
				
			||||
 | 
					                tableStructure = TableStructure.ParseModel(model); | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					            catch (Exception ex) | 
				
			||||
 | 
					            { | 
				
			||||
 | 
					                return Result<List<string>>.Error(ex); | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					            var tableName = tableStructure.Table; | 
				
			||||
 | 
					            if (string.IsNullOrEmpty(tableName)) return Result<List<string>>.Error("表名无效。"); | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					            // var keyName = null as string;
 | 
				
			||||
 | 
					            // foreach (var column in tableStructure.Columns)
 | 
				
			||||
 | 
					            // {
 | 
				
			||||
 | 
					            //     if (column.Key == "Key")
 | 
				
			||||
 | 
					            //     {
 | 
				
			||||
 | 
					            //         keyName = column.Value.Field;
 | 
				
			||||
 | 
					            //         break;
 | 
				
			||||
 | 
					            //     }
 | 
				
			||||
 | 
					            // }
 | 
				
			||||
 | 
					            // if (string.IsNullOrEmpty(keyName)) return Result<List<string>>.Error("主键字段无效。");
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					            // var sql = sqlGetter(tableName, keyName);
 | 
				
			||||
 | 
					            var sql = sqlGetter(tableName); | 
				
			||||
 | 
					            var query = null as IQuery; | 
				
			||||
 | 
					            try | 
				
			||||
 | 
					            { | 
				
			||||
 | 
					                query = database.Query(sql); | 
				
			||||
 | 
					                if (query == null) return Result<List<string>>.Error("查询实例无效。"); | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					                var list = new List<string>(query.Rows); | 
				
			||||
 | 
					                for (var r = 0; r < query.Rows; r++) | 
				
			||||
 | 
					                { | 
				
			||||
 | 
					                    var key = TextUtility.SafeKey(query.Text(r)); | 
				
			||||
 | 
					                    if (string.IsNullOrEmpty(key)) continue; | 
				
			||||
 | 
					                    list.Add(key); | 
				
			||||
 | 
					                } | 
				
			||||
 | 
					                query.Dispose(); | 
				
			||||
 | 
					                list.Capacity = list.Count; | 
				
			||||
 | 
					                return new Result<List<string>>(list); | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					            catch (Exception ex) | 
				
			||||
 | 
					            { | 
				
			||||
 | 
					                RuntimeUtility.Dispose(query); | 
				
			||||
 | 
					                return Result<List<string>>.Error(ex); | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        /// <summary>获取主键。</summary>
 | 
				
			||||
 | 
					        /// <typeparam name="T">记录模型。</typeparam>
 | 
				
			||||
 | 
					        /// <param name="database">数据库对象。</param>
 | 
				
			||||
 | 
					        /// <param name="sqlGetter">生成 SQL 语句的函数,传入参数为表名。</param>
 | 
				
			||||
 | 
					        public static Result<List<string>> Keys<T>(IDatabase database, Func<string, string> sqlGetter) where T : IRecord | 
				
			||||
 | 
					        { | 
				
			||||
 | 
					            return Keys(database, typeof(T), sqlGetter); | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue