mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-03 00:55:26 +08:00 
			
		
		
		
	- 增加 IDbFirst.GetTableByName 方法获取单表信息,包括列详情、主键、唯一键、索引、备注;
This commit is contained in:
		@@ -231,21 +231,36 @@ namespace FreeSql.Dameng
 | 
			
		||||
            return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database2)
 | 
			
		||||
        public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault();
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database) => GetTables(database, null, false);
 | 
			
		||||
 | 
			
		||||
        public List<DbTableInfo> GetTables(string[] database, string tablename, bool ignoreCase)
 | 
			
		||||
        {
 | 
			
		||||
            var loc1 = new List<DbTableInfo>();
 | 
			
		||||
            var loc2 = new Dictionary<string, DbTableInfo>();
 | 
			
		||||
            var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
			
		||||
            var database = database2?.ToArray();
 | 
			
		||||
 | 
			
		||||
            if (database == null || database.Any() == false)
 | 
			
		||||
            string[] tbname = null;
 | 
			
		||||
            if (string.IsNullOrEmpty(tablename) == false)
 | 
			
		||||
            {
 | 
			
		||||
                tbname = _commonUtils.SplitTableName(tablename);
 | 
			
		||||
                if (tbname?.Length == 1)
 | 
			
		||||
                {
 | 
			
		||||
                    var userUsers = _orm.Ado.ExecuteScalar(" select username from user_users")?.ToString();
 | 
			
		||||
                    if (string.IsNullOrEmpty(userUsers)) return loc1;
 | 
			
		||||
                    tbname = new[] { userUsers, tbname[0] };
 | 
			
		||||
                }
 | 
			
		||||
                if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray();
 | 
			
		||||
                database = new[] { tbname[0] };
 | 
			
		||||
            }
 | 
			
		||||
            else if (database == null || database.Any() == false)
 | 
			
		||||
            {
 | 
			
		||||
                var userUsers = _orm.Ado.ExecuteScalar(" select username from user_users")?.ToString();
 | 
			
		||||
                if (string.IsNullOrEmpty(userUsers)) return loc1;
 | 
			
		||||
                database = new[] { userUsers };
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a)));
 | 
			
		||||
            var sql = string.Format(@"
 | 
			
		||||
            var sql = $@"
 | 
			
		||||
select
 | 
			
		||||
a.owner || '.' || a.table_name,
 | 
			
		||||
a.owner,
 | 
			
		||||
@@ -254,7 +269,7 @@ b.comments,
 | 
			
		||||
'TABLE'
 | 
			
		||||
from all_tables a
 | 
			
		||||
left join all_tab_comments b on b.owner = a.owner and b.table_name = a.table_name and b.table_type = 'TABLE'
 | 
			
		||||
where a.owner in ({0})", databaseIn);
 | 
			
		||||
where {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}){(tbname == null ? "" : $" and {(ignoreCase ? "lower(a.table_name)" : "a.table_name")}={_commonUtils.FormatSql("{0}", tbname[1])}")}";
 | 
			
		||||
            var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
            if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
@@ -315,7 +330,7 @@ where a.owner in ({0})", databaseIn);
 | 
			
		||||
            }
 | 
			
		||||
            loc8.Append(")");
 | 
			
		||||
 | 
			
		||||
            sql = string.Format(@"
 | 
			
		||||
            sql = $@"
 | 
			
		||||
select
 | 
			
		||||
a.owner || '.' || a.table_name,
 | 
			
		||||
a.column_name,
 | 
			
		||||
@@ -330,8 +345,8 @@ b.comments,
 | 
			
		||||
a.data_default
 | 
			
		||||
from all_tab_cols a
 | 
			
		||||
left join all_col_comments b on b.owner = a.owner and b.table_name = a.table_name and b.column_name = a.column_name
 | 
			
		||||
where a.owner in ({1}) and {0}
 | 
			
		||||
", loc8, databaseIn);
 | 
			
		||||
where {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}) and {loc8}
 | 
			
		||||
";
 | 
			
		||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
            if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
@@ -386,7 +401,7 @@ where a.owner in ({1}) and {0}
 | 
			
		||||
                loc3[table_id][column].CsType = this.GetCsTypeInfo(loc3[table_id][column]);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            sql = string.Format(@"
 | 
			
		||||
            sql = $@"
 | 
			
		||||
select
 | 
			
		||||
a.table_owner || '.' || a.table_name,
 | 
			
		||||
c.column_name,
 | 
			
		||||
@@ -401,8 +416,8 @@ all_ind_columns c
 | 
			
		||||
where a.index_name = c.index_name
 | 
			
		||||
and a.table_owner = c.table_owner
 | 
			
		||||
and a.table_name = c.table_name
 | 
			
		||||
and a.table_owner in ({1}) and {0}
 | 
			
		||||
", loc8, databaseIn);
 | 
			
		||||
and {(ignoreCase ? "lower(a.table_owner)" : "a.table_owner")} in ({databaseIn}) and {loc8}
 | 
			
		||||
";
 | 
			
		||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
            if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
@@ -454,7 +469,9 @@ and a.table_owner in ({1}) and {0}
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            sql = string.Format(@"
 | 
			
		||||
            if (tbname == null)
 | 
			
		||||
            {
 | 
			
		||||
                sql = $@"
 | 
			
		||||
select
 | 
			
		||||
a.owner || '.' || a.table_name,
 | 
			
		||||
c.column_name,
 | 
			
		||||
@@ -488,43 +505,44 @@ and a.owner = c.owner
 | 
			
		||||
and a.table_name = c.table_name
 | 
			
		||||
and b.owner = d.owner
 | 
			
		||||
and b.table_name = d.table_name
 | 
			
		||||
and a.owner in ({1}) and {0}
 | 
			
		||||
", loc8, databaseIn);
 | 
			
		||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
            if (ds == null) return loc1;
 | 
			
		||||
and {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}) and {loc8}
 | 
			
		||||
";
 | 
			
		||||
                ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
                if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
            var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
            foreach (var row in ds)
 | 
			
		||||
            {
 | 
			
		||||
                string table_id = string.Concat(row[0]);
 | 
			
		||||
                string column = string.Concat(row[1]);
 | 
			
		||||
                string fk_id = string.Concat(row[2]);
 | 
			
		||||
                string ref_table_id = string.Concat(row[3]);
 | 
			
		||||
                bool is_foreign_key = string.Concat(row[4]) == "1";
 | 
			
		||||
                string referenced_column = string.Concat(row[5]);
 | 
			
		||||
                if (database.Length == 1)
 | 
			
		||||
                var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
                foreach (var row in ds)
 | 
			
		||||
                {
 | 
			
		||||
                    table_id = table_id.Substring(table_id.IndexOf('.') + 1);
 | 
			
		||||
                    ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1);
 | 
			
		||||
                }
 | 
			
		||||
                if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue;
 | 
			
		||||
                var loc9 = loc3[table_id][column];
 | 
			
		||||
                if (loc2.ContainsKey(ref_table_id) == false) continue;
 | 
			
		||||
                var loc10 = loc2[ref_table_id];
 | 
			
		||||
                var loc11 = loc3[ref_table_id][referenced_column];
 | 
			
		||||
                    string table_id = string.Concat(row[0]);
 | 
			
		||||
                    string column = string.Concat(row[1]);
 | 
			
		||||
                    string fk_id = string.Concat(row[2]);
 | 
			
		||||
                    string ref_table_id = string.Concat(row[3]);
 | 
			
		||||
                    bool is_foreign_key = string.Concat(row[4]) == "1";
 | 
			
		||||
                    string referenced_column = string.Concat(row[5]);
 | 
			
		||||
                    if (database.Length == 1)
 | 
			
		||||
                    {
 | 
			
		||||
                        table_id = table_id.Substring(table_id.IndexOf('.') + 1);
 | 
			
		||||
                        ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1);
 | 
			
		||||
                    }
 | 
			
		||||
                    if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue;
 | 
			
		||||
                    var loc9 = loc3[table_id][column];
 | 
			
		||||
                    if (loc2.ContainsKey(ref_table_id) == false) continue;
 | 
			
		||||
                    var loc10 = loc2[ref_table_id];
 | 
			
		||||
                    var loc11 = loc3[ref_table_id][referenced_column];
 | 
			
		||||
 | 
			
		||||
                Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                DbForeignInfo loc13 = null;
 | 
			
		||||
                if (!fkColumns.TryGetValue(table_id, out loc12))
 | 
			
		||||
                    fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                    loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 });
 | 
			
		||||
                loc13.Columns.Add(loc9);
 | 
			
		||||
                loc13.ReferencedColumns.Add(loc11);
 | 
			
		||||
                    Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                    DbForeignInfo loc13 = null;
 | 
			
		||||
                    if (!fkColumns.TryGetValue(table_id, out loc12))
 | 
			
		||||
                        fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                    if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                        loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 });
 | 
			
		||||
                    loc13.Columns.Add(loc9);
 | 
			
		||||
                    loc13.ReferencedColumns.Add(loc11);
 | 
			
		||||
                }
 | 
			
		||||
                foreach (var table_id in fkColumns.Keys)
 | 
			
		||||
                    foreach (var fk in fkColumns[table_id])
 | 
			
		||||
                        loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
            }
 | 
			
		||||
            foreach (var table_id in fkColumns.Keys)
 | 
			
		||||
                foreach (var fk in fkColumns[table_id])
 | 
			
		||||
                    loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
 | 
			
		||||
            foreach (var table_id in loc3.Keys)
 | 
			
		||||
            {
 | 
			
		||||
 
 | 
			
		||||
@@ -166,14 +166,30 @@ namespace FreeSql.MySql
 | 
			
		||||
            return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database2)
 | 
			
		||||
        public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault();
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database) => GetTables(database, null, false);
 | 
			
		||||
 | 
			
		||||
        public List<DbTableInfo> GetTables(string[] database, string tablename, bool ignoreCase)
 | 
			
		||||
        {
 | 
			
		||||
            var loc1 = new List<DbTableInfo>();
 | 
			
		||||
            var loc2 = new Dictionary<string, DbTableInfo>();
 | 
			
		||||
            var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
			
		||||
            var database = database2?.ToArray();
 | 
			
		||||
 | 
			
		||||
            if (database == null || database.Any() == false)
 | 
			
		||||
            string[] tbname = null;
 | 
			
		||||
            if (string.IsNullOrEmpty(tablename) == false)
 | 
			
		||||
            {
 | 
			
		||||
                tbname = _commonUtils.SplitTableName(tablename);
 | 
			
		||||
                if (tbname?.Length == 1)
 | 
			
		||||
                {
 | 
			
		||||
                    using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)))
 | 
			
		||||
                    {
 | 
			
		||||
                        if (string.IsNullOrEmpty(conn.Value.Database)) return loc1;
 | 
			
		||||
                        tbname = new[] { conn.Value.Database, tbname[0] };
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray();
 | 
			
		||||
                database = new[] { tbname[0] };
 | 
			
		||||
            }
 | 
			
		||||
            else if (database == null || database.Any() == false)
 | 
			
		||||
            {
 | 
			
		||||
                using (var conn = _orm.Ado.MasterPool.Get())
 | 
			
		||||
                {
 | 
			
		||||
@@ -181,8 +197,9 @@ namespace FreeSql.MySql
 | 
			
		||||
                    database = new[] { conn.Value.Database };
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a)));
 | 
			
		||||
            var sql = string.Format(@"
 | 
			
		||||
            var sql = $@"
 | 
			
		||||
select 
 | 
			
		||||
concat(a.table_schema, '.', a.table_name) 'id',
 | 
			
		||||
a.table_schema 'schema',
 | 
			
		||||
@@ -190,7 +207,7 @@ a.table_name 'table',
 | 
			
		||||
a.table_comment,
 | 
			
		||||
a.table_type 'type'
 | 
			
		||||
from information_schema.tables a
 | 
			
		||||
where a.table_schema in ({0})", databaseIn);
 | 
			
		||||
where {(ignoreCase ? "lower(a.table_schema)" : "a.table_schema")} in ({databaseIn}){(tbname == null ? "" : $" and {(ignoreCase ? "lower(a.table_name)" : "a.table_name")}={_commonUtils.FormatSql("{0}", tbname[1])}")}";
 | 
			
		||||
            var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
            if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
@@ -251,7 +268,7 @@ where a.table_schema in ({0})", databaseIn);
 | 
			
		||||
            }
 | 
			
		||||
            loc8.Append(")");
 | 
			
		||||
 | 
			
		||||
            sql = string.Format(@"
 | 
			
		||||
            sql = $@"
 | 
			
		||||
select
 | 
			
		||||
concat(a.table_schema, '.', a.table_name),
 | 
			
		||||
a.column_name,
 | 
			
		||||
@@ -263,8 +280,8 @@ case when locate('auto_increment', a.extra) > 0 then 1 else 0 end 'is_identity',
 | 
			
		||||
a.column_comment 'comment',
 | 
			
		||||
a.column_default 'default_value'
 | 
			
		||||
from information_schema.columns a
 | 
			
		||||
where a.table_schema in ({1}) and {0}
 | 
			
		||||
", loc8, databaseIn);
 | 
			
		||||
where {(ignoreCase ? "lower(a.table_schema)" : "a.table_schema")} in ({databaseIn}) and {loc8}
 | 
			
		||||
";
 | 
			
		||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
            if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
@@ -305,7 +322,7 @@ where a.table_schema in ({1}) and {0}
 | 
			
		||||
                loc3[table_id][column].CsType = this.GetCsTypeInfo(loc3[table_id][column]);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            sql = string.Format(@"
 | 
			
		||||
            sql = $@"
 | 
			
		||||
select 
 | 
			
		||||
concat(a.table_schema, '.', a.table_name) 'table_id',
 | 
			
		||||
a.column_name,
 | 
			
		||||
@@ -315,8 +332,8 @@ case when a.index_name = 'PRIMARY' then 1 else 0 end 'IsPrimaryKey',
 | 
			
		||||
0 'IsClustered',
 | 
			
		||||
0 'IsDesc'
 | 
			
		||||
from information_schema.statistics a
 | 
			
		||||
where a.table_schema in ({1}) and {0}
 | 
			
		||||
", loc8, databaseIn);
 | 
			
		||||
where {(ignoreCase ? "lower(a.table_schema)" : "a.table_schema")} in ({databaseIn}) and {loc8}
 | 
			
		||||
";
 | 
			
		||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
            if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
@@ -367,7 +384,9 @@ where a.table_schema in ({1}) and {0}
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            sql = string.Format(@"
 | 
			
		||||
            if (tbname == null)
 | 
			
		||||
            {
 | 
			
		||||
                sql = $@"
 | 
			
		||||
select 
 | 
			
		||||
concat(a.constraint_schema, '.', a.table_name) 'table_id',
 | 
			
		||||
a.column_name,
 | 
			
		||||
@@ -376,43 +395,44 @@ concat(a.referenced_table_schema, '.', a.referenced_table_name) 'ref_table_id',
 | 
			
		||||
1 'IsForeignKey',
 | 
			
		||||
a.referenced_column_name 'ref_column'
 | 
			
		||||
from information_schema.key_column_usage a
 | 
			
		||||
where a.constraint_schema in ({1}) and {0} and not isnull(position_in_unique_constraint)
 | 
			
		||||
", loc8, databaseIn);
 | 
			
		||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
            if (ds == null) return loc1;
 | 
			
		||||
where {(ignoreCase ? "lower(a.constraint_schema)" : "a.constraint_schema")} in ({databaseIn}) and {loc8} and not isnull(position_in_unique_constraint)
 | 
			
		||||
";
 | 
			
		||||
                ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
                if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
            var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
            foreach (var row in ds)
 | 
			
		||||
            {
 | 
			
		||||
                string table_id = string.Concat(row[0]);
 | 
			
		||||
                string column = string.Concat(row[1]);
 | 
			
		||||
                string fk_id = string.Concat(row[2]);
 | 
			
		||||
                string ref_table_id = string.Concat(row[3]);
 | 
			
		||||
                bool is_foreign_key = string.Concat(row[4]) == "1";
 | 
			
		||||
                string referenced_column = string.Concat(row[5]);
 | 
			
		||||
                if (database.Length == 1)
 | 
			
		||||
                var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
                foreach (var row in ds)
 | 
			
		||||
                {
 | 
			
		||||
                    table_id = table_id.Substring(table_id.IndexOf('.') + 1);
 | 
			
		||||
                    ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1);
 | 
			
		||||
                }
 | 
			
		||||
                if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue;
 | 
			
		||||
                var loc9 = loc3[table_id][column];
 | 
			
		||||
                if (loc2.ContainsKey(ref_table_id) == false) continue;
 | 
			
		||||
                var loc10 = loc2[ref_table_id];
 | 
			
		||||
                var loc11 = loc3[ref_table_id][referenced_column];
 | 
			
		||||
                    string table_id = string.Concat(row[0]);
 | 
			
		||||
                    string column = string.Concat(row[1]);
 | 
			
		||||
                    string fk_id = string.Concat(row[2]);
 | 
			
		||||
                    string ref_table_id = string.Concat(row[3]);
 | 
			
		||||
                    bool is_foreign_key = string.Concat(row[4]) == "1";
 | 
			
		||||
                    string referenced_column = string.Concat(row[5]);
 | 
			
		||||
                    if (database.Length == 1)
 | 
			
		||||
                    {
 | 
			
		||||
                        table_id = table_id.Substring(table_id.IndexOf('.') + 1);
 | 
			
		||||
                        ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1);
 | 
			
		||||
                    }
 | 
			
		||||
                    if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue;
 | 
			
		||||
                    var loc9 = loc3[table_id][column];
 | 
			
		||||
                    if (loc2.ContainsKey(ref_table_id) == false) continue;
 | 
			
		||||
                    var loc10 = loc2[ref_table_id];
 | 
			
		||||
                    var loc11 = loc3[ref_table_id][referenced_column];
 | 
			
		||||
 | 
			
		||||
                Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                DbForeignInfo loc13 = null;
 | 
			
		||||
                if (!fkColumns.TryGetValue(table_id, out loc12))
 | 
			
		||||
                    fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                    loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 });
 | 
			
		||||
                loc13.Columns.Add(loc9);
 | 
			
		||||
                loc13.ReferencedColumns.Add(loc11);
 | 
			
		||||
                    Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                    DbForeignInfo loc13 = null;
 | 
			
		||||
                    if (!fkColumns.TryGetValue(table_id, out loc12))
 | 
			
		||||
                        fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                    if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                        loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 });
 | 
			
		||||
                    loc13.Columns.Add(loc9);
 | 
			
		||||
                    loc13.ReferencedColumns.Add(loc11);
 | 
			
		||||
                }
 | 
			
		||||
                foreach (var table_id in fkColumns.Keys)
 | 
			
		||||
                    foreach (var fk in fkColumns[table_id])
 | 
			
		||||
                        loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
            }
 | 
			
		||||
            foreach (var table_id in fkColumns.Keys)
 | 
			
		||||
                foreach (var fk in fkColumns[table_id])
 | 
			
		||||
                    loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
 | 
			
		||||
            foreach (var table_id in loc3.Keys)
 | 
			
		||||
            {
 | 
			
		||||
 
 | 
			
		||||
@@ -231,21 +231,36 @@ namespace FreeSql.Odbc.Dameng
 | 
			
		||||
            return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database2)
 | 
			
		||||
        public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault();
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database) => GetTables(database, null, false);
 | 
			
		||||
 | 
			
		||||
        public List<DbTableInfo> GetTables(string[] database, string tablename, bool ignoreCase)
 | 
			
		||||
        {
 | 
			
		||||
            var loc1 = new List<DbTableInfo>();
 | 
			
		||||
            var loc2 = new Dictionary<string, DbTableInfo>();
 | 
			
		||||
            var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
			
		||||
            var database = database2?.ToArray();
 | 
			
		||||
 | 
			
		||||
            if (database == null || database.Any() == false)
 | 
			
		||||
            string[] tbname = null;
 | 
			
		||||
            if (string.IsNullOrEmpty(tablename) == false)
 | 
			
		||||
            {
 | 
			
		||||
                tbname = _commonUtils.SplitTableName(tablename);
 | 
			
		||||
                if (tbname?.Length == 1)
 | 
			
		||||
                {
 | 
			
		||||
                    var userUsers = _orm.Ado.ExecuteScalar(" select username from user_users")?.ToString();
 | 
			
		||||
                    if (string.IsNullOrEmpty(userUsers)) return loc1;
 | 
			
		||||
                    tbname = new[] { userUsers, tbname[0] };
 | 
			
		||||
                }
 | 
			
		||||
                if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray();
 | 
			
		||||
                database = new[] { tbname[0] };
 | 
			
		||||
            }
 | 
			
		||||
            else if (database == null || database.Any() == false)
 | 
			
		||||
            {
 | 
			
		||||
                var userUsers = _orm.Ado.ExecuteScalar(" select username from user_users")?.ToString();
 | 
			
		||||
                if (string.IsNullOrEmpty(userUsers)) return loc1;
 | 
			
		||||
                database = new[] { userUsers };
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a)));
 | 
			
		||||
            var sql = string.Format(@"
 | 
			
		||||
            var sql = $@"
 | 
			
		||||
select
 | 
			
		||||
a.owner || '.' || a.table_name,
 | 
			
		||||
a.owner,
 | 
			
		||||
@@ -254,7 +269,7 @@ b.comments,
 | 
			
		||||
'TABLE'
 | 
			
		||||
from all_tables a
 | 
			
		||||
left join all_tab_comments b on b.owner = a.owner and b.table_name = a.table_name and b.table_type = 'TABLE'
 | 
			
		||||
where a.owner in ({0})", databaseIn);
 | 
			
		||||
where {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}){(tbname == null ? "" : $" and {(ignoreCase ? "lower(a.table_name)" : "a.table_name")}={_commonUtils.FormatSql("{0}", tbname[1])}")}";
 | 
			
		||||
            var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
            if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
