Exemple #1
0
        public static Lut LoadCarTorque(IDataWrapper data, bool considerLimiter = true, int detalization = 100) {
            /* read torque curve and engine params */
            var torqueFile = data.GetLutFile("power.lut");
            if (torqueFile.IsEmptyOrDamaged()) throw new FileNotFoundException("Cannot load power.lut", "data/power.lut");

            var engine = data.GetIniFile("engine.ini");
            if (engine.IsEmptyOrDamaged()) throw new FileNotFoundException("Cannot load engine.ini", "data/engine.ini");

            /* prepare turbos and read controllers */
            var turbos = ReadTurbos(engine);
            for (var i = 0; i < turbos.Count; i++) {
                turbos[i].Controllers = ReadControllers(data.GetIniFile($"ctrl_turbo{i}.ini"));
            }

            /* prepare torque curve and limits */
            var torque = torqueFile.Values;
            torque.UpdateBoundingBox();

            var limit = considerLimiter && engine.ContainsKey("ENGINE_DATA") ? engine["ENGINE_DATA"].GetDouble("LIMITER", torque.MaxX) : torque.MaxX;
            var startFrom = considerLimiter ? 0d : torque.MinX;

            /* build smoothed line */
            var result = new Lut();

            var previousTorquePoint = 0;
            var previousRpm = 0d;
            for (var i = 0; i <= detalization; i++) {
                var rpm = detalization == 0 ? limit : (limit - startFrom) * i / detalization + startFrom;

                for (var j = previousTorquePoint; j < torque.Count; j++) {
                    var p = torque[j];

                    if (p.X > rpm) {
                        previousTorquePoint = j > 0 ? j - 1 : 0;
                        break;
                    }

                    if ((i == 0 || p.X > previousRpm) && p.X < rpm && p.X >= 0) {
                        result.Add(new LutPoint(p.X, ConsiderTurbo(turbos, p.X, p.Y)));
                    }
                }

                var baseTorque = torque.InterpolateLinear(rpm);
                result.Add(new LutPoint(rpm, ConsiderTurbo(turbos, rpm, baseTorque)));
                previousRpm = rpm;
            }

            return result.Optimize();
        }
        public bool BuildScript(Table table, IDataWrapper data, IDataFilter filter, out object script)
        {
            if (data.Read())
            {
                if (table is MaskingTable)
                {
                    BuildScriptWithMaskSQL(table, data, filter, out script);
                }
                else if (table.WriteMode == WriteModes.Append)
                {
                    if (isSupportCSV)
                    {
                        BuildScriptWithCSV(table, data, filter, out script);
                    }
                    else
                    {
                        BuildScriptWithInsertSQL(table, table.DestName, data, filter, out script);
                    }
                }
                else if (!isSupportCSV)
                {
                    BuildScriptWithReplaceSQL(table, table.DestName, data, filter, out script);
                }
                else
                {
                    BuildScriptWithMergeSQL(table, data, filter, out script);
                }

                return(true);
            }
            else
            {
                script = null;

                return(false);
            }
        }
        private void BuildScriptWithMaskSQL(Table table, IDataWrapper data, IDataFilter filter, out object script)
        {
            string        destTable = ProcessTableName(table.DestName, table.DestSchema);
            string        tmpTable  = ProcessTableName($"{ExtractTableName(table.DestName)}_{Guid.NewGuid():N}", table.DestSchema);
            StringBuilder sb        = new StringBuilder();

            string[] fields = ExcludeFields(table.DestFields, table.KeyFields, table.SkipFields);
            string   field  = ProcessFieldName(table.KeyFields[0]);

            sb.Append($"MERGE INTO {destTable} A USING {tmpTable} B ON (A.{field} = B.{field}");
            for (int i = 1; i < table.KeyFields.Length; i++)
            {
                field = ProcessFieldName(table.KeyFields[i]);
                sb.Append($" AND A.{field} = B.{field}");
            }
            sb.Append(")");

            field = ProcessFieldName(fields[0]);
            sb.AppendLine().Append($" WHEN MATCHED THEN UPDATE SET A.{field} = B.{field}");
            for (int i = 1; i < fields.Length; i++)
            {
                field = ProcessFieldName(fields[i]);
                sb.Append($", A.{field} = B.{field}");
            }
            sb.Append(";"); // 语句以分号结尾

            BuildScriptWithInsertSQL(table, tmpTable, data, filter, out script);
            script = new MergeScript()
            {
                PrepareSQL = $"CREATE GLOBAL TEMPORARY TABLE {tmpTable} ON COMMIT PRESERVE ROWS AS"
                             + $" SELECT {ProcessFieldNames(table.DestFields)} FROM {destTable} WHERE 1 = 0",
                InsertSQL = script as string,
                MergeSQL  = sb.ToString(),
                CleanSQL  = $"TRUNCATE TABLE {tmpTable}",
                CleanSQL2 = $"DROP TABLE {tmpTable}"
            };
        }
