达梦数据库适配ServiceStack框架

2023-10-16 19:30

本文主要是介绍达梦数据库适配ServiceStack框架,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

注:达梦的驱动版本请使用2023第四季度及以后版本驱动才可以

ServiceStack介绍

ServiceStack官网: https://github.com/ServiceStack/ServiceStack
ServiceStack是一个开源的十分流行的WebService框架,引用其官网的介绍:“Service Stack is a high-performance .NET web services platform that simplifies the development of high-performance REST (JSON, XML, JSV, HTML, MsgPack, ProtoBuf, CSV) and WCF SOAP Web Services.”
“ServiceStack是一个高性能的.NET Web Service 平台,他能够简化开发高性能的REST (支持JSON,XML,JSV,HTML,MsgPack,ProtoBuf,CSV等消息格式)以及WCF SOAP风格的WebService”。

代码段

sql语句

CREATE TABLE "SYSDBA"."TestTab"
(
"Id" VARCHAR(200) NOT NULL,
"Name" VARCHAR(200),
NOT CLUSTER PRIMARY KEY("Id")) STORAGE(ON "MAIN", CLUSTERBTR) ;

Program.cs

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using NLog;
using NLog.Web;
using ServiceStack.DataAnnotations;
using ServiceStack.OrmLite;namespace Yidea.Resource.Host
{public class Program{public static void Main(string[] args){Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);var encoding = Encoding.GetEncoding("gb18030");Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();var dbFactory = new OrmLiteConnectionFactory("Server=192.15.1.17:5236; UserId=SYSDBA; PWD=SYSDBA; SCHEMA=SYSDBA;", GetSqlDialect());var Db = dbFactory.CreateDbConnection();Db.Open();var aa = Db.Select<TestTab>(o => o.Id == "zzzzzz").First();aa.Name = "xiugai";Db.Save(aa);/*          var company = Db.Select<Company>().ToList();foreach (var item in company){item.Name = item.Name + item.Id;}Db.SaveAll(company);//var tab = new TestTab() { Id = "bb", Name = "bbbbbbb" };//Db.Save(tab);List<TestTab> list = Db.Select<TestTab>().ToList();foreach (var item in list){item.Name = item.Id + item.Name;}Db.SaveAll(list);*/}[Alias("vCompany")]public class Company{[PrimaryKey][AutoIncrement]public int Id { get; set; }public string Code { get; set; }public string Name { get; set; }[Alias("EId")]public int EnterpriseId { get; set; }[Alias("Pid")]public int? SuperiorCompanyId { get; set; }[Alias("IsDisabled")]public bool Disabled { get; set; }[Alias("IdPath")]public string Hierarchy { get; set; }}private static IOrmLiteDialectProvider GetSqlDialect(){var sqlProvider = new DmaProvider();sqlProvider.GetStringConverter().UseUnicode = true;sqlProvider.GetDateTimeConverter().DateStyle = DateTimeKind.Local;return sqlProvider;}public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>WebHost.CreateDefaultBuilder(args).UseUrls("http://*:12345").UseKestrel(opt =>{opt.AddServerHeader = false;opt.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(5);}).UseContentRoot(Directory.GetCurrentDirectory()).UseIISIntegration().UseStartup<Startup>().ConfigureAppConfiguration((builderContext, config) =>{IHostingEnvironment env = builderContext.HostingEnvironment;config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);config.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);}).UseNLog();}
}

DmaProvider.cs

