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