Exemple #4
0
        private void BuildScriptWithUpdate(IDataWrapper data, IDataFilter filter, out object script)
        {
            UpdateScript upd = new UpdateScript();

            if (data.GetValueByOriName(DocumentField) is BsonDocument doc)
            {
                object obj = filter.GetValue(data, -1, DocumentField);

                if (obj != DBNull.Value && obj != null)
                {
                    doc = obj as BsonDocument;
                }

                upd.Filter = $"{{\"{IDField}\":\"{doc["_id"]}\"}}";
                upd.Data.AddRange(doc);
                upd.Data.Remove(IDField);
            }
            else
            {
                for (int i = 0; i < data.FieldCount; i++)
                {
                    string field = data.GetFieldName(i);

                    if (IDField.Equals(field))
                    {
                        upd.Filter = $"{{\"{IDField}\":\"{filter.GetValue(data, i, data.GetFieldName(i))}\"}}";
                    }
                    else
                    {
                        upd.Data[data.GetFieldName(i)] = GetValue(filter.GetValue(data, i, data.GetFieldName(i)));
                    }
                }
            }

            script = upd;
        }
        private void BuildScriptWithInsertSQL(Table table, string tableName, IDataWrapper data, IDataFilter filter,
                                              out object script)
        {
            StringBuilder sb = new StringBuilder();

            string[] fields    = ExcludeFields(table.DestFields, table.SkipFields);
            string   fieldsSQL = ProcessFieldNames(fields);
            string   tableSQL  = ProcessTableName(tableName, table.DestSchema);

            data.MapFields(fields);

            sb.Append("INSERT ALL").AppendLine().Append($"INTO {tableSQL} ({fieldsSQL}) VALUES (")
            .Append(GetFmtValue(filter.GetValue(data, 0, fields[0])));
            for (int i = 1; i < fields.Length; i++)
            {
                sb.Append(", ").Append(GetFmtValue(filter.GetValue(data, i, fields[i])));
            }
            sb.Append(")");

            int r = 1;

            while (r < table.PageSize && data.Read())
            {
                r++;
                sb.AppendLine().Append($"INTO {tableSQL} ({fieldsSQL}) VALUES (")
                .Append(GetFmtValue(filter.GetValue(data, 0, fields[0])));
                for (int i = 1; i < fields.Length; i++)
                {
                    sb.Append(", ").Append(GetFmtValue(filter.GetValue(data, i, fields[i])));
                }
                sb.Append(")");
            }
            sb.AppendLine().Append("SELECT * FROM DUAL");

            script = sb.ToString();
        }
        private void BuildScriptWithMaskSQL(Table table, IDataWrapper data, IDataFilter filter, out object script)
        {
            string        destTable         = ProcessTableName(table.DestName, table.DestSchema);
            string        tmpTable          = $"{ExtractTableName(table.DestName)}_{Guid.NewGuid():N}";
            string        processedTmpTable = ProcessTableName(tmpTable, table.DestSchema);
            StringBuilder sb = new StringBuilder();

            string[] fields = ExcludeFields(table.DestFields, table.KeyFields, table.SkipFields);
            string   field  = ProcessFieldName(fields[0]);

            sb.Append($"update {destTable} A set {field} = B.{field}");
            for (int i = 1; i < fields.Length; i++)
            {
                field = ProcessFieldName(fields[i]);
                sb.Append($", {field} = B.{field}");
            }
            field = ProcessFieldName(table.KeyFields[0]);
            sb.Append($" from {processedTmpTable} B where A.{field} = B.{field}");
            for (int i = 1; i < table.KeyFields.Length; i++)
            {
                field = ProcessFieldName(table.KeyFields[i]);
                sb.Append($" and A.{field} = B.{field}");
            }

            BuildScriptWithDataTable(table, data, filter, out script);

            script = new MergeScript()
            {
                TableName  = tmpTable,
                PrepareSQL = $"select {ProcessFieldNames(table.DestFields)} into {processedTmpTable} from {destTable} where 1 = 0",
                Data       = (DataTable)script,
                UpdateSQL  = sb.ToString(),
                InsertSQL  = "",
                CleanSQL   = $"drop table {processedTmpTable}"
            };
        }
        private void BuildScriptWithMaskSQL(Table table, IDataWrapper data, IDataFilter filter, out object script)
        {
            string destTable = ProcessTableName(table.DestName, table.DestSchema);
            string tmpTable  = ProcessTableName($"{ExtractTableName(table.DestName)}_{Guid.NewGuid():N}", table.DestSchema);

            BuildScriptWithDataTable(table, data, filter, out script);

            StringBuilder sb = new StringBuilder();

            string[] fields = ExcludeFields(table.DestFields, table.KeyFields, table.SkipFields);
            string   field  = ProcessFieldName(fields[0]);

            sb.Append($"UPDATE {destTable} SET {field} = B.{field}");
            for (int i = 1; i < fields.Length; i++)
            {
                field = ProcessFieldName(fields[i]);
                sb.Append($", {field} = B.{field}");
            }
            field = ProcessFieldName(table.KeyFields[0]);
            sb.Append($" FROM {tmpTable} B WHERE {destTable}.{field} = B.{field}");
            for (int i = 1; i < table.KeyFields.Length; i++)
            {
                field = ProcessFieldName(table.KeyFields[i]);
                sb.Append($" AND {destTable}.{field} = B.{field}");
            }

            script = new MergeScript()
            {
                TableName  = tmpTable,
                PrepareSQL = $"SELECT {ProcessFieldNames(table.DestFields)} INTO {tmpTable} FROM {destTable} WHERE 1 = 0",
                Data       = ((AppendScript)script).Data,
                MergeSQL   = sb.ToString(),
                MergeSQL2  = "",
                CleanSQL   = $"DROP TABLE {tmpTable}"
            };
        }