@@ -315,7 +330,7 @@ where a.owner in ({0})", databaseIn);
 | 
			
		||||
            }
 | 
			
		||||
            loc8.Append(")");
 | 
			
		||||
 | 
			
		||||
            sql = string.Format(@"
 | 
			
		||||
            sql = $@"
 | 
			
		||||
select
 | 
			
		||||
a.owner || '.' || a.table_name,
 | 
			
		||||
a.column_name,
 | 
			
		||||
@@ -330,8 +345,8 @@ b.comments,
 | 
			
		||||
a.data_default
 | 
			
		||||
from all_tab_cols a
 | 
			
		||||
left join all_col_comments b on b.owner = a.owner and b.table_name = a.table_name and b.column_name = a.column_name
 | 
			
		||||
where a.owner in ({1}) and {0}
 | 
			
		||||
", loc8, databaseIn);
 | 
			
		||||
where {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}) and {loc8}
 | 
			
		||||
";
 | 
			
		||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
            if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
@@ -386,7 +401,7 @@ where a.owner in ({1}) and {0}
 | 
			
		||||
                loc3[table_id][column].CsType = this.GetCsTypeInfo(loc3[table_id][column]);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            sql = string.Format(@"
 | 
			
		||||
            sql = $@"
 | 
			
		||||
select
 | 
			
		||||
a.table_owner || '.' || a.table_name,
 | 
			
		||||
c.column_name,
 | 
			
		||||
@@ -401,8 +416,8 @@ all_ind_columns c
 | 
			
		||||
where a.index_name = c.index_name
 | 
			
		||||
and a.table_owner = c.table_owner
 | 
			
		||||
and a.table_name = c.table_name
 | 
			
		||||
and a.table_owner in ({1}) and {0}
 | 
			
		||||
", loc8, databaseIn);
 | 
			
		||||
and {(ignoreCase ? "lower(a.table_owner)" : "a.table_owner")} in ({databaseIn}) and {loc8}
 | 
			
		||||
";
 | 
			
		||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
            if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
@@ -454,7 +469,9 @@ and a.table_owner in ({1}) and {0}
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            sql = string.Format(@"
 | 
			
		||||
            if (tbname == null)
 | 
			
		||||
            {
 | 
			
		||||
                sql = $@"
 | 
			
		||||
select
 | 
			
		||||
a.owner || '.' || a.table_name,
 | 
			
		||||
c.column_name,
 | 
			
		||||
@@ -488,43 +505,44 @@ and a.owner = c.owner
 | 
			
		||||
and a.table_name = c.table_name
 | 
			
		||||
and b.owner = d.owner
 | 
			
		||||
and b.table_name = d.table_name
 | 
			
		||||
and a.owner in ({1}) and {0}
 | 
			
		||||
", loc8, databaseIn);
 | 
			
		||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
            if (ds == null) return loc1;
 | 
			
		||||
and {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}) and {loc8}
 | 
			
		||||
";
 | 
			
		||||
                ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
                if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
            var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
            foreach (var row in ds)
 | 
			
		||||
            {
 | 
			
		||||
                string table_id = string.Concat(row[0]);
 | 
			
		||||
                string column = string.Concat(row[1]);
 | 
			
		||||
                string fk_id = string.Concat(row[2]);
 | 
			
		||||
                string ref_table_id = string.Concat(row[3]);
 | 
			
		||||
                bool is_foreign_key = string.Concat(row[4]) == "1";
 | 
			
		||||
                string referenced_column = string.Concat(row[5]);
 | 
			
		||||
                if (database.Length == 1)
 | 
			
		||||
                var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
                foreach (var row in ds)
 | 
			
		||||
                {
 | 
			
		||||
                    table_id = table_id.Substring(table_id.IndexOf('.') + 1);
 | 
			
		||||
                    ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1);
 | 
			
		||||
                }
 | 
			
		||||
                if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue;
 | 
			
		||||
                var loc9 = loc3[table_id][column];
 | 
			
		||||
                if (loc2.ContainsKey(ref_table_id) == false) continue;
 | 
			
		||||
                var loc10 = loc2[ref_table_id];
 | 
			
		||||
                var loc11 = loc3[ref_table_id][referenced_column];
 | 
			
		||||
                    string table_id = string.Concat(row[0]);
 | 
			
		||||
                    string column = string.Concat(row[1]);
 | 
			
		||||
                    string fk_id = string.Concat(row[2]);
 | 
			
		||||
                    string ref_table_id = string.Concat(row[3]);
 | 
			
		||||
                    bool is_foreign_key = string.Concat(row[4]) == "1";
 | 
			
		||||
                    string referenced_column = string.Concat(row[5]);
 | 
			
		||||
                    if (database.Length == 1)
 | 
			
		||||
                    {
 | 
			
		||||
                        table_id = table_id.Substring(table_id.IndexOf('.') + 1);
 | 
			
		||||
                        ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1);
 | 
			
		||||
                    }
 | 
			
		||||
                    if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue;
 | 
			
		||||
                    var loc9 = loc3[table_id][column];
 | 
			
		||||
                    if (loc2.ContainsKey(ref_table_id) == false) continue;
 | 
			
		||||
                    var loc10 = loc2[ref_table_id];
 | 
			
		||||
                    var loc11 = loc3[ref_table_id][referenced_column];
 | 
			
		||||
 | 
			
		||||
                Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                DbForeignInfo loc13 = null;
 | 
			
		||||
                if (!fkColumns.TryGetValue(table_id, out loc12))
 | 
			
		||||
                    fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                    loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 });
 | 
			
		||||
                loc13.Columns.Add(loc9);
 | 
			
		||||
                loc13.ReferencedColumns.Add(loc11);
 | 
			
		||||
                    Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                    DbForeignInfo loc13 = null;
 | 
			
		||||
                    if (!fkColumns.TryGetValue(table_id, out loc12))
 | 
			
		||||
                        fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                    if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                        loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 });
 | 
			
		||||
                    loc13.Columns.Add(loc9);
 | 
			
		||||
                    loc13.ReferencedColumns.Add(loc11);
 | 
			
		||||
                }
 | 
			
		||||
                foreach (var table_id in fkColumns.Keys)
 | 
			
		||||
                    foreach (var fk in fkColumns[table_id])
 | 
			
		||||
                        loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
            }
 | 
			
		||||
            foreach (var table_id in fkColumns.Keys)
 | 
			
		||||
                foreach (var fk in fkColumns[table_id])
 | 
			
		||||
                    loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
 | 
			
		||||
            foreach (var table_id in loc3.Keys)
 | 
			
		||||
            {
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,7 @@ namespace FreeSql.Odbc.KingbaseES
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal string InternalTableAlias;
 | 
			
		||||
        internal string InternalTableAlias { get; set; }
 | 
			
		||||
        internal StringBuilder InternalSbSet => _set;
 | 
			
		||||
        internal StringBuilder InternalSbSetIncr => _setIncr;
 | 
			
		||||
        internal Dictionary<string, bool> InternalIgnore => _ignore;
 | 
			
		||||
 
 | 
			
		||||
@@ -116,20 +116,31 @@ namespace FreeSql.Odbc.KingbaseES
 | 
			
		||||
            var tbname = _commonUtils.SplitTableName(name);
 | 
			
		||||
            if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] };
 | 
			
		||||
            if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray();
 | 
			
		||||
            var sql = $" select 1 from sys_tables a inner join sys_namespace b on b.nspname = a.schemaname where {(ignoreCase ? "lower(b.nspname)" : "b.nspname")} = {_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(a.tablename)" : "a.tablename")} = {_commonUtils.FormatSql("{0}", tbname[1])}";
 | 
			
		||||
            var sql = $" select 1 from sys_tables a inner join sys_namespace b on b.nspname = a.schemaname where {(ignoreCase ? "lower(b.nspname)" : "b.nspname")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(a.tablename)" : "a.tablename")}={_commonUtils.FormatSql("{0}", tbname[1])}";
 | 
			
		||||
            return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database)
 | 
			
		||||
        public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault();
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database) => GetTables(database, null, false);
 | 
			
		||||
 | 
			
		||||
        public List<DbTableInfo> GetTables(string[] database, string tablename, bool ignoreCase)
 | 
			
		||||
        {
 | 
			
		||||
            var olddatabase = "";
 | 
			
		||||
            using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)))
 | 
			
		||||
            {
 | 
			
		||||
                olddatabase = conn.Value.Database;
 | 
			
		||||
            }
 | 
			
		||||
            var dbs = database == null || database.Any() == false ? new[] { olddatabase } : database;
 | 
			
		||||
            var tables = new List<DbTableInfo>();
 | 
			
		||||
            string[] tbname = null;
 | 
			
		||||
            string[] dbs = database == null || database.Any() == false ? new[] { olddatabase } : database;
 | 
			
		||||
            if (string.IsNullOrEmpty(tablename) == false)
 | 
			
		||||
            {
 | 
			
		||||
                tbname = _commonUtils.SplitTableName(tablename);
 | 
			
		||||
                if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] };
 | 
			
		||||
                if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray();
 | 
			
		||||
                dbs = new[] { olddatabase };
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var tables = new List<DbTableInfo>();
 | 
			
		||||
            foreach (var db in dbs)
 | 
			
		||||
            {
 | 
			
		||||
                if (string.IsNullOrEmpty(db) || string.Compare(db, olddatabase, true) != 0) continue;
 | 
			
		||||
@@ -139,7 +150,7 @@ namespace FreeSql.Odbc.KingbaseES
 | 
			
		||||
                var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
			
		||||
 | 
			
		||||
                var sql = $@"
 | 
			
		||||
select
 | 
			
		||||
{(tbname == null ? "" : $"select * from (")}select
 | 
			
		||||
b.nspname || '.' || a.tablename,
 | 
			
		||||
a.schemaname,
 | 
			
		||||
a.tablename ,
 | 
			
		||||
@@ -165,7 +176,7 @@ inner join sys_namespace b on b.oid = a.relnamespace
 | 
			
		||||
left join sys_description d on d.objoid = a.oid and objsubid = 0
 | 
			
		||||
where b.nspname not in ('SYS_CATALOG', 'INFORMATION_SCHEMA', 'TOPOLOGY', 'SYSAUDIT', 'SYSLOGICAL', 'SYS_TEMP_1', 'SYS_TOAST', 'SYS_TOAST_TEMP_1', 'XLOG_RECORD_READ') and a.relkind in ('m','v') 
 | 
			
		||||
and b.nspname || '.' || a.relname not in ('PUBLIC.GEOGRAPHY_COLUMNS','PUBLIC.GEOMETRY_COLUMNS','PUBLIC.RASTER_COLUMNS','PUBLIC.RASTER_OVERVIEWS')
 | 
			
		||||
";
 | 
			
		||||
{(tbname == null ? "" : $") ft_dbf where {(ignoreCase ? "lower(schemaname)" : "schemaname")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(tablename)" : "tablename")}={_commonUtils.FormatSql("{0}", tbname[1])}")}";
 | 
			
		||||
                var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
                if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
@@ -381,7 +392,9 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || d.relname")
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                sql = $@"
 | 
			
		||||
                if (tbname == null)
 | 
			
		||||
                {
 | 
			
		||||
                    sql = $@"
 | 
			
		||||
select
 | 
			
		||||
ns.nspname || '.' || b.relname as table_id, 
 | 
			
		||||
array(select attname from sys_attribute where attrelid = a.conrelid and attnum = any(a.conkey)) as column_name,
 | 
			
		||||
@@ -398,39 +411,40 @@ inner join sys_namespace ns on ns.oid = b.relnamespace
 | 
			
		||||
inner join sys_namespace ns2 on ns2.oid = c.relnamespace
 | 
			
		||||
where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || b.relname")}
 | 
			
		||||
";
 | 
			
		||||
                ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
                if (ds == null) return loc1;
 | 
			
		||||
                    ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
                    if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
                var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
                foreach (object[] row in ds)
 | 
			
		||||
                {
 | 
			
		||||
                    var table_id = string.Concat(row[0]);
 | 
			
		||||
                    var column = row[1] as string[];
 | 
			
		||||
                    var fk_id = string.Concat(row[2]);
 | 
			
		||||
                    var ref_table_id = string.Concat(row[3]);
 | 
			
		||||
                    var is_foreign_key = string.Concat(row[4]) == "1";
 | 
			
		||||
                    var referenced_column = row[5] as string[];
 | 
			
		||||
                    var referenced_db = string.Concat(row[6]);
 | 
			
		||||
                    var referenced_table = string.Concat(row[7]);
 | 
			
		||||
 | 
			
		||||
                    if (loc2.ContainsKey(ref_table_id) == false) continue;
 | 
			
		||||
 | 
			
		||||
                    Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                    DbForeignInfo loc13 = null;
 | 
			
		||||
                    if (!fkColumns.TryGetValue(table_id, out loc12))
 | 
			
		||||
                        fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                    if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                        loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc2[ref_table_id] });
 | 
			
		||||
 | 
			
		||||
                    for (int a = 0; a < column.Length; a++)
 | 
			
		||||
                    var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
                    foreach (object[] row in ds)
 | 
			
		||||
                    {
 | 
			
		||||
                        loc13.Columns.Add(loc3[table_id][column[a]]);
 | 
			
		||||
                        loc13.ReferencedColumns.Add(loc3[ref_table_id][referenced_column[a]]);
 | 
			
		||||
                        var table_id = string.Concat(row[0]);
 | 
			
		||||
                        var column = row[1] as string[];
 | 
			
		||||
                        var fk_id = string.Concat(row[2]);
 | 
			
		||||
                        var ref_table_id = string.Concat(row[3]);
 | 
			
		||||
                        var is_foreign_key = string.Concat(row[4]) == "1";
 | 
			
		||||
                        var referenced_column = row[5] as string[];
 | 
			
		||||
                        var referenced_db = string.Concat(row[6]);
 | 
			
		||||
                        var referenced_table = string.Concat(row[7]);
 | 
			
		||||
 | 
			
		||||
                        if (loc2.ContainsKey(ref_table_id) == false) continue;
 | 
			
		||||
 | 
			
		||||
                        Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                        DbForeignInfo loc13 = null;
 | 
			
		||||
                        if (!fkColumns.TryGetValue(table_id, out loc12))
 | 
			
		||||
                            fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                        if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                            loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc2[ref_table_id] });
 | 
			
		||||
 | 
			
		||||
                        for (int a = 0; a < column.Length; a++)
 | 
			
		||||
                        {
 | 
			
		||||
                            loc13.Columns.Add(loc3[table_id][column[a]]);
 | 
			
		||||
                            loc13.ReferencedColumns.Add(loc3[ref_table_id][referenced_column[a]]);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    foreach (var table_id in fkColumns.Keys)
 | 
			
		||||
                        foreach (var fk in fkColumns[table_id])
 | 
			
		||||
                            loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
                }
 | 
			
		||||
                foreach (var table_id in fkColumns.Keys)
 | 
			
		||||
                    foreach (var fk in fkColumns[table_id])
 | 
			
		||||
                        loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
 | 
			
		||||
                foreach (var table_id in loc3.Keys)
 | 
			
		||||
                {
 | 
			
		||||
 
 | 
			
		||||
@@ -132,14 +132,30 @@ namespace FreeSql.Odbc.MySql
 | 
			
		||||
            return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database2)
 | 
			
		||||
        public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault();
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database) => GetTables(database, null, false);
 | 
			
		||||
 | 
			
		||||
        public List<DbTableInfo> GetTables(string[] database, string tablename, bool ignoreCase)
 | 
			
		||||
        {
 | 
			
		||||
            var loc1 = new List<DbTableInfo>();
 | 
			
		||||
            var loc2 = new Dictionary<string, DbTableInfo>();
 | 
			
		||||
            var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
			
		||||
            var database = database2?.ToArray();
 | 
			
		||||
 | 
			
		||||
            if (database == null || database.Any() == false)
 | 
			
		||||
            string[] tbname = null;
 | 
			
		||||
            if (string.IsNullOrEmpty(tablename) == false)
 | 
			
		||||
            {
 | 
			
		||||
                tbname = _commonUtils.SplitTableName(tablename);
 | 
			
		||||
                if (tbname?.Length == 1)
 | 
			
		||||
                {
 | 
			
		||||
                    using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)))
 | 
			
		||||
                    {
 | 
			
		||||
                        if (string.IsNullOrEmpty(conn.Value.Database)) return loc1;
 | 
			
		||||
                        tbname = new[] { conn.Value.Database, tbname[0] };
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray();
 | 
			
		||||
                database = new[] { tbname[0] };
 | 
			
		||||
            }
 | 
			
		||||
            else if (database == null || database.Any() == false)
 | 
			
		||||
            {
 | 
			
		||||
                using (var conn = _orm.Ado.MasterPool.Get())
 | 
			
		||||
                {
 | 
			
		||||
@@ -147,8 +163,9 @@ namespace FreeSql.Odbc.MySql
 | 
			
		||||
                    database = new[] { conn.Value.Database };
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a)));
 | 
			
		||||
            var sql = string.Format(@"
 | 
			
		||||
            var sql = $@"
 | 
			
		||||
select 
 | 
			
		||||
concat(a.table_schema, '.', a.table_name) 'id',
 | 
			
		||||
a.table_schema 'schema',
 | 
			
		||||
@@ -156,7 +173,7 @@ a.table_name 'table',
 | 
			
		||||
a.table_comment,
 | 
			
		||||
a.table_type 'type'
 | 
			
		||||
from information_schema.tables a
 | 
			
		||||
where a.table_schema in ({0})", databaseIn);
 | 
			
		||||
where {(ignoreCase ? "lower(a.table_schema)" : "a.table_schema")} in ({databaseIn}){(tbname == null ? "" : $" and {(ignoreCase ? "lower(a.table_name)" : "a.table_name")}={_commonUtils.FormatSql("{0}", tbname[1])}")}";
 | 
			
		||||
            var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
            if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
@@ -217,7 +234,7 @@ where a.table_schema in ({0})", databaseIn);
 | 
			
		||||
            }
 | 
			
		||||
            loc8.Append(")");
 | 
			
		||||
 | 
			
		||||
            sql = string.Format(@"
 | 
			
		||||
            sql = $@"
 | 
			
		||||
select
 | 
			
		||||
concat(a.table_schema, '.', a.table_name),
 | 
			
		||||
a.column_name,
 | 
			
		||||
@@ -229,8 +246,8 @@ case when locate('auto_increment', a.extra) > 0 then 1 else 0 end 'is_identity',
 | 
			
		||||
a.column_comment 'comment',
 | 
			
		||||
a.column_default 'default_value'
 | 
			
		||||
from information_schema.columns a
 | 
			
		||||
where a.table_schema in ({1}) and {0}
 | 
			
		||||
", loc8, databaseIn);
 | 
			
		||||
where {(ignoreCase ? "lower(a.table_schema)" : "a.table_schema")} in ({databaseIn}) and {loc8}
 | 
			
		||||
";
 | 
			
		||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
            if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
@@ -271,7 +288,7 @@ where a.table_schema in ({1}) and {0}
 | 
			
		||||
                loc3[table_id][column].CsType = this.GetCsTypeInfo(loc3[table_id][column]);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            sql = string.Format(@"
 | 
			
		||||
            sql = $@"
 | 
			
		||||
select 
 | 
			
		||||
concat(a.table_schema, '.', a.table_name) 'table_id',
 | 
			
		||||
a.column_name,
 | 
			
		||||
@@ -281,8 +298,8 @@ case when a.index_name = 'PRIMARY' then 1 else 0 end 'IsPrimaryKey',
 | 
			
		||||
0 'IsClustered',
 | 
			
		||||
0 'IsDesc'
 | 
			
		||||
from information_schema.statistics a
 | 
			
		||||
where a.table_schema in ({1}) and {0}
 | 
			
		||||
", loc8, databaseIn);
 | 
			
		||||
where {(ignoreCase ? "lower(a.table_schema)" : "a.table_schema")} in ({databaseIn}) and {loc8}
 | 
			
		||||
";
 | 
			
		||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
            if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
@@ -333,7 +350,9 @@ where a.table_schema in ({1}) and {0}
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            sql = string.Format(@"
 | 
			
		||||
            if (tbname == null)
 | 
			
		||||
            {
 | 
			
		||||
                sql = $@"
 | 
			
		||||
select 
 | 
			
		||||
concat(a.constraint_schema, '.', a.table_name) 'table_id',
 | 
			
		||||
a.column_name,
 | 
			
		||||
@@ -342,43 +361,44 @@ concat(a.referenced_table_schema, '.', a.referenced_table_name) 'ref_table_id',
 | 
			
		||||
1 'IsForeignKey',
 | 
			
		||||
a.referenced_column_name 'ref_column'
 | 
			
		||||
from information_schema.key_column_usage a
 | 
			
		||||
where a.constraint_schema in ({1}) and {0} and not isnull(position_in_unique_constraint)
 | 
			
		||||
", loc8, databaseIn);
 | 
			
		||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
            if (ds == null) return loc1;
 | 
			
		||||
where {(ignoreCase ? "lower(a.constraint_schema)" : "a.constraint_schema")} in ({databaseIn}) and {loc8} and not isnull(position_in_unique_constraint)
 | 
			
		||||
";
 | 
			
		||||
                ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
                if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
            var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
            foreach (var row in ds)
 | 
			
		||||
            {
 | 
			
		||||
                string table_id = string.Concat(row[0]);
 | 
			
		||||
                string column = string.Concat(row[1]);
 | 
			
		||||
                string fk_id = string.Concat(row[2]);
 | 
			
		||||
                string ref_table_id = string.Concat(row[3]);
 | 
			
		||||
                bool is_foreign_key = string.Concat(row[4]) == "1";
 | 
			
		||||
                string referenced_column = string.Concat(row[5]);
 | 
			
		||||
                if (database.Length == 1)
 | 
			
		||||
                var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
                foreach (var row in ds)
 | 
			
		||||
                {
 | 
			
		||||
                    table_id = table_id.Substring(table_id.IndexOf('.') + 1);
 | 
			
		||||
                    ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1);
 | 
			
		||||
                }
 | 
			
		||||
                if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue;
 | 
			
		||||
                var loc9 = loc3[table_id][column];
 | 
			
		||||
                if (loc2.ContainsKey(ref_table_id) == false) continue;
 | 
			
		||||
                var loc10 = loc2[ref_table_id];
 | 
			
		||||
                var loc11 = loc3[ref_table_id][referenced_column];
 | 
			
		||||
                    string table_id = string.Concat(row[0]);
 | 
			
		||||
                    string column = string.Concat(row[1]);
 | 
			
		||||
                    string fk_id = string.Concat(row[2]);
 | 
			
		||||
                    string ref_table_id = string.Concat(row[3]);
 | 
			
		||||
                    bool is_foreign_key = string.Concat(row[4]) == "1";
 | 
			
		||||
                    string referenced_column = string.Concat(row[5]);
 | 
			
		||||
                    if (database.Length == 1)
 | 
			
		||||
                    {
 | 
			
		||||
                        table_id = table_id.Substring(table_id.IndexOf('.') + 1);
 | 
			
		||||
                        ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1);
 | 
			
		||||
                    }
 | 
			
		||||
                    if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue;
 | 
			
		||||
                    var loc9 = loc3[table_id][column];
 | 
			
		||||
                    if (loc2.ContainsKey(ref_table_id) == false) continue;
 | 
			
		||||
                    var loc10 = loc2[ref_table_id];
 | 
			
		||||
                    var loc11 = loc3[ref_table_id][referenced_column];
 | 
			
		||||
 | 
			
		||||
                Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                DbForeignInfo loc13 = null;
 | 
			
		||||
                if (!fkColumns.TryGetValue(table_id, out loc12))
 | 
			
		||||
                    fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                    loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 });
 | 
			
		||||
                loc13.Columns.Add(loc9);
 | 
			
		||||
                loc13.ReferencedColumns.Add(loc11);
 | 
			
		||||
                    Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                    DbForeignInfo loc13 = null;
 | 
			
		||||
                    if (!fkColumns.TryGetValue(table_id, out loc12))
 | 
			
		||||
                        fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                    if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                        loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 });
 | 
			
		||||
                    loc13.Columns.Add(loc9);
 | 
			
		||||
                    loc13.ReferencedColumns.Add(loc11);
 | 
			
		||||
                }
 | 
			
		||||
                foreach (var table_id in fkColumns.Keys)
 | 
			
		||||
                    foreach (var fk in fkColumns[table_id])
 | 
			
		||||
                        loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
            }
 | 
			
		||||
            foreach (var table_id in fkColumns.Keys)
 | 
			
		||||
                foreach (var fk in fkColumns[table_id])
 | 
			
		||||
                    loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
 | 
			
		||||
            foreach (var table_id in loc3.Keys)
 | 
			
		||||
            {
 | 
			
		||||
 
 | 
			
		||||
@@ -185,21 +185,36 @@ namespace FreeSql.Odbc.Oracle
 | 
			
		||||
            return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database2)
 | 
			
		||||
        public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault();
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database) => GetTables(database, null, false);
 | 
			
		||||
 | 
			
		||||
        public List<DbTableInfo> GetTables(string[] database, string tablename, bool ignoreCase)
 | 
			
		||||
        {
 | 
			
		||||
            var loc1 = new List<DbTableInfo>();
 | 
			
		||||
            var loc2 = new Dictionary<string, DbTableInfo>();
 | 
			
		||||
            var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
			
		||||
            var database = database2?.ToArray();
 | 
			
		||||
 | 
			
		||||
            if (database == null || database.Any() == false)
 | 
			
		||||
            string[] tbname = null;
 | 
			
		||||
            if (string.IsNullOrEmpty(tablename) == false)
 | 
			
		||||
            {
 | 
			
		||||
                tbname = _commonUtils.SplitTableName(tablename);
 | 
			
		||||
                if (tbname?.Length == 1)
 | 
			
		||||
                {
 | 
			
		||||
                    var userUsers = _orm.Ado.ExecuteScalar(" select username from user_users")?.ToString();
 | 
			
		||||
                    if (string.IsNullOrEmpty(userUsers)) return loc1;
 | 
			
		||||
                    tbname = new[] { userUsers, tbname[0] };
 | 
			
		||||
                }
 | 
			
		||||
                if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray();
 | 
			
		||||
                database = new[] { tbname[0] };
 | 
			
		||||
            }
 | 
			
		||||
            else if (database == null || database.Any() == false)
 | 
			
		||||
            {
 | 
			
		||||
                var userUsers = _orm.Ado.ExecuteScalar(" select username from user_users")?.ToString();
 | 
			
		||||
                if (string.IsNullOrEmpty(userUsers)) return loc1;
 | 
			
		||||
                database = new[] { userUsers };
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a)));
 | 
			
		||||
            var sql = string.Format(@"
 | 
			
		||||
            var sql = $@"
 | 
			
		||||
select
 | 
			
		||||
a.owner || '.' || a.table_name,
 | 
			
		||||
a.owner,
 | 
			
		||||
@@ -208,7 +223,7 @@ b.comments,
 | 
			
		||||
'TABLE'
 | 
			
		||||
from all_tables a
 | 
			
		||||
left join all_tab_comments b on b.owner = a.owner and b.table_name = a.table_name and b.table_type = 'TABLE'
 | 
			
		||||
where a.owner in ({0})", databaseIn);
 | 
			
		||||
where {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}){(tbname == null ? "" : $" and {(ignoreCase ? "lower(a.table_name)" : "a.table_name")}={_commonUtils.FormatSql("{0}", tbname[1])}")}";
 | 
			
		||||
            var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
            if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
