mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 17:20:49 +08:00 
			
		
		
		
	- 增加 IDbFirst.GetTableByName 方法获取单表信息,包括列详情、主键、唯一键、索引、备注;
This commit is contained in:
		@@ -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)
 | 
			
		||||
            {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user