using Dm;
using ServiceStack.DataAnnotations;
using ServiceStack;
using ServiceStack.OrmLite;
using ServiceStack.OrmLite.SqlServer.Converters;
using ServiceStack.OrmLite.SqlServer;
using ServiceStack.Text;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using ServiceStack.Data;
using System.Collections;namespace Yidea.Resource.Host
{public class DmaProvider : OrmLiteDialectProviderBase<DmaProvider>{public static DmaProvider Instance = new();public DmaProvider(){base.AutoIncrementDefinition = "IDENTITY(1,1)";base.SelectIdentitySql = "SELECT SCOPE_IDENTITY()";base.InitColumnTypeMap();RowVersionConverter = new SqlServerRowVersionConverter();base.RegisterConverter<string>(new SqlServerStringConverter());base.RegisterConverter<bool>(new SqlServerBoolConverter());base.RegisterConverter<sbyte>(new SqlServerSByteConverter());base.RegisterConverter<ushort>(new SqlServerUInt16Converter());base.RegisterConverter<uint>(new SqlServerUInt32Converter());base.RegisterConverter<ulong>(new SqlServerUInt64Converter());base.RegisterConverter<float>(new SqlServerFloatConverter());base.RegisterConverter<double>(new SqlServerDoubleConverter());base.RegisterConverter<decimal>(new SqlServerDecimalConverter());base.RegisterConverter<DateTime>(new SqlServerDateTimeConverter());base.RegisterConverter<Guid>(new SqlServerGuidConverter());base.RegisterConverter<byte[]>(new SqlServerByteArrayConverter());this.Variables = new Dictionary<string, string>{{ OrmLiteVariables.SystemUtc, "SYSUTCDATETIME()" },{ OrmLiteVariables.MaxText, "VARCHAR(MAX)" },{ OrmLiteVariables.MaxTextUnicode, "NVARCHAR(MAX)" },{ OrmLiteVariables.True, SqlBool(true) },{ OrmLiteVariables.False, SqlBool(false) },};}public override string GetQuotedValue(string paramValue){return (StringConverter.UseUnicode ? "N'" : "'") + paramValue.Replace("'", "''") + "'";}public override IDbConnection CreateConnection(string connectionString, Dictionary<string, string> options){DmConnection conn = new DmConnection();conn.ConnectionString = connectionString;return conn;}public override SqlExpression<T> SqlExpression<T>() => new SqlServerExpression<T>(this);// public override IDbDataParameter CreateParam() => new SqlParameter();public override IDbDataParameter CreateParam() => new DmParameter();private const string DefaultSchema = "dbo";public override string ToTableNamesStatement(string schema){var sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'";return sql + " AND TABLE_SCHEMA = {0}".SqlFmt(this, schema ?? DefaultSchema);}public override string ToTableNamesWithRowCountsStatement(bool live, string schema){var schemaSql = " AND s.Name = {0}".SqlFmt(this, schema ?? DefaultSchema);var sql = @"SELECT t.NAME, p.rows FROM sys.tables t INNER JOIN sys.schemas s ON t.schema_id = s.schema_id INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_idWHERE t.is_ms_shipped = 0 " + schemaSql + " GROUP BY t.NAME, p.Rows";return sql;}//public override List<string> GetSchemas(IDbCommand dbCmd)//{//    var sql = "SELECT DISTINCT TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'";//    return dbCmd.SqlColumn<string>(sql);//}//public override Dictionary<string, List<string>> GetSchemaTables(IDbCommand dbCmd)//{//    var sql = "SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'";//    return dbCmd.Lookup<string, string>(sql);//}public override bool DoesSchemaExist(IDbCommand dbCmd, string schemaName){var sql = $"SELECT count(*) FROM sys.schemas WHERE name = '{schemaName.SqlParam()}'";var result = dbCmd.ExecLongScalar(sql);return result > 0;}//public override async Task<bool> DoesSchemaExistAsync(IDbCommand dbCmd, string schemaName, CancellationToken token = default)//{//    var sql = $"SELECT count(*) FROM sys.schemas WHERE name = '{schemaName.SqlParam()}'";//    var result = await dbCmd.ExecLongScalarAsync(sql, token);//    return result > 0;//}public override string ToCreateSchemaStatement(string schemaName){var sql = $"CREATE SCHEMA [{GetSchemaName(schemaName)}]";return sql;}//public override string ToCreateSavePoint(string name) => $"SAVE TRANSACTION {name}";//public override string ToReleaseSavePoint(string name) => null;//public override string ToRollbackSavePoint(string name) => $"ROLLBACK TRANSACTION {name}";public override bool DoesTableExist(IDbCommand dbCmd, string tableName, string schema = null){var sql = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = {0}".SqlFmt(this, tableName);if (schema != null)sql += " AND TABLE_SCHEMA = {0}".SqlFmt(this, schema);elsesql += " AND TABLE_SCHEMA <> 'Security'";var result = dbCmd.ExecLongScalar(sql);return result > 0;}//public override async Task<bool> DoesTableExistAsync(IDbCommand dbCmd, string tableName, string schema = null, CancellationToken token = default)//{//    var sql = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = {0}"//        .SqlFmt(this, tableName);//    if (schema != null)//        sql += " AND TABLE_SCHEMA = {0}".SqlFmt(this, schema);//    else//        sql += " AND TABLE_SCHEMA <> 'Security'";//    var result = await dbCmd.ExecLongScalarAsync(sql, token);//    return result > 0;//}public override bool DoesColumnExist(IDbConnection db, string columnName, string tableName, string schema = null){var sql = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tableName AND COLUMN_NAME = @columnName".SqlFmt(this, tableName, columnName);if (schema != null)sql += " AND TABLE_SCHEMA = @schema";var result = db.SqlScalar<long>(sql, new { tableName, columnName, schema });return result > 0;}//public override async Task<bool> DoesColumnExistAsync(IDbConnection db, string columnName, string tableName, string schema = null,//    CancellationToken token = default)//{//    var sql = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tableName AND COLUMN_NAME = @columnName"//        .SqlFmt(this, tableName, columnName);//    if (schema != null)//        sql += " AND TABLE_SCHEMA = @schema";//    var result = await db.SqlScalarAsync<long>(sql, new { tableName, columnName, schema }, token: token);//    return result > 0;//}//public override string GetForeignKeyOnDeleteClause(ForeignKeyConstraint foreignKey)//{//    return "RESTRICT" == (foreignKey.OnDelete ?? "").ToUpper()//        ? ""//        : base.GetForeignKeyOnDeleteClause(foreignKey);//}//public override string GetForeignKeyOnUpdateClause(ForeignKeyConstraint foreignKey)//{//    return "RESTRICT" == (foreignKey.OnUpdate ?? "").ToUpper()//        ? ""//        : base.GetForeignKeyOnUpdateClause(foreignKey);//}public override string GetDropForeignKeyConstraints(ModelDefinition modelDef){//TODO: find out if this should go in base class?var sb = StringBuilderCache.Allocate();foreach (var fieldDef in modelDef.FieldDefinitions){if (fieldDef.ForeignKey != null){var foreignKeyName = fieldDef.ForeignKey.GetForeignKeyName(modelDef,OrmLiteUtils.GetModelDefinition(fieldDef.ForeignKey.ReferenceType),NamingStrategy,fieldDef);var tableName = GetQuotedTableName(modelDef);sb.AppendLine($"IF EXISTS (SELECT name FROM sys.foreign_keys WHERE name = '{foreignKeyName}')");sb.AppendLine("BEGIN");sb.AppendLine($"  ALTER TABLE {tableName} DROP {foreignKeyName};");sb.AppendLine("END");}}return StringBuilderCache.ReturnAndFree(sb);}//public override string ToAddColumnStatement(string schema, string table, FieldDefinition fieldDef) =>//    $"ALTER TABLE {GetQuotedTableName(table, schema)} ADD {GetColumnDefinition(fieldDef)};";//public override string ToAlterColumnStatement(string schema, string table, FieldDefinition fieldDef) =>//    $"ALTER TABLE {GetQuotedTableName(table, schema)} ALTER COLUMN {GetColumnDefinition(fieldDef)};";//public override string ToChangeColumnNameStatement(string schema, string table, FieldDefinition fieldDef, string oldColumn)//{//    var modelName = NamingStrategy.GetTableName(table);//    var objectName = $"{modelName}.{oldColumn}";//    return $"EXEC sp_rename {GetQuotedValue(objectName)}, {GetQuotedValue(fieldDef.FieldName)}, {GetQuotedValue("COLUMN")};";//}//public override string ToRenameColumnStatement(string schema, string table, string oldColumn, string newColumn)//{//    var modelName = NamingStrategy.GetTableName(table);//    var objectName = $"{modelName}.{GetQuotedColumnName(oldColumn)}";//    return $"EXEC sp_rename {GetQuotedValue(objectName)}, {GetQuotedColumnName(newColumn)}, 'COLUMN';";//}protected virtual string GetAutoIncrementDefinition(FieldDefinition fieldDef){return AutoIncrementDefinition;}public override string GetAutoIdDefaultValue(FieldDefinition fieldDef){return fieldDef.FieldType == typeof(Guid)? "newid()": null;}public override string GetColumnDefinition(FieldDefinition fieldDef){// https://msdn.microsoft.com/en-us/library/ms182776.aspxif (fieldDef.IsRowVersion)return $"{fieldDef.FieldName} rowversion NOT NULL";var fieldDefinition = ResolveFragment(fieldDef.CustomFieldDefinition) ??GetColumnTypeDefinition(fieldDef.ColumnType, fieldDef.FieldLength, fieldDef.Scale);var sql = StringBuilderCache.Allocate();sql.Append($"{GetQuotedColumnName(fieldDef.FieldName)} {fieldDefinition}");if (fieldDef.FieldType == typeof(string)){// https://msdn.microsoft.com/en-us/library/ms184391.aspxvar collation = fieldDef.PropertyInfo?.FirstAttribute<SqlServerCollateAttribute>()?.Collation;if (!string.IsNullOrEmpty(collation)){sql.Append($" COLLATE {collation}");}}if (fieldDef.IsPrimaryKey){sql.Append(" PRIMARY KEY");if (fieldDef.IsNonClustered)sql.Append(" NONCLUSTERED");if (fieldDef.AutoIncrement){sql.Append(" ").Append(GetAutoIncrementDefinition(fieldDef));}}else{sql.Append(fieldDef.IsNullable ? " NULL" : " NOT NULL");}if (fieldDef.IsUniqueConstraint){sql.Append(" UNIQUE");}var defaultValue = GetDefaultValue(fieldDef);if (!string.IsNullOrEmpty(defaultValue)){sql.AppendFormat(DefaultValueFormat, defaultValue);}return StringBuilderCache.ReturnAndFree(sql);}//public override void BulkInsert<T>(IDbConnection db, IEnumerable<T> objs, BulkInsertConfig config = null)//{//    config ??= new();//    //if (config.Mode == BulkInsertMode.Sql)//    //{//    //    base.BulkInsert(db, objs, config);//    //    return;//    //}//    var sqlConn = (SqlConnection)db.ToDbConnection();//    using var bulkCopy = new SqlBulkCopy(sqlConn);//    var modelDef = ModelDefinition<T>.Definition;//    bulkCopy.BatchSize = config.BatchSize;//    bulkCopy.DestinationTableName = modelDef.ModelName;//    var table = new DataTable();//    var fieldDefs = GetInsertFieldDefinitions(modelDef, insertFields: config.InsertFields);//    foreach (var fieldDef in fieldDefs)//    {//        if (ShouldSkipInsert(fieldDef) && !fieldDef.AutoId)//            continue;//        var columnName = NamingStrategy.GetColumnName(fieldDef.FieldName);//        bulkCopy.ColumnMappings.Add(columnName, columnName);//        var converter = GetConverterBestMatch(fieldDef);//        var colType = converter.DbType switch//        {//            DbType.String => typeof(string),//            DbType.Int32 => typeof(int),//            DbType.Int64 => typeof(long),//            _ => Nullable.GetUnderlyingType(fieldDef.FieldType) ?? fieldDef.FieldType//        };//        table.Columns.Add(columnName, colType);//    }//    foreach (var obj in objs)//    {//        var row = table.NewRow();//        foreach (var fieldDef in fieldDefs)//        {//            if (ShouldSkipInsert(fieldDef) && !fieldDef.AutoId)//                continue;//            var value = fieldDef.AutoId//                ? GetInsertDefaultValue(fieldDef)//                : fieldDef.GetValue(obj);//            var converter = GetConverterBestMatch(fieldDef);//            var dbValue = converter.ToDbValue(fieldDef.FieldType, value);//            var columnName = NamingStrategy.GetColumnName(fieldDef.FieldName);//            dbValue ??= DBNull.Value;//            row[columnName] = dbValue;//        }//        table.Rows.Add(row);//    }//    bulkCopy.WriteToServer(table);//}public override string ToInsertRowStatement(IDbCommand cmd, object objWithProperties, ICollection<string> insertFields = null){var sbColumnNames = StringBuilderCache.Allocate();var sbColumnValues = StringBuilderCacheAlt.Allocate();var sbReturningColumns = StringBuilderCacheAlt.Allocate();var tableType = objWithProperties.GetType();var modelDef = GetModel(tableType);var fieldDefs = GetInsertFieldDefinitions(modelDef, insertFields);foreach (var fieldDef in fieldDefs){if (ShouldReturnOnInsert(modelDef, fieldDef)){if (sbReturningColumns.Length > 0)sbReturningColumns.Append(",");sbReturningColumns.Append("INSERTED." + GetQuotedColumnName(fieldDef.FieldName));}if (ShouldSkipInsert(fieldDef) && !fieldDef.AutoId)continue;if (sbColumnNames.Length > 0)sbColumnNames.Append(",");if (sbColumnValues.Length > 0)sbColumnValues.Append(",");try{sbColumnNames.Append(GetQuotedColumnName(fieldDef.FieldName));sbColumnValues.Append(this.GetParam(SanitizeFieldNameForParamName(fieldDef.FieldName)));AddParameter(cmd, fieldDef);}catch (Exception ex){Log.Error("ERROR in ToInsertRowStatement(): " + ex.Message, ex);throw;}}foreach (var fieldDef in modelDef.AutoIdFields) // need to include any AutoId fields that weren't included {if (fieldDefs.Contains(fieldDef))continue;if (sbReturningColumns.Length > 0)sbReturningColumns.Append(",");sbReturningColumns.Append("INSERTED." + GetQuotedColumnName(fieldDef.FieldName));}var strReturning = StringBuilderCacheAlt.ReturnAndFree(sbReturningColumns);strReturning = strReturning.Length > 0 ? "OUTPUT " + strReturning + " " : "";var sql = sbColumnNames.Length > 0? $"INSERT INTO {GetQuotedTableName(modelDef)} ({StringBuilderCache.ReturnAndFree(sbColumnNames)}) " +strReturning +$"VALUES ({StringBuilderCacheAlt.ReturnAndFree(sbColumnValues)})": $"INSERT INTO {GetQuotedTableName(modelDef)} {strReturning} DEFAULT VALUES";return sql;}protected string Sequence(string schema, string sequence){if (schema == null)return GetQuotedName(sequence);var escapedSchema = NamingStrategy.GetSchemaName(schema).Replace(".", "\".\"");return GetQuotedName(escapedSchema)+ "."+ GetQuotedName(sequence);}protected override bool ShouldSkipInsert(FieldDefinition fieldDef) =>fieldDef.ShouldSkipInsert() || fieldDef.AutoId;protected virtual bool ShouldReturnOnInsert(ModelDefinition modelDef, FieldDefinition fieldDef) =>fieldDef.ReturnOnInsert || (fieldDef.IsPrimaryKey && fieldDef.AutoIncrement && HasInsertReturnValues(modelDef)) || fieldDef.AutoId;public override bool HasInsertReturnValues(ModelDefinition modelDef) =>modelDef.FieldDefinitions.Any(x => x.ReturnOnInsert || (x.AutoId && x.FieldType == typeof(Guid)));protected virtual bool SupportsSequences(FieldDefinition fieldDef) => false;//public override void EnableIdentityInsert<T>(IDbCommand cmd)//{//    var tableName = cmd.GetDialectProvider().GetQuotedTableName(ModelDefinition<T>.Definition);//    cmd.ExecNonQuery($"SET IDENTITY_INSERT {tableName} ON");//}//public override Task EnableIdentityInsertAsync<T>(IDbCommand cmd, CancellationToken token = default)//{//    var tableName = cmd.GetDialectProvider().GetQuotedTableName(ModelDefinition<T>.Definition);//    return cmd.ExecNonQueryAsync($"SET IDENTITY_INSERT {tableName} ON", null, token);//}//public override void DisableIdentityInsert<T>(IDbCommand cmd)//{//    var tableName = cmd.GetDialectProvider().GetQuotedTableName(ModelDefinition<T>.Definition);//    cmd.ExecNonQuery($"SET IDENTITY_INSERT {tableName} OFF");//}//public override Task DisableIdentityInsertAsync<T>(IDbCommand cmd, CancellationToken token = default)//{//    var tableName = cmd.GetDialectProvider().GetQuotedTableName(ModelDefinition<T>.Definition);//    return cmd.ExecNonQueryAsync($"SET IDENTITY_INSERT {tableName} OFF", null, token);//}public override bool PrepareParameterizedUpdateStatement<T>(IDbCommand cmd, ICollection<string> updateFields = null){var sql = StringBuilderCache.Allocate();var sqlFilter = StringBuilderCacheAlt.Allocate();var modelDef = ModelDefinition<T>.Definition;var hadRowVersion = false;var updateAllFields = updateFields == null || updateFields.Count == 0;cmd.Parameters.Clear();foreach (var fieldDef in modelDef.FieldDefinitions){if (fieldDef.ShouldSkipUpdate())continue;try{if ((fieldDef.IsPrimaryKey || fieldDef.IsRowVersion) && updateAllFields){if (sqlFilter.Length > 0)sqlFilter.Append(" AND ");AppendFieldCondition(sqlFilter, fieldDef, cmd);if (fieldDef.IsRowVersion)hadRowVersion = true;continue;}if (!updateAllFields && !updateFields.Contains(fieldDef.Name, StringComparer.OrdinalIgnoreCase))continue;if (sql.Length > 0)sql.Append(", ");sql.Append(GetQuotedColumnName(fieldDef.FieldName)).Append("=").Append(this.GetParam(SanitizeFieldNameForParamName(fieldDef.FieldName)));AddParameter(cmd, fieldDef);}catch (Exception ex){OrmLiteUtils.HandleException(ex, "ERROR in PrepareParameterizedUpdateStatement(): " + ex.Message);}}if (sql.Length > 0){var strFilter = StringBuilderCacheAlt.ReturnAndFree(sqlFilter);cmd.CommandText = $"UPDATE {GetQuotedTableName(modelDef)} " +$"SET {StringBuilderCache.ReturnAndFree(sql)} {(strFilter.Length > 0 ? "WHERE " + strFilter : "")}";cmd.CommandText = cmd.CommandText.ReplaceAll("@", ":");}else{cmd.CommandText = "";}return hadRowVersion;}public void SetValue(object instance, object value){if (instance is IDictionary d){d[Name] = value;return;}this.SetValueFn?.Invoke(instance, value);}public string Name { get; set; }public SetMemberDelegate SetValueFn { get; set; }public override void SetParameterValues<T>(IDbCommand dbCmd, object obj){var modelDef = GetModel(typeof(T));var fieldMap = GetFieldDefinitionMap(modelDef);foreach (IDataParameter p in dbCmd.Parameters){var fieldName = this.ToFieldName(p.ParameterName);fieldMap.TryGetValue(fieldName, out var fieldDef);if (fieldDef == null){if (ParamNameFilter != null){fieldDef = modelDef.GetFieldDefinition(name =>string.Equals(ParamNameFilter(name), fieldName, StringComparison.OrdinalIgnoreCase));}if (fieldDef == null)throw new ArgumentException($"Field Definition '{fieldName}' was not found");}if (fieldDef.AutoId && p.Value != null){var existingId = fieldDef.GetValue(obj);if (existingId is Guid existingGuid && existingGuid != default(Guid)){p.Value = existingGuid; // Use existing value if not default}//fieldDef.SetValue(obj, p.Value); //Auto populate default valuescontinue;}SetParameterValue(fieldDef, p, obj);}dbCmd.CommandText = dbCmd.CommandText.ReplaceAll("@", ":");var rowsUpdated = dbCmd.ExecNonQuery();}public virtual void SetParameterValue(FieldDefinition fieldDef, IDataParameter p, object obj){var value = GetValueOrDbNull(fieldDef, obj);p.Value = value;SetParameterSize(fieldDef, p);}protected virtual void SetParameterSize(FieldDefinition fieldDef, IDataParameter p){if (p.Value is string s && p is IDbDataParameter dataParam && dataParam.Size > 0 && s.Length > dataParam.Size){// db param Size set in StringConverterdataParam.Size = s.Length;}}protected virtual object GetValue(FieldDefinition fieldDef, object obj){return GetFieldValue(fieldDef, fieldDef.GetValue(obj));}public object GetFieldValue(FieldDefinition fieldDef, object value){if (value == null)return null;var converter = GetConverterBestMatch(fieldDef);try{return converter.ToDbValue(fieldDef.FieldType, value);}catch (Exception ex){Log.Error($"Error in {converter.GetType().Name}.ToDbValue() for field '{fieldDef.Name}' of Type '{fieldDef.FieldType}' with value '{value.GetType().Name}'", ex);throw;}}public object GetFieldValue(Type fieldType, object value){if (value == null)return null;var converter = GetConverterBestMatch(fieldType);try{return converter.ToDbValue(fieldType, value);}catch (Exception ex){Log.Error($"Error in {converter.GetType().Name}.ToDbValue() for field of Type '{fieldType}' with value '{value.GetType().Name}'", ex);throw;}}protected virtual object GetValueOrDbNull(FieldDefinition fieldDef, object obj){var value = GetValue(fieldDef, obj);if (value == null)return DBNull.Value;return value;}protected virtual object GetQuotedValueOrDbNull<T>(FieldDefinition fieldDef, object obj){var value = fieldDef.GetValue(obj);if (value == null)return DBNull.Value;var unquotedVal = GetQuotedValue(value, fieldDef.FieldType).TrimStart('\'').TrimEnd('\''); ;if (string.IsNullOrEmpty(unquotedVal))return DBNull.Value;return unquotedVal;}public override string ToUpdateStatement<T>(IDbCommand dbCmd, T item, ICollection<string> updateFields = null){return base.ToUpdateStatement(dbCmd, item, updateFields);}public override void PrepareParameterizedInsertStatement<T>(IDbCommand cmd, ICollection<string> insertFields = null){var sbColumnNames = StringBuilderCache.Allocate();var sbColumnValues = StringBuilderCacheAlt.Allocate();var sbReturningColumns = StringBuilderCacheAlt.Allocate();var modelDef = OrmLiteUtils.GetModelDefinition(typeof(T));cmd.Parameters.Clear();var fieldDefs = GetInsertFieldDefinitions(modelDef, insertFields);foreach (var fieldDef in fieldDefs){if (ShouldReturnOnInsert(modelDef, fieldDef)){if (sbReturningColumns.Length > 0)sbReturningColumns.Append(",");sbReturningColumns.Append("INSERTED." + GetQuotedColumnName(fieldDef.FieldName));}if ((ShouldSkipInsert(fieldDef) && !fieldDef.AutoId))continue;if (sbColumnNames.Length > 0)sbColumnNames.Append(",");if (sbColumnValues.Length > 0)sbColumnValues.Append(",");try{sbColumnNames.Append(GetQuotedColumnName(fieldDef.FieldName));if (SupportsSequences(fieldDef)){sbColumnValues.Append("NEXT VALUE FOR " + Sequence(NamingStrategy.GetSchemaName(modelDef), fieldDef.Sequence));}else{sbColumnValues.Append(this.GetParam(SanitizeFieldNameForParamName(fieldDef.FieldName)));AddParameter(cmd, fieldDef);}}catch (Exception ex){Log.Error("ERROR in PrepareParameterizedInsertStatement(): " + ex.Message, ex);throw;}}foreach (var fieldDef in modelDef.AutoIdFields) // need to include any AutoId fields that weren't included {if (fieldDefs.Contains(fieldDef))continue;if (sbReturningColumns.Length > 0)sbReturningColumns.Append(",");sbReturningColumns.Append("INSERTED." + GetQuotedColumnName(fieldDef.FieldName));}var strReturning = StringBuilderCacheAlt.ReturnAndFree(sbReturningColumns);strReturning = strReturning.Length > 0 ? "OUTPUT " + strReturning + " " : "";cmd.CommandText = sbColumnNames.Length > 0? $"INSERT INTO {GetQuotedTableName(modelDef)} ({StringBuilderCache.ReturnAndFree(sbColumnNames)}) {strReturning}" +$"VALUES ({StringBuilderCacheAlt.ReturnAndFree(sbColumnValues)})": $"INSERT INTO {GetQuotedTableName(modelDef)}{strReturning} DEFAULT VALUES";cmd.CommandText = cmd.CommandText.ReplaceAll("@", ":");}//public override void PrepareParameterizedInsertStatement<T>(IDbCommand cmd, ICollection<string> insertFields = null,//    Func<FieldDefinition, bool> shouldInclude = null)//{//    var sbColumnNames = StringBuilderCache.Allocate();//    var sbColumnValues = StringBuilderCacheAlt.Allocate();//    var sbReturningColumns = StringBuilderCacheAlt.Allocate();//    var modelDef = OrmLiteUtils.GetModelDefinition(typeof(T));//    cmd.Parameters.Clear();//    var fieldDefs = GetInsertFieldDefinitions(modelDef, insertFields);//    foreach (var fieldDef in fieldDefs)//    {//        if (ShouldReturnOnInsert(modelDef, fieldDef))//        {//            if (sbReturningColumns.Length > 0)//                sbReturningColumns.Append(",");//            sbReturningColumns.Append("INSERTED." + GetQuotedColumnName(fieldDef.FieldName));//        }//        if ((ShouldSkipInsert(fieldDef) && !fieldDef.AutoId)//            && shouldInclude?.Invoke(fieldDef) != true)//            continue;//        if (sbColumnNames.Length > 0)//            sbColumnNames.Append(",");//        if (sbColumnValues.Length > 0)//            sbColumnValues.Append(",");//        try//        {//            sbColumnNames.Append(GetQuotedColumnName(fieldDef.FieldName));//            if (SupportsSequences(fieldDef))//            {//                sbColumnValues.Append("NEXT VALUE FOR " + Sequence(NamingStrategy.GetSchemaName(modelDef), fieldDef.Sequence));//            }//            else//            {//                sbColumnValues.Append(this.GetParam(SanitizeFieldNameForParamName(fieldDef.FieldName), fieldDef.CustomInsert));//                AddParameter(cmd, fieldDef);//            }//        }//        catch (Exception ex)//        {//            Log.Error("ERROR in PrepareParameterizedInsertStatement(): " + ex.Message, ex);//            throw;//        }//    }//    foreach (var fieldDef in modelDef.AutoIdFields) // need to include any AutoId fields that weren't included //    {//        if (fieldDefs.Contains(fieldDef))//            continue;//        if (sbReturningColumns.Length > 0)//            sbReturningColumns.Append(",");//        sbReturningColumns.Append("INSERTED." + GetQuotedColumnName(fieldDef.FieldName));//    }//    var strReturning = StringBuilderCacheAlt.ReturnAndFree(sbReturningColumns);//    strReturning = strReturning.Length > 0 ? "OUTPUT " + strReturning + " " : "";//    cmd.CommandText = sbColumnNames.Length > 0//        ? $"INSERT INTO {GetQuotedTableName(modelDef)} ({StringBuilderCache.ReturnAndFree(sbColumnNames)}) {strReturning}" +//          $"VALUES ({StringBuilderCacheAlt.ReturnAndFree(sbColumnValues)})"//        : $"INSERT INTO {GetQuotedTableName(modelDef)}{strReturning} DEFAULT VALUES";//}//public override void PrepareParameterizedInsertStatement<T>(IDbCommand cmd, ICollection<string> insertFields = null,//    Func<FieldDefinition, bool> shouldInclude = null)//{//    var sbColumnNames = StringBuilderCache.Allocate();//    var sbColumnValues = StringBuilderCacheAlt.Allocate();//    var sbReturningColumns = StringBuilderCacheAlt.Allocate();//    var modelDef = OrmLiteUtils.GetModelDefinition(typeof(T));//    cmd.Parameters.Clear();//    var fieldDefs = GetInsertFieldDefinitions(modelDef, insertFields);//    foreach (var fieldDef in fieldDefs)//    {//        if (ShouldReturnOnInsert(modelDef, fieldDef))//        {//            if (sbReturningColumns.Length > 0)//                sbReturningColumns.Append(",");//            sbReturningColumns.Append("INSERTED." + GetQuotedColumnName(fieldDef.FieldName));//        }//        if ((ShouldSkipInsert(fieldDef) && !fieldDef.AutoId)//            && shouldInclude?.Invoke(fieldDef) != true)//            continue;//        if (sbColumnNames.Length > 0)//            sbColumnNames.Append(",");//        if (sbColumnValues.Length > 0)//            sbColumnValues.Append(",");//        try//        {//            sbColumnNames.Append(GetQuotedColumnName(fieldDef.FieldName));//            if (SupportsSequences(fieldDef))//            {//                sbColumnValues.Append("NEXT VALUE FOR " + Sequence(NamingStrategy.GetSchemaName(modelDef), fieldDef.Sequence));//            }//            else//            {//                sbColumnValues.Append(this.GetParam(SanitizeFieldNameForParamName(fieldDef.FieldName), fieldDef.CustomInsert));//                AddParameter(cmd, fieldDef);//            }//        }//        catch (Exception ex)//        {//            Log.Error("ERROR in PrepareParameterizedInsertStatement(): " + ex.Message, ex);//            throw;//        }//    }//    foreach (var fieldDef in modelDef.AutoIdFields) // need to include any AutoId fields that weren't included //    {//        if (fieldDefs.Contains(fieldDef))//            continue;//        if (sbReturningColumns.Length > 0)//            sbReturningColumns.Append(",");//        sbReturningColumns.Append("INSERTED." + GetQuotedColumnName(fieldDef.FieldName));//    }//    var strReturning = StringBuilderCacheAlt.ReturnAndFree(sbReturningColumns);//    strReturning = strReturning.Length > 0 ? "OUTPUT " + strReturning + " " : "";//    cmd.CommandText = sbColumnNames.Length > 0//        ? $"INSERT INTO {GetQuotedTableName(modelDef)} ({StringBuilderCache.ReturnAndFree(sbColumnNames)}) {strReturning}" +//          $"VALUES ({StringBuilderCacheAlt.ReturnAndFree(sbColumnValues)})"//        : $"INSERT INTO {GetQuotedTableName(modelDef)}{strReturning} DEFAULT VALUES";//}public override void PrepareInsertRowStatement<T>(IDbCommand dbCmd, Dictionary<string, object> args){var sbColumnNames = StringBuilderCache.Allocate();var sbColumnValues = StringBuilderCacheAlt.Allocate();var sbReturningColumns = StringBuilderCacheAlt.Allocate();var modelDef = OrmLiteUtils.GetModelDefinition(typeof(T));dbCmd.Parameters.Clear();//foreach (var entry in args)//{//    var fieldDef = modelDef.AssertFieldDefinition(entry.Key);//    if (ShouldReturnOnInsert(modelDef, fieldDef))//    {//        if (sbReturningColumns.Length > 0)//            sbReturningColumns.Append(",");//        sbReturningColumns.Append("INSERTED." + GetQuotedColumnName(fieldDef.FieldName));//    }//    if (ShouldSkipInsert(fieldDef) && !fieldDef.AutoId)//        continue;//    var value = entry.Value;//    if (sbColumnNames.Length > 0)//        sbColumnNames.Append(",");//    if (sbColumnValues.Length > 0)//        sbColumnValues.Append(",");//    try//    {//        sbColumnNames.Append(GetQuotedColumnName(fieldDef.FieldName));//        sbColumnValues.Append(this.GetInsertParam(dbCmd, value, fieldDef));//    }//    catch (Exception ex)//    {//        Log.Error("ERROR in PrepareInsertRowStatement(): " + ex.Message, ex);//        throw;//    }//}//var strReturning = StringBuilderCacheAlt.ReturnAndFree(sbReturningColumns);//strReturning = strReturning.Length > 0 ? "OUTPUT " + strReturning + " " : "";//dbCmd.CommandText = sbColumnNames.Length > 0//    ? $"INSERT INTO {GetQuotedTableName(modelDef)} ({StringBuilderCache.ReturnAndFree(sbColumnNames)}) {strReturning}" +//      $"VALUES ({StringBuilderCacheAlt.ReturnAndFree(sbColumnValues)})"//    : $"INSERT INTO {GetQuotedTableName(modelDef)} {strReturning}DEFAULT VALUES";}public enum QueryType{Select,Single,Scalar,}public override FieldDefinition[] GetInsertFieldDefinitions(ModelDefinition modelDef, ICollection<string> insertFields){return base.GetInsertFieldDefinitions(modelDef, insertFields);}protected override object GetInsertDefaultValue(FieldDefinition fieldDef){return base.GetInsertDefaultValue(fieldDef);}public override string ToInsertStatement<T>(IDbCommand dbCmd, T item, ICollection<string> insertFields = null){return base.ToInsertStatement(dbCmd, item, insertFields);}public override string ToSelectStatement(Type tableType, string sqlFilter, params object[] filterParams){var aa = base.ToSelectStatement(tableType, sqlFilter, filterParams).ReplaceAll("@", ":");return aa;}public override string ToSelectStatement(ModelDefinition modelDef, string selectExpression, string bodyExpression, string orderByExpression = null, int? offset = null, int? rows = null){var aa = base.ToSelectStatement(modelDef, selectExpression, bodyExpression, orderByExpression, offset, rows).ReplaceAll("@", ":");return aa;}//public override string ToSelectStatement(QueryType queryType, ModelDefinition modelDef,//    string selectExpression,//    string bodyExpression,//    string orderByExpression = null,//    int? offset = null,//    int? rows = null,//    ISet<string> tags = null)//{//    var sb = StringBuilderCache.Allocate();//    ApplyTags(sb, tags);//    sb.Append(selectExpression)//    .Append(bodyExpression);//    if (!offset.HasValue && !rows.HasValue || (queryType != QueryType.Select && rows != 1))//        return StringBuilderCache.ReturnAndFree(sb) + orderByExpression;//    if (offset is < 0)//        throw new ArgumentException($"Skip value:'{offset.Value}' must be>=0");//    if (rows is < 0)//        throw new ArgumentException($"Rows value:'{rows.Value}' must be>=0");//    var skip = offset ?? 0;//    var take = rows ?? int.MaxValue;//    var selectType = selectExpression.StartsWithIgnoreCase("SELECT DISTINCT") ? "SELECT DISTINCT" : "SELECT";//    //avoid Windowing function if unnecessary//    if (skip == 0)//    {//        var sql = StringBuilderCache.ReturnAndFree(sb) + orderByExpression;//        return SqlTop(sql, take, selectType);//    }//    // Required because ordering is done by Windowing function//    if (string.IsNullOrEmpty(orderByExpression))//    {//        if (modelDef.PrimaryKey == null)//            throw new ApplicationException("Malformed model, no PrimaryKey defined");//        orderByExpression = $"ORDER BY {this.GetQuotedColumnName(modelDef, modelDef.PrimaryKey)}";//    }//    var row = take == int.MaxValue ? take : skip + take;//    var ret = $"SELECT * FROM (SELECT {selectExpression.Substring(selectType.Length)}, ROW_NUMBER() OVER ({orderByExpression}) As RowNum {bodyExpression}) AS RowConstrainedResult WHERE RowNum > {skip} AND RowNum <= {row}";//    return ret;//}protected static string SqlTop(string sql, int take, string selectType = null){selectType ??= sql.StartsWithIgnoreCase("SELECT DISTINCT") ? "SELECT DISTINCT" : "SELECT";if (take == int.MaxValue)return sql;if (sql.Length < "SELECT".Length)return sql;return sql.Substring(0, sql.IndexOf(selectType)) + selectType + " TOP " + take + sql.Substring(sql.IndexOf(selectType) + selectType.Length);}//SELECT without RowNum and prefer aliases to be able to use in SELECT IN () Reference Queriespublic static string UseAliasesOrStripTablePrefixes(string selectExpression){if (selectExpression.IndexOf('.') < 0)return selectExpression;var sb = StringBuilderCache.Allocate();var selectToken = selectExpression.SplitOnFirst(' ');var tokens = selectToken[1].Split(',');foreach (var token in tokens){if (sb.Length > 0)sb.Append(", ");var field = token.Trim();var aliasParts = field.SplitOnLast(' ');if (aliasParts.Length > 1){sb.Append(" " + aliasParts[aliasParts.Length - 1]);continue;}var parts = field.SplitOnLast('.');if (parts.Length > 1){sb.Append(" " + parts[parts.Length - 1]);}else{sb.Append(" " + field);}}var sqlSelect = selectToken[0] + " " + StringBuilderCache.ReturnAndFree(sb).Trim();return sqlSelect;}public override string GetLoadChildrenSubSelect<From>(SqlExpression<From> expr){if (!expr.OrderByExpression.IsNullOrEmpty() && expr.Rows == null){var modelDef = expr.ModelDef;expr.Select(this.GetQuotedColumnName(modelDef, modelDef.PrimaryKey)).ClearLimits().OrderBy(""); //Invalid in Sub Selectsvar subSql = expr.ToSelectStatement();return subSql;}return base.GetLoadChildrenSubSelect(expr);}public override string SqlCurrency(string fieldOrValue, string currencySymbol) =>SqlConcat(new[] { "'" + currencySymbol + "'", $"CONVERT(VARCHAR, CONVERT(MONEY, {fieldOrValue}), 1)" });public override string SqlBool(bool value) => value ? "1" : "0";public override string SqlLimit(int? offset = null, int? rows = null) => rows == null && offset == null? "": rows != null? "OFFSET " + offset.GetValueOrDefault() + " ROWS FETCH NEXT " + rows + " ROWS ONLY": "OFFSET " + offset.GetValueOrDefault(int.MaxValue) + " ROWS";public override string SqlCast(object fieldOrValue, string castAs) =>castAs == Sql.VARCHAR? $"CAST({fieldOrValue} AS VARCHAR(MAX))": $"CAST({fieldOrValue} AS {castAs})";//public override string SqlRandom => "NEWID()";//public override void EnableForeignKeysCheck(IDbCommand cmd) => cmd.ExecNonQuery("EXEC sp_msforeachtable \"ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all\"");//public override Task EnableForeignKeysCheckAsync(IDbCommand cmd, CancellationToken token = default) =>//    cmd.ExecNonQueryAsync("EXEC sp_msforeachtable \"ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all\"", null, token);//public override void DisableForeignKeysCheck(IDbCommand cmd) => cmd.ExecNonQuery("EXEC sp_msforeachtable \"ALTER TABLE ? NOCHECK CONSTRAINT all\"");//public override Task DisableForeignKeysCheckAsync(IDbCommand cmd, CancellationToken token = default) =>//    cmd.ExecNonQueryAsync("EXEC sp_msforeachtable \"ALTER TABLE ? NOCHECK CONSTRAINT all\"", null, token);protected DbConnection Unwrap(IDbConnection db) => (DbConnection)db.ToDbConnection();protected DbCommand Unwrap(IDbCommand cmd) => (DbCommand)cmd.ToDbCommand();protected DbDataReader Unwrap(IDataReader reader) => (DbDataReader)reader;#if ASYNCpublic override Task OpenAsync(IDbConnection db, CancellationToken token = default)=> Unwrap(db).OpenAsync(token);public override Task<IDataReader> ExecuteReaderAsync(IDbCommand cmd, CancellationToken token = default)=> Unwrap(cmd).ExecuteReaderAsync(token).Then(x => (IDataReader)x);public override Task<int> ExecuteNonQueryAsync(IDbCommand cmd, CancellationToken token = default)=> Unwrap(cmd).ExecuteNonQueryAsync(token);public override Task<object> ExecuteScalarAsync(IDbCommand cmd, CancellationToken token = default)=> Unwrap(cmd).ExecuteScalarAsync(token);public override Task<bool> ReadAsync(IDataReader reader, CancellationToken token = default)=> Unwrap(reader).ReadAsync(token);public override async Task<List<T>> ReaderEach<T>(IDataReader reader, Func<T> fn, CancellationToken token = default){try{var to = new List<T>();while (await ReadAsync(reader, token).ConfigureAwait(false)){var row = fn();to.Add(row);}return to;}finally{reader.Dispose();}}public override async Task<Return> ReaderEach<Return>(IDataReader reader, Action fn, Return source, CancellationToken token = default){try{while (await ReadAsync(reader, token).ConfigureAwait(false)){fn();}return source;}finally{reader.Dispose();}}public override async Task<T> ReaderRead<T>(IDataReader reader, Func<T> fn, CancellationToken token = default){try{if (await ReadAsync(reader, token).ConfigureAwait(false))return fn();return default(T);}finally{reader.Dispose();}}
#endif//public override void InitConnection(IDbConnection dbConn)//{//    if (dbConn is OrmLiteConnection ormLiteConn && dbConn.ToDbConnection() is SqlConnection sqlConn)//        ormLiteConn.ConnectionId = sqlConn.ClientConnectionId;//    foreach (var command in ConnectionCommands)//    {//        using var cmd = dbConn.CreateCommand();//        cmd.ExecNonQuery(command);//    }//    OnOpenConnection?.Invoke(dbConn);//}}public enum BulkInsertMode{Optimized,Csv,Sql,}public class BulkInsertConfig{public int BatchSize { get; set; } = 1000;public BulkInsertMode Mode { get; set; } = BulkInsertMode.Csv;public ICollection<string>? InsertFields { get; set; } = null;}//public static class OrmLiteConfigExtensions//{//    private static Dictionary<Type, ModelDefinition> typeModelDefinitionMap = new Dictionary<Type, ModelDefinition>();//    internal static bool CheckForIdField(IEnumerable<PropertyInfo> objProperties)//    {//        // Not using Linq.Where() and manually iterating through objProperties just to avoid dependencies on System.Xml??//        foreach (var objProperty in objProperties)//        {//            if (objProperty.Name != OrmLiteConfig.IdField) continue;//            return true;//        }//        return false;//    }//    internal static ModelDefinition GetModelDefinition(this Type modelType)//    {//        if (typeModelDefinitionMap.TryGetValue(modelType, out var modelDef))//            return modelDef;//        if (modelType.IsValueType || modelType == typeof(string))//            return null;//        var modelAliasAttr = modelType.FirstAttribute<AliasAttribute>();//        var schemaAttr = modelType.FirstAttribute<SchemaAttribute>();//        var preCreates = modelType.AllAttributes<PreCreateTableAttribute>();//        var postCreates = modelType.AllAttributes<PostCreateTableAttribute>();//        var preDrops = modelType.AllAttributes<PreDropTableAttribute>();//        var postDrops = modelType.AllAttributes<PostDropTableAttribute>();//        string JoinSql(List<string> statements)//        {//            if (statements.Count == 0)//                return null;//            var sb = StringBuilderCache.Allocate();//            foreach (var sql in statements)//            {//                if (sb.Length > 0)//                    sb.AppendLine(";");//                sb.Append(sql);//            }//            var to = StringBuilderCache.ReturnAndFree(sb);//            return to;//        }//        modelDef = new ModelDefinition//        {//            ModelType = modelType,//            Name = modelType.Name,//            Alias = modelAliasAttr?.Name,//            Schema = schemaAttr?.Name,//            PreCreateTableSql = JoinSql(preCreates.Map(x => x.Sql)),//            PostCreateTableSql = JoinSql(postCreates.Map(x => x.Sql)),//            PreDropTableSql = JoinSql(preDrops.Map(x => x.Sql)),//            PostDropTableSql = JoinSql(postDrops.Map(x => x.Sql)),//        };//        modelDef.CompositeIndexes.AddRange(//            modelType.AllAttributes<CompositeIndexAttribute>().ToList());//        modelDef.UniqueConstraints.AddRange(//            modelType.AllAttributes<UniqueConstraintAttribute>().ToList());//        var objProperties = modelType.GetProperties(//            BindingFlags.Public | BindingFlags.Instance).ToList();//        var hasPkAttr = objProperties.Any(p => p.HasAttributeCached<PrimaryKeyAttribute>());//        var hasIdField = CheckForIdField(objProperties);//        var i = 0;//        var propertyInfoIdx = 0;//        foreach (var propertyInfo in objProperties)//        {//            if (propertyInfo.GetIndexParameters().Length > 0)//                continue; //Is Indexer//            var sequenceAttr = propertyInfo.FirstAttribute<SequenceAttribute>();//            var computeAttr = propertyInfo.FirstAttribute<ComputeAttribute>();//            var computedAttr = propertyInfo.FirstAttribute<ComputedAttribute>();//            var persistedAttr = propertyInfo.FirstAttribute<PersistedAttribute>();//            var customSelectAttr = propertyInfo.FirstAttribute<CustomSelectAttribute>();//            var decimalAttribute = propertyInfo.FirstAttribute<DecimalLengthAttribute>();//            var belongToAttribute = propertyInfo.FirstAttribute<BelongToAttribute>();//            var referenceAttr = propertyInfo.FirstAttribute<ReferenceAttribute>();//            var referenceFieldAttr = propertyInfo.FirstAttribute<ReferenceFieldAttribute>();//            var isRowVersion = propertyInfo.Name == ModelDefinition.RowVersionName//                               && (propertyInfo.PropertyType == typeof(ulong) || propertyInfo.PropertyType == typeof(byte[]));//            var isNullableType = propertyInfo.PropertyType.IsNullableType();//            var isNullable = (!propertyInfo.PropertyType.IsValueType//                              && !propertyInfo.HasAttributeNamed(nameof(RequiredAttribute)))//                             || isNullableType;//            var propertyType = isNullableType//                ? Nullable.GetUnderlyingType(propertyInfo.PropertyType)//                : propertyInfo.PropertyType;//            Type treatAsType = null;//            if (propertyType.IsEnum)//            {//                var enumKind = Converters.EnumConverter.GetEnumKind(propertyType);//                if (enumKind == EnumKind.Int)//                    treatAsType = Enum.GetUnderlyingType(propertyType);//                else if (enumKind == EnumKind.Char)//                    treatAsType = typeof(char);//            }//            var isReference = referenceAttr != null || referenceFieldAttr != null;//            var isIgnored = propertyInfo.HasAttributeCached<IgnoreAttribute>() || isReference || computedAttr != null;//            var isFirst = !isIgnored && i++ == 0;//            var isAutoId = propertyInfo.HasAttributeCached<AutoIdAttribute>();//            var isPrimaryKey = (!hasPkAttr && (propertyInfo.Name == OrmLiteConfig.IdField || (!hasIdField && isFirst)))//                               || propertyInfo.HasAttributeNamed(nameof(PrimaryKeyAttribute))//                               || isAutoId;//            var isAutoIncrement = isPrimaryKey && propertyInfo.HasAttributeCached<AutoIncrementAttribute>();//            if (isAutoIncrement && propertyInfo.PropertyType == typeof(Guid))//                throw new NotSupportedException($"[AutoIncrement] is only valid for integer properties for {modelType.Name}.{propertyInfo.Name} Guid property use [AutoId] instead");//            if (isAutoId && (propertyInfo.PropertyType == typeof(int) || propertyInfo.PropertyType == typeof(long)))//                throw new NotSupportedException($"[AutoId] is only valid for Guid properties for {modelType.Name}.{propertyInfo.Name} integer property use [AutoIncrement] instead");//            var aliasAttr = propertyInfo.FirstAttribute<AliasAttribute>();//            var indexAttr = propertyInfo.FirstAttribute<IndexAttribute>();//            var isIndex = indexAttr != null;//            var isUnique = isIndex && indexAttr.Unique;//            var stringLengthAttr = propertyInfo.CalculateStringLength(decimalAttribute);//            var defaultValueAttr = propertyInfo.FirstAttribute<DefaultAttribute>();//            var referencesAttr = propertyInfo.FirstAttribute<ReferencesAttribute>();//            var fkAttr = propertyInfo.FirstAttribute<ForeignKeyAttribute>();//            var customFieldAttr = propertyInfo.FirstAttribute<CustomFieldAttribute>();//            var chkConstraintAttr = propertyInfo.FirstAttribute<CheckConstraintAttribute>();//            var order = propertyInfoIdx++;//            if (customFieldAttr != null) order = customFieldAttr.Order;//            var fieldDefinition = new FieldDefinition//            {//                ModelDef = modelDef,//                Name = propertyInfo.Name,//                Alias = aliasAttr?.Name,//                FieldType = propertyType,//                FieldTypeDefaultValue = isNullable ? null : propertyType.GetDefaultValue(),//                TreatAsType = treatAsType,//                PropertyInfo = propertyInfo,//                IsNullable = isNullable,//                IsPrimaryKey = isPrimaryKey,//                AutoIncrement = isPrimaryKey && isAutoIncrement,//                AutoId = isAutoId,//                IsIndexed = !isPrimaryKey && isIndex,//                IsUniqueIndex = isUnique,//                IsClustered = indexAttr?.Clustered == true,//                IsNonClustered = indexAttr?.NonClustered == true,//                IndexName = indexAttr?.Name,//                IsRowVersion = isRowVersion,//                IgnoreOnInsert = propertyInfo.HasAttributeCached<IgnoreOnInsertAttribute>(),//                IgnoreOnUpdate = propertyInfo.HasAttributeCached<IgnoreOnUpdateAttribute>(),//                ReturnOnInsert = propertyInfo.HasAttributeCached<ReturnOnInsertAttribute>(),//                FieldLength = stringLengthAttr?.MaximumLength,//                DefaultValue = defaultValueAttr?.DefaultValue,//                CheckConstraint = chkConstraintAttr?.Constraint,//                IsUniqueConstraint = propertyInfo.HasAttributeCached<UniqueAttribute>(),//                ForeignKey = fkAttr == null//                    ? referencesAttr != null ? new ForeignKeyConstraint(referencesAttr.Type) : null//                    : new ForeignKeyConstraint(fkAttr.Type, fkAttr.OnDelete, fkAttr.OnUpdate, fkAttr.ForeignKeyName),//                IsReference = isReference,//                GetValueFn = propertyInfo.CreateGetter(),//                SetValueFn = propertyInfo.CreateSetter(),//                Sequence = sequenceAttr?.Name,//                IsComputed = computeAttr != null || computedAttr != null || customSelectAttr != null,//                IsPersisted = persistedAttr != null,//                ComputeExpression = computeAttr != null ? computeAttr.Expression : string.Empty,//                CustomSelect = customSelectAttr?.Sql,//                CustomInsert = propertyInfo.FirstAttribute<CustomInsertAttribute>()?.Sql,//                CustomUpdate = propertyInfo.FirstAttribute<CustomUpdateAttribute>()?.Sql,//                Scale = decimalAttribute?.Scale,//                BelongToModelName = belongToAttribute?.BelongToTableType.GetModelDefinition().ModelName,//                CustomFieldDefinition = customFieldAttr?.Sql,//                IsRefType = propertyType.IsRefType(),//                Order = order//            };//            if (referenceFieldAttr != null)//            {//                fieldDefinition.FieldReference = new FieldReference(fieldDefinition)//                {//                    RefModel = referenceFieldAttr.Model,//                    RefId = referenceFieldAttr.Id,//                    RefField = referenceFieldAttr.Field ?? propertyInfo.Name,//                };//            }//            if (isIgnored)//                modelDef.IgnoredFieldDefinitions.Add(fieldDefinition);//            else//                modelDef.FieldDefinitions.Add(fieldDefinition);//            if (isRowVersion)//                modelDef.RowVersion = fieldDefinition;//        }//        modelDef.AfterInit();//        Dictionary<Type, ModelDefinition> snapshot, newCache;//        do//        {//            snapshot = typeModelDefinitionMap;//            newCache = new Dictionary<Type, ModelDefinition>(typeModelDefinitionMap) { [modelType] = modelDef };//        } while (!ReferenceEquals(//                     Interlocked.CompareExchange(ref typeModelDefinitionMap, newCache, snapshot), snapshot));//        LicenseUtils.AssertValidUsage(LicenseFeature.OrmLite, QuotaType.Tables, typeModelDefinitionMap.Count);//        return modelDef;//    }//}/// <summary>/// Compute attribute./// Use to indicate that a property is a Calculated Field./// Use [Persisted] attribute to persist column/// </summary>[AttributeUsage(AttributeTargets.Property)]public class ComputeAttribute : AttributeBase{public string Expression { get; set; }public ComputeAttribute() : this(string.Empty) { }public ComputeAttribute(string expression){Expression = expression;}}/// <summary>/// Ignore calculated C# Property from being persisted in RDBMS Table/// </summary>[AttributeUsage(AttributeTargets.Property)]public class ComputedAttribute : AttributeBase { }/// <summary>/// Whether to persist calculated column/// </summary>[AttributeUsage(AttributeTargets.Property)]public class PersistedAttribute : AttributeBase { }/// <summary>/// Populate with a field from a foreign table in AutoQuery and Load* APIs/// </summary>[AttributeUsage(AttributeTargets.Property)]public class ReferenceFieldAttribute : AttributeBase{/// <summary>/// Foreign Key Table name/// </summary>public Type Model { get; set; }/// <summary>/// The Field name on current Model to use for the Foreign Key Table Lookup /// </summary>public string Id { get; set; }/// <summary>/// Specify Field to reference (if different from property name)/// </summary>public string Field { get; set; }public ReferenceFieldAttribute() { }public ReferenceFieldAttribute(Type model, string id){Model = model;Id = id;}public ReferenceFieldAttribute(Type model, string id, string field){Model = model;Id = id;Field = field;}}
}

这篇关于达梦数据库适配ServiceStack框架的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/220375

相关文章

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

mysql数据库分区的使用

《mysql数据库分区的使用》MySQL分区技术通过将大表分割成多个较小片段,提高查询性能、管理效率和数据存储效率,本文就来介绍一下mysql数据库分区的使用,感兴趣的可以了解一下... 目录【一】分区的基本概念【1】物理存储与逻辑分割【2】查询性能提升【3】数据管理与维护【4】扩展性与并行处理【二】分区的

IDEA如何切换数据库版本mysql5或mysql8

《IDEA如何切换数据库版本mysql5或mysql8》本文介绍了如何将IntelliJIDEA从MySQL5切换到MySQL8的详细步骤,包括下载MySQL8、安装、配置、停止旧服务、启动新服务以及... 目录问题描述解决方案第一步第二步第三步第四步第五步总结问题描述最近想开发一个新应用,想使用mysq

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

Java读取InfluxDB数据库的方法详解

《Java读取InfluxDB数据库的方法详解》本文介绍基于Java语言,读取InfluxDB数据库的方法,包括读取InfluxDB的所有数据库,以及指定数据库中的measurement、field、... 首先,创建一个Java项目,用于撰写代码。接下来,配置所需要的依赖;这里我们就选择可用于与Infl

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

SQL Server数据库磁盘满了的解决办法

《SQLServer数据库磁盘满了的解决办法》系统再正常运行,我还在操作中,突然发现接口报错,后续所有接口都报错了,一查日志发现说是数据库磁盘满了,所以本文记录了SQLServer数据库磁盘满了的解... 目录问题解决方法删除数据库日志设置数据库日志大小问题今http://www.chinasem.cn天发