@@ -288,7 +303,7 @@ BEGIN
 | 
			
		||||
  RETURN TEXT_C1;
 | 
			
		||||
END;");
 | 
			
		||||
 | 
			
		||||
            sql = string.Format(@"
 | 
			
		||||
            sql = $@"
 | 
			
		||||
select
 | 
			
		||||
a.owner || '.' || a.table_name,
 | 
			
		||||
a.column_name,
 | 
			
		||||
@@ -303,8 +318,8 @@ to_char(b.comments),
 | 
			
		||||
nvl(FREESQL_LONG_TO_CHAR_DEFAULT(a.table_name, a.column_name),'')
 | 
			
		||||
from all_tab_cols a
 | 
			
		||||
left join all_col_comments b on b.owner = a.owner and b.table_name = a.table_name and b.column_name = a.column_name
 | 
			
		||||
where a.owner in ({1}) and {0}
 | 
			
		||||
", loc8, databaseIn);
 | 
			
		||||
where {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}) and {loc8}
 | 
			
		||||
";
 | 
			
		||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
            if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
@@ -360,7 +375,7 @@ where a.owner in ({1}) and {0}
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            OdbcOracleCodeFirst.CreateOracleFunction(_orm);
 | 
			
		||||
            sql = string.Format(@"
 | 
			
		||||
            sql = $@"
 | 
			
		||||
select
 | 
			
		||||
a.table_owner || '.' || a.table_name,
 | 
			
		||||
nvl(freesql_long_2_varchar(a.index_name, c.table_name, c.column_position), c.column_name),
 | 
			
		||||
@@ -375,8 +390,8 @@ all_ind_columns c
 | 
			
		||||
where a.index_name = c.index_name
 | 
			
		||||
and a.table_owner = c.table_owner
 | 
			
		||||
and a.table_name = c.table_name
 | 
			
		||||
and a.table_owner in ({1}) and {0}
 | 
			
		||||
", loc8, databaseIn);
 | 
			
		||||
and {(ignoreCase ? "lower(a.table_owner)" : "a.table_owner")} in ({databaseIn}) and {loc8}
 | 
			
		||||
";
 | 
			
		||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
            if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
@@ -428,7 +443,9 @@ and a.table_owner in ({1}) and {0}
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            sql = string.Format(@"
 | 
			
		||||
            if (tbname == null)
 | 
			
		||||
            {
 | 
			
		||||
                sql = $@"
 | 
			
		||||
select
 | 
			
		||||
a.owner || '.' || a.table_name,
 | 
			
		||||
c.column_name,
 | 
			
		||||
@@ -462,43 +479,44 @@ and a.owner = c.owner   
 | 
			
		||||
and a.table_name = c.table_name   
 | 
			
		||||
and b.owner = d.owner   
 | 
			
		||||
and b.table_name = d.table_name
 | 
			
		||||
and a.owner in ({1}) and {0}
 | 
			
		||||
", loc8, databaseIn);
 | 
			
		||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
            if (ds == null) return loc1;
 | 
			
		||||
and {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}) and {loc8}
 | 
			
		||||
";
 | 
			
		||||
                ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
                if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
            var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
            foreach (var row in ds)
 | 
			
		||||
            {
 | 
			
		||||
                string table_id = string.Concat(row[0]);
 | 
			
		||||
                string column = string.Concat(row[1]);
 | 
			
		||||
                string fk_id = string.Concat(row[2]);
 | 
			
		||||
                string ref_table_id = string.Concat(row[3]);
 | 
			
		||||
                bool is_foreign_key = string.Concat(row[4]) == "1";
 | 
			
		||||
                string referenced_column = string.Concat(row[5]);
 | 
			
		||||
                if (database.Length == 1)
 | 
			
		||||
                var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
                foreach (var row in ds)
 | 
			
		||||
                {
 | 
			
		||||
                    table_id = table_id.Substring(table_id.IndexOf('.') + 1);
 | 
			
		||||
                    ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1);
 | 
			
		||||
                }
 | 
			
		||||
                if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue;
 | 
			
		||||
                var loc9 = loc3[table_id][column];
 | 
			
		||||
                if (loc2.ContainsKey(ref_table_id) == false) continue;
 | 
			
		||||
                var loc10 = loc2[ref_table_id];
 | 
			
		||||
                var loc11 = loc3[ref_table_id][referenced_column];
 | 
			
		||||
                    string table_id = string.Concat(row[0]);
 | 
			
		||||
                    string column = string.Concat(row[1]);
 | 
			
		||||
                    string fk_id = string.Concat(row[2]);
 | 
			
		||||
                    string ref_table_id = string.Concat(row[3]);
 | 
			
		||||
                    bool is_foreign_key = string.Concat(row[4]) == "1";
 | 
			
		||||
                    string referenced_column = string.Concat(row[5]);
 | 
			
		||||
                    if (database.Length == 1)
 | 
			
		||||
                    {
 | 
			
		||||
                        table_id = table_id.Substring(table_id.IndexOf('.') + 1);
 | 
			
		||||
                        ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1);
 | 
			
		||||
                    }
 | 
			
		||||
                    if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue;
 | 
			
		||||
                    var loc9 = loc3[table_id][column];
 | 
			
		||||
                    if (loc2.ContainsKey(ref_table_id) == false) continue;
 | 
			
		||||
                    var loc10 = loc2[ref_table_id];
 | 
			
		||||
                    var loc11 = loc3[ref_table_id][referenced_column];
 | 
			
		||||
 | 
			
		||||
                Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                DbForeignInfo loc13 = null;
 | 
			
		||||
                if (!fkColumns.TryGetValue(table_id, out loc12))
 | 
			
		||||
                    fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                    loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 });
 | 
			
		||||
                loc13.Columns.Add(loc9);
 | 
			
		||||
                loc13.ReferencedColumns.Add(loc11);
 | 
			
		||||
                    Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                    DbForeignInfo loc13 = null;
 | 
			
		||||
                    if (!fkColumns.TryGetValue(table_id, out loc12))
 | 
			
		||||
                        fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                    if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                        loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 });
 | 
			
		||||
                    loc13.Columns.Add(loc9);
 | 
			
		||||
                    loc13.ReferencedColumns.Add(loc11);
 | 
			
		||||
                }
 | 
			
		||||
                foreach (var table_id in fkColumns.Keys)
 | 
			
		||||
                    foreach (var fk in fkColumns[table_id])
 | 
			
		||||
                        loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
            }
 | 
			
		||||
            foreach (var table_id in fkColumns.Keys)
 | 
			
		||||
                foreach (var fk in fkColumns[table_id])
 | 
			
		||||
                    loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
 | 
			
		||||
            foreach (var table_id in loc3.Keys)
 | 
			
		||||
            {
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,7 @@ namespace FreeSql.Odbc.PostgreSQL
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal string InternalTableAlias;
 | 
			
		||||
        internal string InternalTableAlias { get; set; }
 | 
			
		||||
        internal StringBuilder InternalSbSet => _set;
 | 
			
		||||
        internal StringBuilder InternalSbSetIncr => _setIncr;
 | 
			
		||||
        internal Dictionary<string, bool> InternalIgnore => _ignore;
 | 
			
		||||
 
 | 
			
		||||
@@ -128,11 +128,14 @@ namespace FreeSql.Odbc.PostgreSQL
 | 
			
		||||
            var tbname = _commonUtils.SplitTableName(name);
 | 
			
		||||
            if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] };
 | 
			
		||||
            if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray();
 | 
			
		||||
            var sql = $" select 1 from pg_tables a inner join pg_namespace b on b.nspname = a.schemaname where {(ignoreCase ? "lower(b.nspname)" : "b.nspname")} = {_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(a.tablename)" : "a.tablename")} = {_commonUtils.FormatSql("{0}", tbname[1])}";
 | 
			
		||||
            var sql = $" select 1 from pg_tables a inner join pg_namespace b on b.nspname = a.schemaname where {(ignoreCase ? "lower(b.nspname)" : "b.nspname")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(a.tablename)" : "a.tablename")}={_commonUtils.FormatSql("{0}", tbname[1])}";
 | 
			
		||||
            return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database)
 | 
			
		||||
        public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault();
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database) => GetTables(database, null, false);
 | 
			
		||||
 | 
			
		||||
        public List<DbTableInfo> GetTables(string[] database, string tablename, bool ignoreCase)
 | 
			
		||||
        {
 | 
			
		||||
            var olddatabase = "";
 | 
			
		||||
            var is96 = true;
 | 
			
		||||
@@ -141,7 +144,15 @@ namespace FreeSql.Odbc.PostgreSQL
 | 
			
		||||
                olddatabase = conn.Value.Database;
 | 
			
		||||
                is96 = PgVersionIs96(conn.Value.ServerVersion);
 | 
			
		||||
            }
 | 
			
		||||
            var dbs = database == null || database.Any() == false ? new[] { olddatabase } : database;
 | 
			
		||||
            string[] tbname = null;
 | 
			
		||||
            string[] dbs = database == null || database.Any() == false ? new[] { olddatabase } : database;
 | 
			
		||||
            if (string.IsNullOrEmpty(tablename) == false)
 | 
			
		||||
            {
 | 
			
		||||
                tbname = _commonUtils.SplitTableName(tablename);
 | 
			
		||||
                if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] };
 | 
			
		||||
                if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray();
 | 
			
		||||
                dbs = new[] { olddatabase };
 | 
			
		||||
            }
 | 
			
		||||
            var tables = new List<DbTableInfo>();
 | 
			
		||||
 | 
			
		||||
            foreach (var db in dbs)
 | 
			
		||||
