public NormalizeInfo GetDbStucture(
            TemplateNodeQueryInfo templateNodeQueryInfo,
            Int64 recordSet,
            InstanceInfo instance,
            DataTable dataTable = null
            )
        {
            List <QueryInfo> queries      = Model.GetQueryByTemplateNodeQueryInfo(templateNodeQueryInfo);
            QueryInfo        query        = queries.FirstOrDefault(x => x.Source == instance.Type || x.Source == QuerySource.SQLite);
            string           tableName    = this.GetTableName(templateNodeQueryInfo, recordSet);
            string           tableIndexes = string.Empty;

            if (query != null)
            {
                tableIndexes = query.QueryIndexFileds;
            }

            lock (this._dbStructures)
            {
                if (!this._dbStructures.ContainsKey(tableName))
                {
                    NormalizeInfo definedRecordSet = query.GetDbStructureForRecordSet(recordSet);

                    if (definedRecordSet != null)
                    {
                        var clone = definedRecordSet.Clone();
                        clone.TableName = tableName;
                        this._dbStructures.Add(tableName, clone);
                    }
                    else
                    {
                        if (dataTable == null)
                        {
                            NormalizeInfo      result = new NormalizeInfo();
                            NormalizeFieldInfo field  = new NormalizeFieldInfo();

                            result.TableName = tableName;
                            result.Fields    = new List <NormalizeFieldInfo>();
                            field.Name       = "*";
                            field.Type       = SqlDbType.NVarChar;

                            result.Fields.Add(field);

                            result.TableIndexFileds = tableIndexes;

                            return(result);
                        }

                        NormalizeInfo dbStructure = new NormalizeInfo
                        {
                            TableName        = tableName,
                            IsAutoGenerated  = true,
                            Fields           = new List <NormalizeFieldInfo>(),
                            ChildDirectories = new List <NormalizeInfo>(),
                            RecordSet        = recordSet,
                            QueryName        = query.Name,
                            TableIndexFileds = tableIndexes
                        };

                        foreach (DataColumn column in dataTable.Columns)
                        {
                            NormalizeFieldInfo field = new NormalizeFieldInfo();

                            field.Name     = column.ColumnName;
                            field.Type     = column.DataType.ToSqlDbType();
                            field.IsUnique = true;

                            dbStructure.Fields.Add(field);
                        }

                        this._dbStructures.Add(tableName, dbStructure);
                    }
                }
            }

            NormalizeInfo structure = this._dbStructures[tableName];

            return(structure);
        }