Exemple #8
0
        private void IntegrateTaskWithScript(IntegrationTask task, Dictionary <string, object> parms, IDBMSWriter dest,
                                             out string failReason)
        {
            ConcurrentQueue <object> scripts = new ConcurrentQueue <object>();
            bool   read   = false;
            string reason = "取消操作";

            Parallel.ForEach(CreateThreadAction(), act =>
            {
                try
                {
                    // “读”线程:个别数据源读取失败,容错继续执行
                    if ("read".Equals(act))
                    {
                        uint bufSize       = task.ReadPages * 3;
                        IDataFilter filter = DataFilterFactory.GetFilterByName(task.Table.Filter);
                        IDataWrapper data  = null;

                        foreach (Database db in task.Sources)
                        {
                            if (status.Stopped || task.Status == DataStates.Error)
                            {
                                break;
                            }

                            uint fromRow = 1, toRow = task.ReadPages * task.Table.PageSize;
                            Dictionary <string, object> tmpParams = new Dictionary <string, object>(parms);

                            // 连接数据源
                            if (!Connect(task, db, out IDBMSReader source, null, out _))
                            {
                                task.Status = DataStates.RunningError;
                                reason      = task.ErrorMsg;
                                break;
                            }

                            while (true)
                            {
                                // 等待缓冲区可用
                                while (scripts.Count > bufSize && !status.Stopped && task.Status != DataStates.Error)
                                {
                                    Thread.Sleep(50);
                                }

                                if (status.Stopped || task.Status == DataStates.Error)
                                {
                                    break;
                                }

                                // 取数
                                if (source.QueryPage(task.Table, fromRow, toRow, WithEnums.NoLock, tmpParams, out data))
                                {
                                    try
                                    {
                                        object script = null;

                                        data.MapFields(task.Table.DestFields);
                                        while (dest.BuildScript(task.Table, data, filter, out script) &&
                                               !status.Stopped && task.Status != DataStates.Error)
                                        {
                                            scripts.Enqueue(script);
                                        }

                                        // 获取不到预期的记录数,作最后一页处理
                                        if (data.ReadCount != task.ReadPages * task.Table.PageSize ||
                                            status.Stopped)
                                        {
                                            break;
                                        }
                                    }
                                    finally
                                    {
                                        data.Close();
                                    }
                                }
                                else
                                {
                                    task.Status = DataStates.RunningError;
                                    reason      = source.LastError;
                                    break;
                                }

                                fromRow = toRow + 1;
                                toRow  += task.ReadPages * task.Table.PageSize;
                            }

                            source.Close();
                        }
Exemple #9
0
 public FlowServer UsingWrapper <T>(IDataWrapper <T> wrapper)
 {
     flowBinder.Using(wrapper);
     return(this);
 }
        public bool QueryPage(Table table, uint fromRow, uint toRow, WithEnums with, Dictionary <string, object> parms, out IDataWrapper reader)
        {
            StringBuilder sb = new StringBuilder();

            // 如果存在主键:
            // SELECT <B.fieldsSQL> FROM <tableName> B JOIN (SELECT <keyFields> FROM
            // (SELECT <keyFields>, ROW_NUMBER() OVER (ORDER BY <orderSQL>) AS "_RowNum_"
            // FROM <tableName>
            // {WHERE <whereSQL>}
            // ) A WHERE "_RowNum_" BETWEEN <fromRow> AND <toRow>) A ON <B.keyFields> = <A.keyFields>
            if (table.KeyFields.Length > 0)
            {
                string fieldsSQL          = ProcessFieldNames(table.SourceFields, "B");
                string tableName          = ProcessTableName(table.SourceName, table.SourceSchema);
                string tableNameWithB     = ProcessTableName(table.SourceName, table.SourceSchema, "B");
                string keyFields          = ProcessFieldNames(table.KeyFields);
                string keyFieldsWithAlias = ProcessFieldNames(table.KeyFields, ProcessTableName(table.SourceName, table.SourceSchema));
                string keyField           = ProcessFieldName(table.KeyFields[0]);

                sb.Append($"SELECT {fieldsSQL} FROM {tableNameWithB} JOIN (SELECT {keyFields} FROM")
                .Append($" (SELECT {keyFieldsWithAlias}, ROW_NUMBER() OVER (ORDER BY {table.OrderSQL})")
                .Append($" AS \"_RowNum_\" FROM {tableName}");
                if (!string.IsNullOrEmpty(table.WhereSQL))
                {
                    if (table.WhereSQL.IndexOf(" WEHRE ", StringComparison.OrdinalIgnoreCase) < 0)
                    {
                        sb.Append(" WHERE");
                    }
                    sb.Append($" {table.WhereSQL}");
                }
                sb.Append($") A WHERE A.\"_RowNum_\" BETWEEN {fromRow} AND {toRow}) A ON B.{keyField} = A.{keyField}");
                for (int i = 1; i < table.KeyFields.Length; i++)
                {
                    keyField = ProcessFieldName(table.KeyFields[i]);
                    sb.Append($" AND B.{keyField} = A.{keyField}");
                }

                return(Query(sb.ToString(), parms, out reader));
            }
            else
            {
                // 语法格式形如:
                // SELECT <fieldsSQL> FROM (SELECT ROW_NUMBER() OVER (ORDER BY <orderSQL>)
                // AS "_RowNum_", <fieldsSQL> FROM <tableName>
                // {WHERE <whereSQL>}
                // ) A WHERE A."_RowNum_" BETWEEN <fromRow> AND <toRow>
                string fieldsSQL       = ProcessFieldNames(table.SourceFields);
                string fieldsWithAlias = ProcessFieldNames(table.SourceFields, ProcessTableName(table.SourceName, table.SourceSchema));

                sb.Append($"SELECT {fieldsSQL} FROM (SELECT ROW_NUMBER() OVER (ORDER BY {table.OrderSQL})")
                .Append($" AS \"_RowNum_\", {fieldsWithAlias} FROM {ProcessTableName(table.SourceName, table.SourceSchema)}");
                if (!string.IsNullOrEmpty(table.WhereSQL))
                {
                    if (table.WhereSQL.IndexOf(" WHERE ", StringComparison.OrdinalIgnoreCase) < 0)
                    {
                        sb.Append(" WHERE");
                    }
                    sb.Append($" {table.WhereSQL}");
                }
                sb.Append($") A WHERE A.\"_RowNum_\" BETWEEN {fromRow} AND {toRow}");

                return(Query(sb.ToString(), parms, out reader));
            }
        }
        public static Lut LoadCarTorque([NotNull] IDataWrapper data, bool considerLimiter = true, int detalization = 100)
        {
            /* read torque curve and engine params */
            var torqueFile = data.GetLutFile("power.lut");

            if (torqueFile.IsEmptyOrDamaged())
            {
                throw new FileNotFoundException("Cannot load power.lut", "data/power.lut");
            }

            var engine = data.GetIniFile("engine.ini");

            if (engine.IsEmptyOrDamaged())
            {
                throw new FileNotFoundException("Cannot load engine.ini", "data/engine.ini");
            }

            /* prepare turbos and read controllers */
            var turbos = ReadTurbos(engine);

            for (var i = 0; i < turbos.Count; i++)
            {
                turbos[i].Controllers = ReadControllers(data.GetIniFile($"ctrl_turbo{i}.ini"));
            }

            /* prepare torque curve and limits */
            var torque = torqueFile.Values;

            torque.UpdateBoundingBox();

            var limit     = considerLimiter && engine.ContainsKey("ENGINE_DATA") ? engine["ENGINE_DATA"].GetDouble("LIMITER", torque.MaxX) : torque.MaxX;
            var startFrom = considerLimiter ? 0d : torque.MinX;

            /* build smoothed line */
            var result = new Lut();

            var previousTorquePoint = 0;
            var previousRpm         = 0d;

            for (var i = 0; i <= detalization; i++)
            {
                var rpm = detalization == 0 ? limit : (limit - startFrom) * i / detalization + startFrom;

                for (var j = previousTorquePoint; j < torque.Count; j++)
                {
                    var p = torque[j];

                    if (p.X > rpm)
                    {
                        previousTorquePoint = j > 0 ? j - 1 : 0;
                        break;
                    }

                    if ((i == 0 || p.X > previousRpm) && p.X < rpm && p.X >= 0)
                    {
                        result.Add(new LutPoint(p.X, ConsiderTurbo(turbos, p.X, p.Y)));
                    }
                }

                var baseTorque = torque.InterpolateLinear(rpm);
                result.Add(new LutPoint(rpm, ConsiderTurbo(turbos, rpm, baseTorque)));
                previousRpm = rpm;
            }

            return(Result(result));
        }
Exemple #12
0
 public DeleteCommandBase(IDataWrapper <TViewData> source, ICatalog <TViewData> target, Func <bool> condition)
     : base(new DeleteControllerBase <TViewData>(source, target), condition)
 {
 }
 bool ICollection <IDataWrapper <T> > .Remove(IDataWrapper <T> item)
 {
     throw new NotImplementedException();
 }
 protected PageViewModelBase(ICatalog <TViewData> catalog)
 {
     Catalog       = catalog ?? throw new ArgumentNullException(nameof(catalog));
     _itemSelected = null;
     _itemDetails  = null;
 }
 int IList <IDataWrapper <T> > .IndexOf(IDataWrapper <T> item)
 {
     throw new NotImplementedException();
 }
 void ICollection <IDataWrapper <T> > .Add(IDataWrapper <T> item)
 {
     throw new NotImplementedException();
 }
        public bool QueryPage(Table table, uint fromRow, uint toRow, WithEnums with, Dictionary <string, object> parms, out IDataWrapper reader)
        {
            StringBuilder sb = new StringBuilder();

            // 如果主键字段只有一个:
            // SELECT <fieldsSQL> FROM <tableName> WHERE ROWNUM <= <toRow - fromRow + 1>
            // { AND <keyField> > @LastMaxKey}{ AND {<whereSQL>}} ORDER BY <keyField> ASC
            // 其中
            // @LastMaxKey = SELECT MAX(<keyField>) AS "_MaxKey_" FROM (
            // SELECT <keyField> FROM <tableName> WHERE ROWNUM <= <toRow - fromRow + 1>
            // { AND <keyField> > @LastMaxKey}{ AND {<whereSQL>}} ORDER BY <keyField> ASC
            if (table.KeyFields.Length == 1)
            {
                string tableName          = ProcessTableName(table.SourceName, table.SourceSchema);
                string keyField           = ProcessFieldName(table.KeyFields[0]);
                string keyFieldWithPrefix = ProcessFieldName(table.KeyFields[0], ProcessTableName(table.SourceName, table.SourceSchema));

                // 查询最大键值
                sb.Append($"SELECT MAX({keyField}) AS \"_MaxKey_\" FROM (")
                .Append($"SELECT {keyFieldWithPrefix} FROM {tableName}");
                if (!string.IsNullOrEmpty(table.WhereSQL))
                {
                    if (table.WhereSQL.IndexOf(" WHERE ", StringComparison.OrdinalIgnoreCase) < 0)
                    {
                        sb.Append(" WHERE");
                    }
                    sb.Append(" ").Append(table.WhereSQL);
                    if (parms.ContainsKey("LastMaxKey"))
                    {
                        sb.Append($" AND {keyFieldWithPrefix} > @LastMaxKey");
                    }
                    sb.Append(" AND");
                }
                else if (parms.ContainsKey("LastMaxKey"))
                {
                    sb.Append($" WHERE {keyFieldWithPrefix} > @LastMaxKey AND");
                }
                else
                {
                    sb.Append(" WHERE");
                }
                sb.Append($" ROWNUM <= {toRow - fromRow + 1} ORDER BY {keyFieldWithPrefix} ASC) A");

                if (QueryMaxKey(sb.ToString(), parms, out object maxValue))
                {
                    string fieldsSQL = ProcessFieldNames(table.SourceFields, ProcessTableName(table.SourceName, table.SourceSchema));

                    sb.Length = 0;
                    sb.Append($"SELECT {fieldsSQL} FROM {tableName}");
                    if (!string.IsNullOrEmpty(table.WhereSQL))
                    {
                        if (table.WhereSQL.IndexOf(" WHERE ", StringComparison.OrdinalIgnoreCase) < 0)
                        {
                            sb.Append(" WHERE");
                        }
                        sb.Append(" ").Append(table.WhereSQL);
                        if (parms.ContainsKey("LastMaxKey"))
                        {
                            sb.Append($" AND {keyFieldWithPrefix} > @LastMaxKey");
                        }
                        sb.Append(" AND");
                    }
                    else if (parms.ContainsKey("LastMaxKey"))
                    {
                        sb.Append($" WHERE {keyFieldWithPrefix} > @LastMaxKey AND");
                    }
                    else
                    {
                        sb.Append(" WHERE");
                    }
                    sb.Append($" ROWNUM <= {toRow - fromRow + 1} ORDER BY {keyFieldWithPrefix} ASC");

                    bool rst = Query(sb.ToString(), parms, out reader);

                    parms["LastMaxKey"] = maxValue;

                    return(rst);
                }
                else
                {
                    reader = null;

                    return(false);
                }
            }
            // 如果存在复合主键:
            // SELECT <B.fieldsSQL> FROM <tableName> B JOIN (SELECT <keyFields> FROM
            // (SELECT <keyFields>, ROW_NUMBER() OVER (ORDER BY <orderSQL>) AS "_RowNum_"
            // FROM <tableName>
            // {WHERE <whereSQL>}
            // ) A WHERE "_RowNum_" BETWEEN <fromRow> AND <toRow>) A ON <B.keyFields> = <A.keyFields>
            else if (table.KeyFields.Length > 1)
            {
                string fieldsSQL          = ProcessFieldNames(table.SourceFields, "B");
                string tableName          = ProcessTableName(table.SourceName, table.SourceSchema);
                string tableNameWithB     = ProcessTableName(table.SourceName, table.SourceSchema, "B");
                string keyFields          = ProcessFieldNames(table.KeyFields);
                string keyFieldsWithAlias = ProcessFieldNames(table.KeyFields, ProcessTableName(table.SourceName, table.SourceSchema));
                string keyField           = ProcessFieldName(table.KeyFields[0]);

                sb.Append($"SELECT {fieldsSQL} FROM {tableNameWithB} JOIN (SELECT {keyFields} FROM")
                .Append($" (SELECT {keyFieldsWithAlias}, ROW_NUMBER() OVER (ORDER BY {table.OrderSQL})")
                .Append($" AS \"_RowNum_\" FROM {tableName}");
                if (!string.IsNullOrEmpty(table.WhereSQL))
                {
                    if (table.WhereSQL.IndexOf(" WEHRE ", StringComparison.OrdinalIgnoreCase) < 0)
                    {
                        sb.Append(" WHERE");
                    }
                    sb.Append($" {table.WhereSQL}");
                }
                sb.Append($") A WHERE A.\"_RowNum_\" BETWEEN {fromRow} AND {toRow}) A ON B.{keyField} = A.{keyField}");
                for (int i = 1; i < table.KeyFields.Length; i++)
                {
                    keyField = ProcessFieldName(table.KeyFields[i]);
                    sb.Append($" AND B.{keyField} = A.{keyField}");
                }

                return(Query(sb.ToString(), parms, out reader));
            }
            else
            {
                // 语法格式形如:
                // SELECT <fieldsSQL> FROM (SELECT ROW_NUMBER() OVER (ORDER BY <orderSQL>)
                // AS "_RowNum_", <fieldsSQL> FROM <tableName>
                // {WHERE <whereSQL>}
                // ) A WHERE A."_RowNum_" BETWEEN <fromRow> AND <toRow>
                string fieldsSQL       = ProcessFieldNames(table.SourceFields);
                string fieldsWithAlias = ProcessFieldNames(table.SourceFields, ProcessTableName(table.SourceName, table.SourceSchema));

                sb.Append($"SELECT {fieldsSQL} FROM (SELECT ROW_NUMBER() OVER (ORDER BY {table.OrderSQL})")
                .Append($" AS \"_RowNum_\", {fieldsWithAlias} FROM {ProcessTableName(table.SourceName, table.SourceSchema)}");
                if (!string.IsNullOrEmpty(table.WhereSQL))
                {
                    if (table.WhereSQL.IndexOf(" WHERE ", StringComparison.OrdinalIgnoreCase) < 0)
                    {
                        sb.Append(" WHERE");
                    }
                    sb.Append($" {table.WhereSQL}");
                }
                sb.Append($") A WHERE A.\"_RowNum_\" BETWEEN {fromRow} AND {toRow}");

                return(Query(sb.ToString(), parms, out reader));
            }
        }
Exemple #18
0
 public WrapperInfo(Type type, IDataWrapper <object> wrapper)
 {
     Type        = type;
     DataWrapper = wrapper;
 }
 protected CRUDControllerBase(IDataWrapper <TData> source, ICatalog <TData> target)
 {
     Source = source;
     Target = target;
 }
 bool ICollection <IDataWrapper <T> > .Contains(IDataWrapper <T> item)
 {
     throw new NotImplementedException();
 }
 void ICollection <IDataWrapper <T> > .Add(IDataWrapper <T> item)
 {
     throw new NotSupportedException();
 }
 void IList <IDataWrapper <T> > .Insert(int index, IDataWrapper <T> item)
 {
     throw new NotImplementedException();
 }
 bool ICollection <IDataWrapper <T> > .Contains(IDataWrapper <T> item)
 {
     throw new NotSupportedException();
 }
 public virtual void OnItemSelectionChanged(IDataWrapper <TViewData> vmoWrapper)
 {
     ItemSelectionChanged?.Invoke(vmoWrapper);
 }
 bool ICollection <IDataWrapper <T> > .Remove(IDataWrapper <T> item)
 {
     throw new NotSupportedException();
 }
Exemple #26
0
 public CRUDCommandManagerViewStateDependent(IDataWrapper <TViewData> source, ICatalog <TViewData> target, IHasViewState viewStateObject)
     : base(source, target)
 {
     _viewStateObject = viewStateObject ?? throw new ArgumentException(nameof(_viewStateObject));
 }
Exemple #27
0
 public IEnumerable <T> ExecutePaginatedQuery <T, TU, TK>(Uri url, List <IUrlParameter> urlParameters,
                                                          bool includeApiHeaders, TK pageData, IDataWrapper <T, TU> dataWrapper)
 {
     return(new FilesEnumator <T, TU, TK>(this, url, urlParameters, includeApiHeaders, pageData, dataWrapper));
 }
 public PublishedPostController(IDataWrapper dataWrapper)
 {
     _data = dataWrapper;
 }
Exemple #29
0
 public IniFileSection([CanBeNull] IDataWrapper wrapper, IniFileSection original) : base(original)
 {
     _wrapper     = wrapper;
     Commentary   = original.Commentary;
     Commentaries = original.Commentaries == null ? null : new Dictionary <string, string>(original.Commentaries);
 }
Exemple #30
0
 public DeleteControllerBase(IDataWrapper <TVMO> source, ICatalog <TVMO> target)
     : base(source, target)
 {
 }
Exemple #31
0
 public IniFileSection([CanBeNull] IDataWrapper wrapper)
 {
     _wrapper = wrapper;
 }