@@ -153,7 +164,7 @@ namespace FreeSql.Odbc.PostgreSQL
 | 
			
		||||
                var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
			
		||||
 | 
			
		||||
                var sql = $@"
 | 
			
		||||
select
 | 
			
		||||
{(tbname == null ? "" : $"select * from (")}select
 | 
			
		||||
b.nspname || '.' || a.tablename,
 | 
			
		||||
a.schemaname,
 | 
			
		||||
a.tablename ,
 | 
			
		||||
@@ -179,7 +190,7 @@ inner join pg_namespace b on b.oid = a.relnamespace
 | 
			
		||||
left join pg_description d on d.objoid = a.oid and objsubid = 0
 | 
			
		||||
where b.nspname not in ('pg_catalog', 'information_schema') and a.relkind in ('m','v') 
 | 
			
		||||
and b.nspname || '.' || a.relname not in ('public.geography_columns','public.geometry_columns','public.raster_columns','public.raster_overviews')
 | 
			
		||||
";
 | 
			
		||||
{(tbname == null ? "" : $") ft_dbf where {(ignoreCase ? "lower(schemaname)" : "schemaname")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(tablename)" : "tablename")}={_commonUtils.FormatSql("{0}", tbname[1])}")}";
 | 
			
		||||
                var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
                if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
@@ -396,7 +407,9 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || d.relname")
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                sql = $@"
 | 
			
		||||
                if (tbname == null)
 | 
			
		||||
                {
 | 
			
		||||
                    sql = $@"
 | 
			
		||||
select
 | 
			
		||||
ns.nspname || '.' || b.relname as table_id, 
 | 
			
		||||
array(select attname from pg_attribute where attrelid = a.conrelid and attnum = any(a.conkey)) as column_name,
 | 
			
		||||
@@ -413,39 +426,40 @@ inner join pg_namespace ns on ns.oid = b.relnamespace
 | 
			
		||||
inner join pg_namespace ns2 on ns2.oid = c.relnamespace
 | 
			
		||||
where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || b.relname")}
 | 
			
		||||
";
 | 
			
		||||
                ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
                if (ds == null) return loc1;
 | 
			
		||||
                    ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
                    if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
                var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
                foreach (object[] row in ds)
 | 
			
		||||
                {
 | 
			
		||||
                    var table_id = string.Concat(row[0]);
 | 
			
		||||
                    var column = row[1] as string[];
 | 
			
		||||
                    var fk_id = string.Concat(row[2]);
 | 
			
		||||
                    var ref_table_id = string.Concat(row[3]);
 | 
			
		||||
                    var is_foreign_key = string.Concat(row[4]) == "1";
 | 
			
		||||
                    var referenced_column = row[5] as string[];
 | 
			
		||||
                    var referenced_db = string.Concat(row[6]);
 | 
			
		||||
                    var referenced_table = string.Concat(row[7]);
 | 
			
		||||
 | 
			
		||||
                    if (loc2.ContainsKey(ref_table_id) == false) continue;
 | 
			
		||||
 | 
			
		||||
                    Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                    DbForeignInfo loc13 = null;
 | 
			
		||||
                    if (!fkColumns.TryGetValue(table_id, out loc12))
 | 
			
		||||
                        fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                    if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                        loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc2[ref_table_id] });
 | 
			
		||||
 | 
			
		||||
                    for (int a = 0; a < column.Length; a++)
 | 
			
		||||
                    var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
                    foreach (object[] row in ds)
 | 
			
		||||
                    {
 | 
			
		||||
                        loc13.Columns.Add(loc3[table_id][column[a]]);
 | 
			
		||||
                        loc13.ReferencedColumns.Add(loc3[ref_table_id][referenced_column[a]]);
 | 
			
		||||
                        var table_id = string.Concat(row[0]);
 | 
			
		||||
                        var column = row[1] as string[];
 | 
			
		||||
                        var fk_id = string.Concat(row[2]);
 | 
			
		||||
                        var ref_table_id = string.Concat(row[3]);
 | 
			
		||||
                        var is_foreign_key = string.Concat(row[4]) == "1";
 | 
			
		||||
                        var referenced_column = row[5] as string[];
 | 
			
		||||
                        var referenced_db = string.Concat(row[6]);
 | 
			
		||||
                        var referenced_table = string.Concat(row[7]);
 | 
			
		||||
 | 
			
		||||
                        if (loc2.ContainsKey(ref_table_id) == false) continue;
 | 
			
		||||
 | 
			
		||||
                        Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                        DbForeignInfo loc13 = null;
 | 
			
		||||
                        if (!fkColumns.TryGetValue(table_id, out loc12))
 | 
			
		||||
                            fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                        if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                            loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc2[ref_table_id] });
 | 
			
		||||
 | 
			
		||||
                        for (int a = 0; a < column.Length; a++)
 | 
			
		||||
                        {
 | 
			
		||||
                            loc13.Columns.Add(loc3[table_id][column[a]]);
 | 
			
		||||
                            loc13.ReferencedColumns.Add(loc3[ref_table_id][referenced_column[a]]);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    foreach (var table_id in fkColumns.Keys)
 | 
			
		||||
                        foreach (var fk in fkColumns[table_id])
 | 
			
		||||
                            loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
                }
 | 
			
		||||
                foreach (var table_id in fkColumns.Keys)
 | 
			
		||||
                    foreach (var fk in fkColumns[table_id])
 | 
			
		||||
                        loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
 | 
			
		||||
                foreach (var table_id in loc3.Keys)
 | 
			
		||||
                {
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,6 @@ using System.Data;
 | 
			
		||||
using System.Data.Odbc;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Text.RegularExpressions;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.Odbc.SqlServer
 | 
			
		||||
{
 | 
			
		||||
@@ -125,21 +124,32 @@ select
 | 
			
		||||
1
 | 
			
		||||
from sys.tables a
 | 
			
		||||
inner join sys.schemas b on b.schema_id = a.schema_id
 | 
			
		||||
where lower(b.name) = {_commonUtils.FormatSql("{0}", tbname[1])} and lower(a.name) = {_commonUtils.FormatSql("{0}", tbname[2])}
 | 
			
		||||
where lower(b.name)={_commonUtils.FormatSql("{0}", tbname[1])} and lower(a.name)={_commonUtils.FormatSql("{0}", tbname[2])}
 | 
			
		||||
;
 | 
			
		||||
use [{olddatabase}];
 | 
			
		||||
";
 | 
			
		||||
            return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1";
 | 
			
		||||
        }
 | 
			
		||||
        public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault();
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database) => GetTables(database, null, false);
 | 
			
		||||
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database)
 | 
			
		||||
        public List<DbTableInfo> GetTables(string[] database, string tablename, bool ignoreCase)
 | 
			
		||||
        {
 | 
			
		||||
            var olddatabase = "";
 | 
			
		||||
            using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)))
 | 
			
		||||
            {
 | 
			
		||||
                olddatabase = conn.Value.Database;
 | 
			
		||||
            }
 | 
			
		||||
            var dbs = database == null || database.Any() == false ? new[] { olddatabase } : database;
 | 
			
		||||
            string[] tbname = null;
 | 
			
		||||
            string[] dbs = database == null || database.Any() == false ? new[] { olddatabase } : database;
 | 
			
		||||
            if (string.IsNullOrEmpty(tablename) == false)
 | 
			
		||||
            {
 | 
			
		||||
                tbname = _commonUtils.SplitTableName(tablename);
 | 
			
		||||
                if (tbname?.Length == 1) tbname = new[] { olddatabase, "dbo", tbname[0] };
 | 
			
		||||
                if (tbname?.Length == 2) tbname = new[] { olddatabase, tbname[0], tbname[1] };
 | 
			
		||||
                tbname = tbname.Select(a => a.ToLower()).ToArray();
 | 
			
		||||
                dbs = new[] { tbname[0] };
 | 
			
		||||
            }
 | 
			
		||||
            var tables = new List<DbTableInfo>();
 | 
			
		||||
 | 
			
		||||
            foreach (var db in dbs)
 | 
			
		||||
@@ -152,6 +162,7 @@ use [{olddatabase}];
 | 
			
		||||
 | 
			
		||||
                var sql = $@"
 | 
			
		||||
use [{db}];
 | 
			
		||||
select * from (
 | 
			
		||||
select 
 | 
			
		||||
 a.Object_id
 | 
			
		||||
,b.name 'Owner'
 | 
			
		||||
@@ -180,8 +191,8 @@ select
 | 
			
		||||
from sys.procedures a
 | 
			
		||||
inner join sys.schemas b on b.schema_id = a.schema_id
 | 
			
		||||
where a.type = 'P' and charindex('diagram', a.name) = 0
 | 
			
		||||
order by type desc, b.name, a.name
 | 
			
		||||
;
 | 
			
		||||
) ft_dbf{(tbname == null ? "" : _commonUtils.FormatSql(" where lower([owner])={0} and lower([Name])={1}", new[] { tbname[1], tbname[2] }))}
 | 
			
		||||
order by type desc, [owner], [Name];
 | 
			
		||||
use [{olddatabase}];
 | 
			
		||||
";
 | 
			
		||||
                var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
@@ -264,7 +275,7 @@ isnull(e.name,'') + '.' + isnull(d.name,'')
 | 
			
		||||
  else cast(a.max_length as varchar) end + ')'
 | 
			
		||||
 when b.name in ('Numeric', 'Decimal') then '(' + cast(a.precision as varchar) + ',' + cast(a.scale as varchar) + ')'
 | 
			
		||||
 else '' end as 'SqlType'
 | 
			
		||||
,(select value from sys.extended_properties where major_id = a.object_id AND minor_id = a.column_id AND name = 'MS_Description') 'Comment'
 | 
			
		||||
,( select value from sys.extended_properties where major_id = a.object_id AND minor_id = a.column_id AND name = 'MS_Description') 'Comment'
 | 
			
		||||
{0} a
 | 
			
		||||
inner join sys.types b on b.user_type_id = a.user_type_id
 | 
			
		||||
left join sys.tables d on d.object_id = a.object_id
 | 
			
		||||
@@ -392,7 +403,9 @@ use [{olddatabase}];
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                sql = $@"
 | 
			
		||||
                if (tbname == null)
 | 
			
		||||
                {
 | 
			
		||||
                    sql = $@"
 | 
			
		||||
use [{db}];
 | 
			
		||||
select 
 | 
			
		||||
 b.object_id 'Object_id'
 | 
			
		||||
@@ -412,47 +425,48 @@ where {loc8.ToString().Replace("a.table_name", "b.object_id")}
 | 
			
		||||
;
 | 
			
		||||
use [{olddatabase}];
 | 
			
		||||
";
 | 
			
		||||
                ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
                if (ds == null) return loc1;
 | 
			
		||||
                    ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
                    if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
                var fkColumns = new Dictionary<int, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
                foreach (object[] row in ds)
 | 
			
		||||
                {
 | 
			
		||||
                    int object_id, referenced_object_id;
 | 
			
		||||
                    int.TryParse(string.Concat(row[0]), out object_id);
 | 
			
		||||
                    var column = string.Concat(row[1]);
 | 
			
		||||
                    string fk_id = string.Concat(row[2]);
 | 
			
		||||
                    int.TryParse(string.Concat(row[3]), out referenced_object_id);
 | 
			
		||||
                    var is_foreign_key = bool.Parse(string.Concat(row[4]));
 | 
			
		||||
                    var referenced_column = string.Concat(row[5]);
 | 
			
		||||
                    var referenced_db = string.Concat(row[6]);
 | 
			
		||||
                    var referenced_table = string.Concat(row[7]);
 | 
			
		||||
                    DbColumnInfo loc9 = loc3[object_id][column];
 | 
			
		||||
                    DbTableInfo loc10 = null;
 | 
			
		||||
                    DbColumnInfo loc11 = null;
 | 
			
		||||
                    bool isThisSln = referenced_object_id != 0;
 | 
			
		||||
 | 
			
		||||
                    if (isThisSln)
 | 
			
		||||
                    {
 | 
			
		||||
                        loc10 = loc2[referenced_object_id];
 | 
			
		||||
                        loc11 = loc3[referenced_object_id][referenced_column];
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    var fkColumns = new Dictionary<int, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
                    foreach (object[] row in ds)
 | 
			
		||||
                    {
 | 
			
		||||
                        int object_id, referenced_object_id;
 | 
			
		||||
                        int.TryParse(string.Concat(row[0]), out object_id);
 | 
			
		||||
                        var column = string.Concat(row[1]);
 | 
			
		||||
                        string fk_id = string.Concat(row[2]);
 | 
			
		||||
                        int.TryParse(string.Concat(row[3]), out referenced_object_id);
 | 
			
		||||
                        var is_foreign_key = bool.Parse(string.Concat(row[4]));
 | 
			
		||||
                        var referenced_column = string.Concat(row[5]);
 | 
			
		||||
                        var referenced_db = string.Concat(row[6]);
 | 
			
		||||
                        var referenced_table = string.Concat(row[7]);
 | 
			
		||||
                        DbColumnInfo loc9 = loc3[object_id][column];
 | 
			
		||||
                        DbTableInfo loc10 = null;
 | 
			
		||||
                        DbColumnInfo loc11 = null;
 | 
			
		||||
                        bool isThisSln = referenced_object_id != 0;
 | 
			
		||||
 | 
			
		||||
                        if (isThisSln)
 | 
			
		||||
                        {
 | 
			
		||||
                            loc10 = loc2[referenced_object_id];
 | 
			
		||||
                            loc11 = loc3[referenced_object_id][referenced_column];
 | 
			
		||||
                        }
 | 
			
		||||
                        else
 | 
			
		||||
                        {
 | 
			
		||||
 | 
			
		||||
                        }
 | 
			
		||||
                        Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                        DbForeignInfo loc13 = null;
 | 
			
		||||
                        if (!fkColumns.TryGetValue(object_id, out loc12))
 | 
			
		||||
                            fkColumns.Add(object_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                        if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                            loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[object_id], ReferencedTable = loc10 });
 | 
			
		||||
                        loc13.Columns.Add(loc9);
 | 
			
		||||
                        loc13.ReferencedColumns.Add(loc11);
 | 
			
		||||
                    }
 | 
			
		||||
                    Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                    DbForeignInfo loc13 = null;
 | 
			
		||||
                    if (!fkColumns.TryGetValue(object_id, out loc12))
 | 
			
		||||
                        fkColumns.Add(object_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                    if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                        loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[object_id], ReferencedTable = loc10 });
 | 
			
		||||
                    loc13.Columns.Add(loc9);
 | 
			
		||||
                    loc13.ReferencedColumns.Add(loc11);
 | 
			
		||||
                    foreach (var table_id in fkColumns.Keys)
 | 
			
		||||
                        foreach (var fk in fkColumns[table_id])
 | 
			
		||||
                            loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
                }
 | 
			
		||||
                foreach (var table_id in fkColumns.Keys)
 | 
			
		||||
                    foreach (var fk in fkColumns[table_id])
 | 
			
		||||
                        loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
 | 
			
		||||
                foreach (var table_id in loc3.Keys)
 | 
			
		||||
                {
 | 
			
		||||
 
 | 
			
		||||
@@ -185,21 +185,36 @@ namespace FreeSql.Oracle
 | 
			
		||||
            return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database2)
 | 
			
		||||
        public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault();
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database) => GetTables(database, null, false);
 | 
			
		||||
 | 
			
		||||
        public List<DbTableInfo> GetTables(string[] database, string tablename, bool ignoreCase)
 | 
			
		||||
        {
 | 
			
		||||
            var loc1 = new List<DbTableInfo>();
 | 
			
		||||
            var loc2 = new Dictionary<string, DbTableInfo>();
 | 
			
		||||
            var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
			
		||||
            var database = database2?.ToArray();
 | 
			
		||||
 | 
			
		||||
            if (database == null || database.Any() == false)
 | 
			
		||||
            string[] tbname = null;
 | 
			
		||||
            if (string.IsNullOrEmpty(tablename) == false)
 | 
			
		||||
            {
 | 
			
		||||
                tbname = _commonUtils.SplitTableName(tablename);
 | 
			
		||||
                if (tbname?.Length == 1)
 | 
			
		||||
                {
 | 
			
		||||
                    var userUsers = _orm.Ado.ExecuteScalar(" select username from user_users")?.ToString();
 | 
			
		||||
                    if (string.IsNullOrEmpty(userUsers)) return loc1;
 | 
			
		||||
                    tbname = new[] { userUsers, tbname[0] };
 | 
			
		||||
                }
 | 
			
		||||
                if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray();
 | 
			
		||||
                database = new[] { tbname[0] };
 | 
			
		||||
            }
 | 
			
		||||
            else if (database == null || database.Any() == false)
 | 
			
		||||
            {
 | 
			
		||||
                var userUsers = _orm.Ado.ExecuteScalar(" select username from user_users")?.ToString();
 | 
			
		||||
                if (string.IsNullOrEmpty(userUsers)) return loc1;
 | 
			
		||||
                database = new[] { userUsers };
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a)));
 | 
			
		||||
            var sql = string.Format(@"
 | 
			
		||||
            var sql = $@"
 | 
			
		||||
select
 | 
			
		||||
a.owner || '.' || a.table_name,
 | 
			
		||||
a.owner,
 | 
			
		||||
@@ -208,7 +223,7 @@ b.comments,
 | 
			
		||||
'TABLE'
 | 
			
		||||
from all_tables a
 | 
			
		||||
left join all_tab_comments b on b.owner = a.owner and b.table_name = a.table_name and b.table_type = 'TABLE'
 | 
			
		||||
where a.owner in ({0})", databaseIn);
 | 
			
		||||
where {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}){(tbname == null ? "" : $" and {(ignoreCase ? "lower(a.table_name)" : "a.table_name")}={_commonUtils.FormatSql("{0}", tbname[1])}")}";
 | 
			
		||||
            var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
            if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
@@ -288,7 +303,7 @@ BEGIN
 | 
			
		||||
  RETURN TEXT_C1;
 | 
			
		||||
END;");
 | 
			
		||||
 | 
			
		||||
            sql = string.Format(@"
 | 
			
		||||
            sql = $@"
 | 
			
		||||
select
 | 
			
		||||
a.owner || '.' || a.table_name,
 | 
			
		||||
a.column_name,
 | 
			
		||||
@@ -303,8 +318,8 @@ to_char(b.comments),
 | 
			
		||||
nvl(FREESQL_LONG_TO_CHAR_DEFAULT(a.table_name, a.column_name),'')
 | 
			
		||||
from all_tab_cols a
 | 
			
		||||
left join all_col_comments b on b.owner = a.owner and b.table_name = a.table_name and b.column_name = a.column_name
 | 
			
		||||
where a.owner in ({1}) and {0}
 | 
			
		||||
", loc8, databaseIn);
 | 
			
		||||
where {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}) and {loc8}
 | 
			
		||||
";
 | 
			
		||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
            if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
@@ -360,7 +375,7 @@ where a.owner in ({1}) and {0}
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            OracleCodeFirst.CreateOracleFunction(_orm);
 | 
			
		||||
            sql = string.Format(@"
 | 
			
		||||
            sql = $@"
 | 
			
		||||
select
 | 
			
		||||
a.table_owner || '.' || a.table_name,
 | 
			
		||||
nvl(freesql_long_2_varchar(a.index_name, c.table_name, c.column_position), c.column_name),
 | 
			
		||||
@@ -375,8 +390,8 @@ all_ind_columns c
 | 
			
		||||
where a.index_name = c.index_name
 | 
			
		||||
and a.table_owner = c.table_owner
 | 
			
		||||
and a.table_name = c.table_name
 | 
			
		||||
and a.table_owner in ({1}) and {0}
 | 
			
		||||
", loc8, databaseIn);
 | 
			
		||||
and {(ignoreCase ? "lower(a.table_owner)" : "a.table_owner")} in ({databaseIn}) and {loc8}
 | 
			
		||||
";
 | 
			
		||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
            if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
@@ -428,7 +443,9 @@ and a.table_owner in ({1}) and {0}
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            sql = string.Format(@"
 | 
			
		||||
            if (tbname == null)
 | 
			
		||||
            {
 | 
			
		||||
                sql = $@"
 | 
			
		||||
select
 | 
			
		||||
a.owner || '.' || a.table_name,
 | 
			
		||||
c.column_name,
 | 
			
		||||
@@ -462,43 +479,44 @@ and a.owner = c.owner   
 | 
			
		||||
and a.table_name = c.table_name   
 | 
			
		||||
and b.owner = d.owner   
 | 
			
		||||
and b.table_name = d.table_name
 | 
			
		||||
and a.owner in ({1}) and {0}
 | 
			
		||||
", loc8, databaseIn);
 | 
			
		||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
            if (ds == null) return loc1;
 | 
			
		||||
and {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}) and {loc8}
 | 
			
		||||
";
 | 
			
		||||
                ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
                if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
            var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
            foreach (var row in ds)
 | 
			
		||||
            {
 | 
			
		||||
                string table_id = string.Concat(row[0]);
 | 
			
		||||
                string column = string.Concat(row[1]);
 | 
			
		||||
                string fk_id = string.Concat(row[2]);
 | 
			
		||||
                string ref_table_id = string.Concat(row[3]);
 | 
			
		||||
                bool is_foreign_key = string.Concat(row[4]) == "1";
 | 
			
		||||
                string referenced_column = string.Concat(row[5]);
 | 
			
		||||
                if (database.Length == 1)
 | 
			
		||||
                var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
                foreach (var row in ds)
 | 
			
		||||
                {
 | 
			
		||||
                    table_id = table_id.Substring(table_id.IndexOf('.') + 1);
 | 
			
		||||
                    ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1);
 | 
			
		||||
                }
 | 
			
		||||
                if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue;
 | 
			
		||||
                var loc9 = loc3[table_id][column];
 | 
			
		||||
                if (loc2.ContainsKey(ref_table_id) == false) continue;
 | 
			
		||||
                var loc10 = loc2[ref_table_id];
 | 
			
		||||
                var loc11 = loc3[ref_table_id][referenced_column];
 | 
			
		||||
                    string table_id = string.Concat(row[0]);
 | 
			
		||||
                    string column = string.Concat(row[1]);
 | 
			
		||||
                    string fk_id = string.Concat(row[2]);
 | 
			
		||||
                    string ref_table_id = string.Concat(row[3]);
 | 
			
		||||
                    bool is_foreign_key = string.Concat(row[4]) == "1";
 | 
			
		||||
                    string referenced_column = string.Concat(row[5]);
 | 
			
		||||
                    if (database.Length == 1)
 | 
			
		||||
                    {
 | 
			
		||||
                        table_id = table_id.Substring(table_id.IndexOf('.') + 1);
 | 
			
		||||
                        ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1);
 | 
			
		||||
                    }
 | 
			
		||||
                    if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue;
 | 
			
		||||
                    var loc9 = loc3[table_id][column];
 | 
			
		||||
                    if (loc2.ContainsKey(ref_table_id) == false) continue;
 | 
			
		||||
                    var loc10 = loc2[ref_table_id];
 | 
			
		||||
                    var loc11 = loc3[ref_table_id][referenced_column];
 | 
			
		||||
 | 
			
		||||
                Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                DbForeignInfo loc13 = null;
 | 
			
		||||
                if (!fkColumns.TryGetValue(table_id, out loc12))
 | 
			
		||||
                    fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                    loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 });
 | 
			
		||||
                loc13.Columns.Add(loc9);
 | 
			
		||||
                loc13.ReferencedColumns.Add(loc11);
 | 
			
		||||
                    Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                    DbForeignInfo loc13 = null;
 | 
			
		||||
                    if (!fkColumns.TryGetValue(table_id, out loc12))
 | 
			
		||||
                        fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                    if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                        loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 });
 | 
			
		||||
                    loc13.Columns.Add(loc9);
 | 
			
		||||
                    loc13.ReferencedColumns.Add(loc11);
 | 
			
		||||
                }
 | 
			
		||||
                foreach (var table_id in fkColumns.Keys)
 | 
			
		||||
                    foreach (var fk in fkColumns[table_id])
 | 
			
		||||
                        loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
            }
 | 
			
		||||
            foreach (var table_id in fkColumns.Keys)
 | 
			
		||||
                foreach (var fk in fkColumns[table_id])
 | 
			
		||||
                    loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
 | 
			
		||||
            foreach (var table_id in loc3.Keys)
 | 
			
		||||
            {
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,7 @@ namespace FreeSql.PostgreSQL.Curd
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal string InternalTableAlias;
 | 
			
		||||
        internal string InternalTableAlias { get; set; }
 | 
			
		||||
        internal StringBuilder InternalSbSet => _set;
 | 
			
		||||
        internal StringBuilder InternalSbSetIncr => _setIncr;
 | 
			
		||||
        internal Dictionary<string, bool> InternalIgnore => _ignore;
 | 
			
		||||
 
 | 
			
		||||
@@ -238,11 +238,14 @@ namespace FreeSql.PostgreSQL
 | 
			
		||||
            var tbname = _commonUtils.SplitTableName(name);
 | 
			
		||||
            if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] };
 | 
			
		||||
            if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray();
 | 
			
		||||
            var sql = $" select 1 from pg_tables a inner join pg_namespace b on b.nspname = a.schemaname where {(ignoreCase ? "lower(b.nspname)" : "b.nspname")} = {_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(a.tablename)" : "a.tablename")} = {_commonUtils.FormatSql("{0}", tbname[1])}";
 | 
			
		||||
            var sql = $" select 1 from pg_tables a inner join pg_namespace b on b.nspname = a.schemaname where {(ignoreCase ? "lower(b.nspname)" : "b.nspname")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(a.tablename)" : "a.tablename")}={_commonUtils.FormatSql("{0}", tbname[1])}";
 | 
			
		||||
            return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database)
 | 
			
		||||
        public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault();
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database) => GetTables(database, null, false);
 | 
			
		||||
 | 
			
		||||
        public List<DbTableInfo> GetTables(string[] database, string tablename, bool ignoreCase)
 | 
			
		||||
        {
 | 
			
		||||
            var olddatabase = "";
 | 
			
		||||
            var is96 = true;
 | 
			
		||||
@@ -251,7 +254,15 @@ namespace FreeSql.PostgreSQL
 | 
			
		||||
                olddatabase = conn.Value.Database;
 | 
			
		||||
                is96 = PgVersionIs96(conn.Value.ServerVersion);
 | 
			
		||||
            }
 | 
			
		||||
            var dbs = database == null || database.Any() == false ? new[] { olddatabase } : database;
 | 
			
		||||
            string[] tbname = null;
 | 
			
		||||
            string[] dbs = database == null || database.Any() == false ? new[] { olddatabase } : database;
 | 
			
		||||
            if (string.IsNullOrEmpty(tablename) == false)
 | 
			
		||||
            {
 | 
			
		||||
                tbname = _commonUtils.SplitTableName(tablename);
 | 
			
		||||
                if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] };
 | 
			
		||||
                if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray();
 | 
			
		||||
                dbs = new[] { olddatabase };
 | 
			
		||||
            }
 | 
			
		||||
            var tables = new List<DbTableInfo>();
 | 
			
		||||
 | 
			
		||||
            foreach (var db in dbs)
 | 
			
		||||
@@ -263,7 +274,7 @@ namespace FreeSql.PostgreSQL
 | 
			
		||||
                var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
			
		||||
 | 
			
		||||
                var sql = $@"
 | 
			
		||||
select
 | 
			
		||||
{(tbname == null ? "" : $"select * from (")}select
 | 
			
		||||
b.nspname || '.' || a.tablename,
 | 
			
		||||
a.schemaname,
 | 
			
		||||
a.tablename ,
 | 
			
		||||
@@ -289,7 +300,7 @@ inner join pg_namespace b on b.oid = a.relnamespace
 | 
			
		||||
left join pg_description d on d.objoid = a.oid and objsubid = 0
 | 
			
		||||
where b.nspname not in ('pg_catalog', 'information_schema') and a.relkind in ('m','v') 
 | 
			
		||||
and b.nspname || '.' || a.relname not in ('public.geography_columns','public.geometry_columns','public.raster_columns','public.raster_overviews')
 | 
			
		||||
";
 | 
			
		||||
{(tbname == null ? "" : $") ft_dbf where {(ignoreCase ? "lower(schemaname)" : "schemaname")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(tablename)" : "tablename")}={_commonUtils.FormatSql("{0}", tbname[1])}")}";
 | 
			
		||||
                var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
                if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
@@ -506,7 +517,9 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || d.relname")
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                sql = $@"
 | 
			
		||||
                if (tbname == null)
 | 
			
		||||
                {
 | 
			
		||||
                    sql = $@"
 | 
			
		||||
select
 | 
			
		||||
ns.nspname || '.' || b.relname as table_id, 
 | 
			
		||||
array(select attname from pg_attribute where attrelid = a.conrelid and attnum = any(a.conkey)) as column_name,
 | 
			
		||||
@@ -523,39 +536,40 @@ inner join pg_namespace ns on ns.oid = b.relnamespace
 | 
			
		||||
inner join pg_namespace ns2 on ns2.oid = c.relnamespace
 | 
			
		||||
where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || b.relname")}
 | 
			
		||||
";
 | 
			
		||||
                ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
                if (ds == null) return loc1;
 | 
			
		||||
                    ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
                    if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
                var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
                foreach (object[] row in ds)
 | 
			
		||||
                {
 | 
			
		||||
                    var table_id = string.Concat(row[0]);
 | 
			
		||||
                    var column = row[1] as string[];
 | 
			
		||||
                    var fk_id = string.Concat(row[2]);
 | 
			
		||||
                    var ref_table_id = string.Concat(row[3]);
 | 
			
		||||
                    var is_foreign_key = string.Concat(row[4]) == "1";
 | 
			
		||||
                    var referenced_column = row[5] as string[];
 | 
			
		||||
                    var referenced_db = string.Concat(row[6]);
 | 
			
		||||
                    var referenced_table = string.Concat(row[7]);
 | 
			
		||||
 | 
			
		||||
                    if (loc2.ContainsKey(ref_table_id) == false) continue;
 | 
			
		||||
 | 
			
		||||
                    Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                    DbForeignInfo loc13 = null;
 | 
			
		||||
                    if (!fkColumns.TryGetValue(table_id, out loc12))
 | 
			
		||||
                        fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                    if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                        loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc2[ref_table_id] });
 | 
			
		||||
 | 
			
		||||
                    for (int a = 0; a < column.Length; a++)
 | 
			
		||||
                    var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
                    foreach (object[] row in ds)
 | 
			
		||||
                    {
 | 
			
		||||
                        loc13.Columns.Add(loc3[table_id][column[a]]);
 | 
			
		||||
                        loc13.ReferencedColumns.Add(loc3[ref_table_id][referenced_column[a]]);
 | 
			
		||||
                        var table_id = string.Concat(row[0]);
 | 
			
		||||
                        var column = row[1] as string[];
 | 
			
		||||
                        var fk_id = string.Concat(row[2]);
 | 
			
		||||
                        var ref_table_id = string.Concat(row[3]);
 | 
			
		||||
                        var is_foreign_key = string.Concat(row[4]) == "1";
 | 
			
		||||
                        var referenced_column = row[5] as string[];
 | 
			
		||||
                        var referenced_db = string.Concat(row[6]);
 | 
			
		||||
                        var referenced_table = string.Concat(row[7]);
 | 
			
		||||
 | 
			
		||||
                        if (loc2.ContainsKey(ref_table_id) == false) continue;
 | 
			
		||||
 | 
			
		||||
                        Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                        DbForeignInfo loc13 = null;
 | 
			
		||||
                        if (!fkColumns.TryGetValue(table_id, out loc12))
 | 
			
		||||
                            fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                        if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                            loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc2[ref_table_id] });
 | 
			
		||||
 | 
			
		||||
                        for (int a = 0; a < column.Length; a++)
 | 
			
		||||
                        {
 | 
			
		||||
                            loc13.Columns.Add(loc3[table_id][column[a]]);
 | 
			
		||||
                            loc13.ReferencedColumns.Add(loc3[ref_table_id][referenced_column[a]]);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    foreach (var table_id in fkColumns.Keys)
 | 
			
		||||
                        foreach (var fk in fkColumns[table_id])
 | 
			
		||||
                            loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
                }
 | 
			
		||||
                foreach (var table_id in fkColumns.Keys)
 | 
			
		||||
                    foreach (var fk in fkColumns[table_id])
 | 
			
		||||
                        loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
 | 
			
		||||
                foreach (var table_id in loc3.Keys)
 | 
			
		||||
                {
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,7 @@ namespace FreeSql.ShenTong.Curd
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal string InternalTableAlias;
 | 
			
		||||
        internal string InternalTableAlias { get; set; }
 | 
			
		||||
        internal StringBuilder InternalSbSet => _set;
 | 
			
		||||
        internal StringBuilder InternalSbSetIncr => _setIncr;
 | 
			
		||||
        internal Dictionary<string, bool> InternalIgnore => _ignore;
 | 
			
		||||
 
 | 
			
		||||
@@ -134,19 +134,30 @@ select
 | 
			
		||||
1
 | 
			
		||||
from sys_class a
 | 
			
		||||
inner join sys_namespace b on b.oid = a.relnamespace
 | 
			
		||||
where {(ignoreCase ? "lower(b.nspname)" : "b.nspname")} = {_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(a.relname)" : "a.relname")} = {_commonUtils.FormatSql("{0}", tbname[1])} and a.relkind in ('r')
 | 
			
		||||
where {(ignoreCase ? "lower(b.nspname)" : "b.nspname")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(a.relname)" : "a.relname")}={_commonUtils.FormatSql("{0}", tbname[1])} and a.relkind in ('r')
 | 
			
		||||
";
 | 
			
		||||
            return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database)
 | 
			
		||||
        public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault();
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database) => GetTables(database, null, false);
 | 
			
		||||
 | 
			
		||||
        public List<DbTableInfo> GetTables(string[] database, string tablename, bool ignoreCase)
 | 
			
		||||
        {
 | 
			
		||||
            var olddatabase = "";
 | 
			
		||||
            using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)))
 | 
			
		||||
            {
 | 
			
		||||
                olddatabase = conn.Value.Database;
 | 
			
		||||
            }
 | 
			
		||||
            var dbs = database == null || database.Any() == false ? new[] { olddatabase } : database;
 | 
			
		||||
            string[] tbname = null;
 | 
			
		||||
            string[] dbs = database == null || database.Any() == false ? new[] { olddatabase } : database;
 | 
			
		||||
            if (string.IsNullOrEmpty(tablename) == false)
 | 
			
		||||
            {
 | 
			
		||||
                tbname = _commonUtils.SplitTableName(tablename);
 | 
			
		||||
                if (tbname?.Length == 1) tbname = new[] { "PUBLIC", tbname[0] };
 | 
			
		||||
                if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray();
 | 
			
		||||
                dbs = new[] { olddatabase };
 | 
			
		||||
            }
 | 
			
		||||
            var tables = new List<DbTableInfo>();
 | 
			
		||||
 | 
			
		||||
            foreach (var db in dbs)
 | 
			
		||||
@@ -158,7 +169,7 @@ where {(ignoreCase ? "lower(b.nspname)" : "b.nspname")} = {_commonUtils.FormatSq
 | 
			
		||||
                var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
			
		||||
 | 
			
		||||
                var sql = $@"
 | 
			
		||||
select
 | 
			
		||||
{(tbname == null ? "" : $"select * from (")}select
 | 
			
		||||
b.nspname || '.' || a.relname,
 | 
			
		||||
b.nspname,
 | 
			
		||||
a.relname,
 | 
			
		||||
@@ -183,7 +194,7 @@ inner join sys_namespace b on b.oid = a.relnamespace
 | 
			
		||||
left join sys_description d on d.objoid = a.oid and objsubid = 0
 | 
			
		||||
where b.nspname not in ('DIRECTORIES', 'INFO_SCHEM', 'REPLICATION', 'STAGENT', 'SYSAUDIT', 'SYSDBA', 'SYSFTSDBA', 'SYSSECURE', 'SYS_GLOBAL_TEMP', 'WMSYS') and a.relkind in ('m','v') 
 | 
			
		||||
and b.nspname || '.' || a.relname not in ('PUBLIC.GEOGRAPHY_COLUMNS','PUBLIC.GEOMETRY_COLUMNS','PUBLIC.RASTER_COLUMNS','PUBLIC.RASTER_OVERVIEWS','PUBLIC.DBA_JOBS')
 | 
			
		||||
";
 | 
			
		||||
{(tbname == null ? "" : $") ft_dbf where {(ignoreCase ? "lower(nspname)" : "nspname")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(relname)" : "relname")}={_commonUtils.FormatSql("{0}", tbname[1])}")}";
 | 
			
		||||
                var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
                if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
@@ -400,7 +411,9 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || d.relname")
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                sql = $@"
 | 
			
		||||
                if (tbname == null)
 | 
			
		||||
                {
 | 
			
		||||
                    sql = $@"
 | 
			
		||||
select
 | 
			
		||||
a.pktable_schem || '.' || a.pktable_name,
 | 
			
		||||
a.pkcolumn_name,
 | 
			
		||||
@@ -411,36 +424,37 @@ a.fkcolumn_name
 | 
			
		||||
from v_sys_foreign_keys a
 | 
			
		||||
where {loc8.ToString().Replace("a.table_name", "a.pktable_schem || '.' || a.pktable_name")}
 | 
			
		||||
";
 | 
			
		||||
                ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
                if (ds == null) return loc1;
 | 
			
		||||
                    ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
                    if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
                var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
                foreach (var row in ds)
 | 
			
		||||
                {
 | 
			
		||||
                    string table_id = string.Concat(row[0]);
 | 
			
		||||
                    string column = string.Concat(row[1]);
 | 
			
		||||
                    string fk_id = string.Concat(row[2]);
 | 
			
		||||
                    string ref_table_id = string.Concat(row[3]);
 | 
			
		||||
                    bool is_foreign_key = string.Concat(row[4]) == "1";
 | 
			
		||||
                    string referenced_column = string.Concat(row[5]);
 | 
			
		||||
                    if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue;
 | 
			
		||||
                    var loc9 = loc3[table_id][column];
 | 
			
		||||
                    if (loc2.ContainsKey(ref_table_id) == false) continue;
 | 
			
		||||
                    var loc10 = loc2[ref_table_id];
 | 
			
		||||
                    var loc11 = loc3[ref_table_id][referenced_column];
 | 
			
		||||
                    var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
                    foreach (var row in ds)
 | 
			
		||||
                    {
 | 
			
		||||
                        string table_id = string.Concat(row[0]);
 | 
			
		||||
                        string column = string.Concat(row[1]);
 | 
			
		||||
                        string fk_id = string.Concat(row[2]);
 | 
			
		||||
                        string ref_table_id = string.Concat(row[3]);
 | 
			
		||||
                        bool is_foreign_key = string.Concat(row[4]) == "1";
 | 
			
		||||
                        string referenced_column = string.Concat(row[5]);
 | 
			
		||||
                        if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue;
 | 
			
		||||
                        var loc9 = loc3[table_id][column];
 | 
			
		||||
                        if (loc2.ContainsKey(ref_table_id) == false) continue;
 | 
			
		||||
                        var loc10 = loc2[ref_table_id];
 | 
			
		||||
                        var loc11 = loc3[ref_table_id][referenced_column];
 | 
			
		||||
 | 
			
		||||
                    Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                    DbForeignInfo loc13 = null;
 | 
			
		||||
                    if (!fkColumns.TryGetValue(table_id, out loc12))
 | 
			
		||||
                        fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                    if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                        loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 });
 | 
			
		||||
                    loc13.Columns.Add(loc9);
 | 
			
		||||
                    loc13.ReferencedColumns.Add(loc11);
 | 
			
		||||
                        Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                        DbForeignInfo loc13 = null;
 | 
			
		||||
                        if (!fkColumns.TryGetValue(table_id, out loc12))
 | 
			
		||||
                            fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                        if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                            loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 });
 | 
			
		||||
                        loc13.Columns.Add(loc9);
 | 
			
		||||
                        loc13.ReferencedColumns.Add(loc11);
 | 
			
		||||
                    }
 | 
			
		||||
                    foreach (var table_id in fkColumns.Keys)
 | 
			
		||||
                        foreach (var fk in fkColumns[table_id])
 | 
			
		||||
                            loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
                }
 | 
			
		||||
                foreach (var table_id in fkColumns.Keys)
 | 
			
		||||
                    foreach (var fk in fkColumns[table_id])
 | 
			
		||||
                        loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
 | 
			
		||||
                foreach (var table_id in loc3.Keys)
 | 
			
		||||
                {
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,6 @@ using System.Collections.Generic;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Text.RegularExpressions;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.SqlServer
 | 
			
		||||
{
 | 
			
		||||
@@ -128,21 +127,32 @@ select
 | 
			
		||||
1
 | 
			
		||||
from sys.tables a
 | 
			
		||||
inner join sys.schemas b on b.schema_id = a.schema_id
 | 
			
		||||
where lower(b.name) = {_commonUtils.FormatSql("{0}", tbname[1])} and lower(a.name) = {_commonUtils.FormatSql("{0}", tbname[2])}
 | 
			
		||||
where lower(b.name)={_commonUtils.FormatSql("{0}", tbname[1])} and lower(a.name)={_commonUtils.FormatSql("{0}", tbname[2])}
 | 
			
		||||
;
 | 
			
		||||
use [{olddatabase}];
 | 
			
		||||
";
 | 
			
		||||
            return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1";
 | 
			
		||||
        }
 | 
			
		||||
        public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault();
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database) => GetTables(database, null, false);
 | 
			
		||||
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database)
 | 
			
		||||
        public List<DbTableInfo> GetTables(string[] database, string tablename, bool ignoreCase)
 | 
			
		||||
        {
 | 
			
		||||
            var olddatabase = "";
 | 
			
		||||
            using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)))
 | 
			
		||||
            {
 | 
			
		||||
                olddatabase = conn.Value.Database;
 | 
			
		||||
            }
 | 
			
		||||
            var dbs = database == null || database.Any() == false ? new[] { olddatabase } : database;
 | 
			
		||||
            string[] tbname = null;
 | 
			
		||||
            string[] dbs = database == null || database.Any() == false ? new[] { olddatabase } : database;
 | 
			
		||||
            if (string.IsNullOrEmpty(tablename) == false)
 | 
			
		||||
            {
 | 
			
		||||
                tbname = _commonUtils.SplitTableName(tablename);
 | 
			
		||||
                if (tbname?.Length == 1) tbname = new[] { olddatabase, "dbo", tbname[0] };
 | 
			
		||||
                if (tbname?.Length == 2) tbname = new[] { olddatabase, tbname[0], tbname[1] };
 | 
			
		||||
                tbname = tbname.Select(a => a.ToLower()).ToArray();
 | 
			
		||||
                dbs = new[] { tbname[0] };
 | 
			
		||||
            }
 | 
			
		||||
            var tables = new List<DbTableInfo>();
 | 
			
		||||
 | 
			
		||||
            foreach (var db in dbs)
 | 
			
		||||
@@ -155,6 +165,7 @@ use [{olddatabase}];
 | 
			
		||||
 | 
			
		||||
                var sql = $@"
 | 
			
		||||
use [{db}];
 | 
			
		||||
select * from (
 | 
			
		||||
select 
 | 
			
		||||
 a.Object_id
 | 
			
		||||
,b.name 'Owner'
 | 
			
		||||
@@ -183,8 +194,8 @@ select
 | 
			
		||||
from sys.procedures a
 | 
			
		||||
inner join sys.schemas b on b.schema_id = a.schema_id
 | 
			
		||||
where a.type = 'P' and charindex('diagram', a.name) = 0
 | 
			
		||||
order by type desc, b.name, a.name
 | 
			
		||||
;
 | 
			
		||||
) ft_dbf{(tbname == null ? "" : _commonUtils.FormatSql(" where lower([owner])={0} and lower([Name])={1}", new[] { tbname[1], tbname[2] }))}
 | 
			
		||||
order by type desc, [owner], [Name];
 | 
			
		||||
use [{olddatabase}];
 | 
			
		||||
";
 | 
			
		||||
                var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
@@ -395,7 +406,9 @@ use [{olddatabase}];
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                sql = $@"
 | 
			
		||||
                if (tbname == null)
 | 
			
		||||
                {
 | 
			
		||||
                    sql = $@"
 | 
			
		||||
use [{db}];
 | 
			
		||||
select 
 | 
			
		||||
 b.object_id 'Object_id'
 | 
			
		||||
@@ -415,47 +428,48 @@ where {loc8.ToString().Replace("a.table_name", "b.object_id")}
 | 
			
		||||
;
 | 
			
		||||
use [{olddatabase}];
 | 
			
		||||
";
 | 
			
		||||
                ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
                if (ds == null) return loc1;
 | 
			
		||||
                    ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
                    if (ds == null) return loc1;
 | 
			
		||||
 | 
			
		||||
                var fkColumns = new Dictionary<int, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
                foreach (object[] row in ds)
 | 
			
		||||
                {
 | 
			
		||||
                    int object_id, referenced_object_id;
 | 
			
		||||
                    int.TryParse(string.Concat(row[0]), out object_id);
 | 
			
		||||
                    var column = string.Concat(row[1]);
 | 
			
		||||
                    string fk_id = string.Concat(row[2]);
 | 
			
		||||
                    int.TryParse(string.Concat(row[3]), out referenced_object_id);
 | 
			
		||||
                    var is_foreign_key = bool.Parse(string.Concat(row[4]));
 | 
			
		||||
                    var referenced_column = string.Concat(row[5]);
 | 
			
		||||
                    var referenced_db = string.Concat(row[6]);
 | 
			
		||||
                    var referenced_table = string.Concat(row[7]);
 | 
			
		||||
                    DbColumnInfo loc9 = loc3[object_id][column];
 | 
			
		||||
                    DbTableInfo loc10 = null;
 | 
			
		||||
                    DbColumnInfo loc11 = null;
 | 
			
		||||
                    bool isThisSln = referenced_object_id != 0;
 | 
			
		||||
 | 
			
		||||
                    if (isThisSln)
 | 
			
		||||
                    {
 | 
			
		||||
                        loc10 = loc2[referenced_object_id];
 | 
			
		||||
                        loc11 = loc3[referenced_object_id][referenced_column];
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    var fkColumns = new Dictionary<int, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
                    foreach (object[] row in ds)
 | 
			
		||||
                    {
 | 
			
		||||
                        int object_id, referenced_object_id;
 | 
			
		||||
                        int.TryParse(string.Concat(row[0]), out object_id);
 | 
			
		||||
                        var column = string.Concat(row[1]);
 | 
			
		||||
                        string fk_id = string.Concat(row[2]);
 | 
			
		||||
                        int.TryParse(string.Concat(row[3]), out referenced_object_id);
 | 
			
		||||
                        var is_foreign_key = bool.Parse(string.Concat(row[4]));
 | 
			
		||||
                        var referenced_column = string.Concat(row[5]);
 | 
			
		||||
                        var referenced_db = string.Concat(row[6]);
 | 
			
		||||
                        var referenced_table = string.Concat(row[7]);
 | 
			
		||||
                        DbColumnInfo loc9 = loc3[object_id][column];
 | 
			
		||||
                        DbTableInfo loc10 = null;
 | 
			
		||||
                        DbColumnInfo loc11 = null;
 | 
			
		||||
                        bool isThisSln = referenced_object_id != 0;
 | 
			
		||||
 | 
			
		||||
                        if (isThisSln)
 | 
			
		||||
                        {
 | 
			
		||||
                            loc10 = loc2[referenced_object_id];
 | 
			
		||||
                            loc11 = loc3[referenced_object_id][referenced_column];
 | 
			
		||||
                        }
 | 
			
		||||
                        else
 | 
			
		||||
                        {
 | 
			
		||||
 | 
			
		||||
                        }
 | 
			
		||||
                        Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                        DbForeignInfo loc13 = null;
 | 
			
		||||
                        if (!fkColumns.TryGetValue(object_id, out loc12))
 | 
			
		||||
                            fkColumns.Add(object_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                        if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                            loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[object_id], ReferencedTable = loc10 });
 | 
			
		||||
                        loc13.Columns.Add(loc9);
 | 
			
		||||
                        loc13.ReferencedColumns.Add(loc11);
 | 
			
		||||
                    }
 | 
			
		||||
                    Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                    DbForeignInfo loc13 = null;
 | 
			
		||||
                    if (!fkColumns.TryGetValue(object_id, out loc12))
 | 
			
		||||
                        fkColumns.Add(object_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                    if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                        loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[object_id], ReferencedTable = loc10 });
 | 
			
		||||
                    loc13.Columns.Add(loc9);
 | 
			
		||||
                    loc13.ReferencedColumns.Add(loc11);
 | 
			
		||||
                    foreach (var table_id in fkColumns.Keys)
 | 
			
		||||
                        foreach (var fk in fkColumns[table_id])
 | 
			
		||||
                            loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
                }
 | 
			
		||||
                foreach (var table_id in fkColumns.Keys)
 | 
			
		||||
                    foreach (var fk in fkColumns[table_id])
 | 
			
		||||
                        loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
 | 
			
		||||
                foreach (var table_id in loc3.Keys)
 | 
			
		||||
                {
 | 
			
		||||
 
 | 
			
		||||
@@ -155,18 +155,28 @@ namespace FreeSql.Sqlite
 | 
			
		||||
            var tbname = _commonUtils.SplitTableName(name);
 | 
			
		||||
            if (tbname?.Length == 1) tbname = new[] { "main", tbname[0] };
 | 
			
		||||
            if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray();
 | 
			
		||||
            var sql = $@" select 1 from {_commonUtils.QuoteSqlName(tbname[0])}.sqlite_master where type = 'table' and {(ignoreCase ? "lower(tbl_name)" : "tbl_name")} = {_commonUtils.FormatSql("{0}", tbname[1])}";
 | 
			
		||||
            var sql = $@" select 1 from {_commonUtils.QuoteSqlName(tbname[0])}.sqlite_master where type='table' and {(ignoreCase ? "lower(tbl_name)" : "tbl_name")}={_commonUtils.FormatSql("{0}", tbname[1])}";
 | 
			
		||||
            return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database2)
 | 
			
		||||
        public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault();
 | 
			
		||||
        public List<DbTableInfo> GetTablesByDatabase(params string[] database) => GetTables(database, null, false);
 | 
			
		||||
 | 
			
		||||
        public List<DbTableInfo> GetTables(string[] database, string tablename, bool ignoreCase)
 | 
			
		||||
        {
 | 
			
		||||
            var loc1 = new List<DbTableInfo>();
 | 
			
		||||
            var loc2 = new Dictionary<string, DbTableInfo>();
 | 
			
		||||
            var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
			
		||||
            var database = database2?.ToArray();
 | 
			
		||||
 | 
			
		||||
            if (database == null || database.Any() == false) database = GetDatabases().ToArray();
 | 
			
		||||
            string[] tbname = null;
 | 
			
		||||
            if (string.IsNullOrEmpty(tablename) == false)
 | 
			
		||||
            {
 | 
			
		||||
                tbname = _commonUtils.SplitTableName(tablename);
 | 
			
		||||
                if (tbname?.Length == 1) tbname = new[] { "main", tbname[0] };
 | 
			
		||||
                if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray();
 | 
			
		||||
                database = new[] { tbname[0] };
 | 
			
		||||
            }
 | 
			
		||||
            else if (database == null || database.Any() == false)
 | 
			
		||||
                database = GetDatabases().ToArray();
 | 
			
		||||
            if (database.Any() == false) return loc1;
 | 
			
		||||
 | 
			
		||||
            Action<object[], int> addColumn = (row, position) =>
 | 
			
		||||
@@ -212,7 +222,7 @@ tbl_name,
 | 
			
		||||
'' Comment,
 | 
			
		||||
'TABLE',
 | 
			
		||||
sql
 | 
			
		||||
from {db}.sqlite_master where type = 'table'";
 | 
			
		||||
from {db}.sqlite_master where type='table'{(tbname == null ? "" : $" and {(ignoreCase ? "lower(tbl_name)" : "tbl_name")}={_commonUtils.FormatSql("{0}", tbname[1])}")}";
 | 
			
		||||
                var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
			
		||||
                if (ds == null) continue;
 | 
			
		||||
 | 
			
		||||
@@ -284,34 +294,37 @@ from {db}.sqlite_master where type = 'table'";
 | 
			
		||||
                            addColumn(ds2item, ++position);
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        var fks = _orm.Ado.ExecuteArray(CommandType.Text, $"PRAGMA \"{db}\".foreign_key_list(\"{table}\")");
 | 
			
		||||
                        if (fks != null && fks.Length > 0)
 | 
			
		||||
                        if (tbname == null)
 | 
			
		||||
                        {
 | 
			
		||||
                            var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
                            foreach (var fk in fks)
 | 
			
		||||
                            var fks = _orm.Ado.ExecuteArray(CommandType.Text, $"PRAGMA \"{db}\".foreign_key_list(\"{table}\")");
 | 
			
		||||
                            if (fks != null && fks.Length > 0)
 | 
			
		||||
                            {
 | 
			
		||||
                                string column = string.Concat(fk[3]);
 | 
			
		||||
                                string fk_id = $"{db}.{table}.{fk[0]}";
 | 
			
		||||
                                string ref_table_id = database.Length == 1 ? string.Concat(fk[2]) : $"{db}.{fk[2]}";
 | 
			
		||||
                                string referenced_column = string.Concat(fk[4]);
 | 
			
		||||
                                if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue;
 | 
			
		||||
                                var loc9 = loc3[table_id][column];
 | 
			
		||||
                                if (loc2.ContainsKey(ref_table_id) == false) continue;
 | 
			
		||||
                                var loc10 = loc2[ref_table_id];
 | 
			
		||||
                                var loc11 = loc3[ref_table_id][referenced_column];
 | 
			
		||||
                                var fkColumns = new Dictionary<string, Dictionary<string, DbForeignInfo>>();
 | 
			
		||||
                                foreach (var fk in fks)
 | 
			
		||||
                                {
 | 
			
		||||
                                    string column = string.Concat(fk[3]);
 | 
			
		||||
                                    string fk_id = $"{db}.{table}.{fk[0]}";
 | 
			
		||||
                                    string ref_table_id = database.Length == 1 ? string.Concat(fk[2]) : $"{db}.{fk[2]}";
 | 
			
		||||
                                    string referenced_column = string.Concat(fk[4]);
 | 
			
		||||
                                    if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue;
 | 
			
		||||
                                    var loc9 = loc3[table_id][column];
 | 
			
		||||
                                    if (loc2.ContainsKey(ref_table_id) == false) continue;
 | 
			
		||||
                                    var loc10 = loc2[ref_table_id];
 | 
			
		||||
                                    var loc11 = loc3[ref_table_id][referenced_column];
 | 
			
		||||
 | 
			
		||||
                                Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                                DbForeignInfo loc13 = null;
 | 
			
		||||
                                if (!fkColumns.TryGetValue(table_id, out loc12))
 | 
			
		||||
                                    fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                                if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                                    loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 });
 | 
			
		||||
                                loc13.Columns.Add(loc9);
 | 
			
		||||
                                loc13.ReferencedColumns.Add(loc11);
 | 
			
		||||
                                    Dictionary<string, DbForeignInfo> loc12 = null;
 | 
			
		||||
                                    DbForeignInfo loc13 = null;
 | 
			
		||||
                                    if (!fkColumns.TryGetValue(table_id, out loc12))
 | 
			
		||||
                                        fkColumns.Add(table_id, loc12 = new Dictionary<string, DbForeignInfo>());
 | 
			
		||||
                                    if (!loc12.TryGetValue(fk_id, out loc13))
 | 
			
		||||
                                        loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 });
 | 
			
		||||
                                    loc13.Columns.Add(loc9);
 | 
			
		||||
                                    loc13.ReferencedColumns.Add(loc11);
 | 
			
		||||
                                }
 | 
			
		||||
                                foreach (var table_id2 in fkColumns.Keys)
 | 
			
		||||
                                    foreach (var fk in fkColumns[table_id2])
 | 
			
		||||
                                        loc2[table_id2].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
                            }
 | 
			
		||||
                            foreach (var table_id2 in fkColumns.Keys)
 | 
			
		||||
                                foreach (var fk in fkColumns[table_id2])
 | 
			
		||||
                                    loc2[table_id2].ForeignsDict.Add(fk.Key, fk.Value);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user