mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 09:15:27 +08:00 
			
		
		
		
	- 增加 IDbFirst.GetTableByName 方法获取单表信息,包括列详情、主键、唯一键、索引、备注;
This commit is contained in:
		@@ -9,17 +9,29 @@ namespace FreeSql.Tests.MySqlConnector
 | 
				
			|||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetDatabases()
 | 
					        public void GetDatabases()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var t1 = g.mysql.DbFirst.GetDatabases();
 | 
					            var t1 = g.mysql.DbFirst.GetDatabases();
 | 
				
			||||||
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetTablesByDatabase()
 | 
					        public void GetTablesByDatabase()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var t2 = g.mysql.DbFirst.GetTablesByDatabase(g.mysql.DbFirst.GetDatabases()[0]);
 | 
					            var t2 = g.mysql.DbFirst.GetTablesByDatabase(g.mysql.DbFirst.GetDatabases()[0]);
 | 
				
			||||||
 | 
					            Assert.True(t2.Count > 0);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void GetTableByName()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var fsql = g.mysql;
 | 
				
			||||||
 | 
					            var t1 = fsql.DbFirst.GetTableByName("tb_alltype");
 | 
				
			||||||
 | 
					            var t2 = fsql.DbFirst.GetTableByName("cccddd_mysqlconnector.tb_alltype");
 | 
				
			||||||
 | 
					            Assert.NotNull(t1);
 | 
				
			||||||
 | 
					            Assert.NotNull(t2);
 | 
				
			||||||
 | 
					            Assert.True(t1.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.True(t2.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.Equal(t1.Columns.Count, t2.Columns.Count);
 | 
				
			||||||
 | 
					            var t3 = fsql.DbFirst.GetTableByName("notexists_tb");
 | 
				
			||||||
 | 
					            Assert.Null(t3);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,19 +9,32 @@ namespace FreeSql.Tests.Odbc.Dameng
 | 
				
			|||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetDatabases()
 | 
					        public void GetDatabases()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var t1 = g.dameng.DbFirst.GetDatabases();
 | 
					            var t1 = g.dameng.DbFirst.GetDatabases();
 | 
				
			||||||
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetTablesByDatabase()
 | 
					        public void GetTablesByDatabase()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var t2 = g.dameng.DbFirst.GetTablesByDatabase();
 | 
					            var t2 = g.dameng.DbFirst.GetTablesByDatabase();
 | 
				
			||||||
 | 
					            Assert.True(t2.Count > 0);
 | 
				
			||||||
            //var tb = g.dameng.Ado.ExecuteArray(System.Data.CommandType.Text, "select * from \"tb_dbfirst\"");
 | 
					            //var tb = g.dameng.Ado.ExecuteArray(System.Data.CommandType.Text, "select * from \"tb_dbfirst\"");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void GetTableByName()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var fsql = g.dameng;
 | 
				
			||||||
 | 
					            var t1 = fsql.DbFirst.GetTableByName("tb_alltype");
 | 
				
			||||||
 | 
					            var t2 = fsql.DbFirst.GetTableByName("2user.tb_alltype");
 | 
				
			||||||
 | 
					            Assert.NotNull(t1);
 | 
				
			||||||
 | 
					            Assert.NotNull(t2);
 | 
				
			||||||
 | 
					            Assert.True(t1.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.True(t2.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.Equal(t1.Columns.Count, t2.Columns.Count);
 | 
				
			||||||
 | 
					            var t3 = fsql.DbFirst.GetTableByName("notexists_tb");
 | 
				
			||||||
 | 
					            Assert.Null(t3);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void ExistsTable()
 | 
					        public void ExistsTable()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,7 +16,22 @@ namespace FreeSql.Tests.Odbc.KingbaseES
 | 
				
			|||||||
        public void GetTablesByDatabase()
 | 
					        public void GetTablesByDatabase()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            var t2 = g.kingbaseES.DbFirst.GetTablesByDatabase();
 | 
					            var t2 = g.kingbaseES.DbFirst.GetTablesByDatabase();
 | 
				
			||||||
            //var tb = g.kingbaseES.Ado.ExecuteArray(System.Data.CommandType.Text, "select * from \"tb_dbfirst\"");
 | 
					            Assert.True(t2.Count > 0);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void GetTableByName()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var fsql = g.kingbaseES;
 | 
				
			||||||
 | 
					            var t1 = fsql.DbFirst.GetTableByName("tb_alltype");
 | 
				
			||||||
 | 
					            var t2 = fsql.DbFirst.GetTableByName("public.tb_alltype");
 | 
				
			||||||
 | 
					            Assert.NotNull(t1);
 | 
				
			||||||
 | 
					            Assert.NotNull(t2);
 | 
				
			||||||
 | 
					            Assert.True(t1.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.True(t2.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.Equal(t1.Columns.Count, t2.Columns.Count);
 | 
				
			||||||
 | 
					            var t3 = fsql.DbFirst.GetTableByName("notexists_tb");
 | 
				
			||||||
 | 
					            Assert.Null(t3);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,17 +9,29 @@ namespace FreeSql.Tests.Odbc.MySql
 | 
				
			|||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetDatabases()
 | 
					        public void GetDatabases()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var t1 = g.mysql.DbFirst.GetDatabases();
 | 
					            var t1 = g.mysql.DbFirst.GetDatabases();
 | 
				
			||||||
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetTablesByDatabase()
 | 
					        public void GetTablesByDatabase()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var t2 = g.mysql.DbFirst.GetTablesByDatabase(g.mysql.DbFirst.GetDatabases()[0]);
 | 
					            var t2 = g.mysql.DbFirst.GetTablesByDatabase(g.mysql.DbFirst.GetDatabases()[0]);
 | 
				
			||||||
 | 
					            Assert.True(t2.Count > 0);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void GetTableByName()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var fsql = g.mysql;
 | 
				
			||||||
 | 
					            var t1 = fsql.DbFirst.GetTableByName("tb_alltype");
 | 
				
			||||||
 | 
					            var t2 = fsql.DbFirst.GetTableByName("cccddd_odbc.tb_alltype");
 | 
				
			||||||
 | 
					            Assert.NotNull(t1);
 | 
				
			||||||
 | 
					            Assert.NotNull(t2);
 | 
				
			||||||
 | 
					            Assert.True(t1.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.True(t2.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.Equal(t1.Columns.Count, t2.Columns.Count);
 | 
				
			||||||
 | 
					            var t3 = fsql.DbFirst.GetTableByName("notexists_tb");
 | 
				
			||||||
 | 
					            Assert.Null(t3);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,19 +9,32 @@ namespace FreeSql.Tests.Odbc.Oracle
 | 
				
			|||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetDatabases()
 | 
					        public void GetDatabases()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var t1 = g.oracle.DbFirst.GetDatabases();
 | 
					            var t1 = g.oracle.DbFirst.GetDatabases();
 | 
				
			||||||
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetTablesByDatabase()
 | 
					        public void GetTablesByDatabase()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var t2 = g.oracle.DbFirst.GetTablesByDatabase();
 | 
					            var t2 = g.oracle.DbFirst.GetTablesByDatabase();
 | 
				
			||||||
 | 
					            Assert.True(t2.Count > 0);
 | 
				
			||||||
            //var tb = g.oracle.Ado.ExecuteArray(System.Data.CommandType.Text, "select * from \"tb_dbfirst\"");
 | 
					            //var tb = g.oracle.Ado.ExecuteArray(System.Data.CommandType.Text, "select * from \"tb_dbfirst\"");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void GetTableByName()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var fsql = g.oracle;
 | 
				
			||||||
 | 
					            var t1 = fsql.DbFirst.GetTableByName("tb_alltype");
 | 
				
			||||||
 | 
					            var t2 = fsql.DbFirst.GetTableByName("1odbc.tb_alltype");
 | 
				
			||||||
 | 
					            Assert.NotNull(t1);
 | 
				
			||||||
 | 
					            Assert.NotNull(t2);
 | 
				
			||||||
 | 
					            Assert.True(t1.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.True(t2.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.Equal(t1.Columns.Count, t2.Columns.Count);
 | 
				
			||||||
 | 
					            var t3 = fsql.DbFirst.GetTableByName("notexists_tb");
 | 
				
			||||||
 | 
					            Assert.Null(t3);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void ExistsTable()
 | 
					        public void ExistsTable()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,20 +10,29 @@ namespace FreeSql.Tests.Odbc.PostgreSQL
 | 
				
			|||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetDatabases()
 | 
					        public void GetDatabases()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var t1 = g.pgsql.DbFirst.GetDatabases();
 | 
					            var t1 = g.pgsql.DbFirst.GetDatabases();
 | 
				
			||||||
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetTablesByDatabase()
 | 
					        public void GetTablesByDatabase()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					            var t2 = g.pgsql.DbFirst.GetTablesByDatabase();
 | 
				
			||||||
 | 
					            Assert.True(t2.Count > 0);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var t2 = g.pgsql.DbFirst.GetTablesByDatabase(g.pgsql.DbFirst.GetDatabases()[2]);
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void GetTableByName()
 | 
				
			||||||
            var tb_alltype = t2.Where(a => a.Name == "tb_alltype").FirstOrDefault();
 | 
					        {
 | 
				
			||||||
 | 
					            var fsql = g.pgsql;
 | 
				
			||||||
            var tb_identity = t2.Where(a => a.Name == "test_new").FirstOrDefault();
 | 
					            var t1 = fsql.DbFirst.GetTableByName("tb_alltype");
 | 
				
			||||||
 | 
					            var t2 = fsql.DbFirst.GetTableByName("public.tb_alltype");
 | 
				
			||||||
 | 
					            Assert.NotNull(t1);
 | 
				
			||||||
 | 
					            Assert.NotNull(t2);
 | 
				
			||||||
 | 
					            Assert.True(t1.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.True(t2.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.Equal(t1.Columns.Count, t2.Columns.Count);
 | 
				
			||||||
 | 
					            var t3 = fsql.DbFirst.GetTableByName("notexists_tb");
 | 
				
			||||||
 | 
					            Assert.Null(t3);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,17 +10,29 @@ namespace FreeSql.Tests.Odbc.SqlServer
 | 
				
			|||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetDatabases()
 | 
					        public void GetDatabases()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var t1 = g.sqlserver.DbFirst.GetDatabases();
 | 
					            var t1 = g.sqlserver.DbFirst.GetDatabases();
 | 
				
			||||||
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetTablesByDatabase()
 | 
					        public void GetTablesByDatabase()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var t2 = g.sqlserver.DbFirst.GetTablesByDatabase();
 | 
					            var t2 = g.sqlserver.DbFirst.GetTablesByDatabase();
 | 
				
			||||||
 | 
					            Assert.True(t2.Count > 0);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void GetTableByName()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var fsql = g.sqlserver;
 | 
				
			||||||
 | 
					            var t1 = fsql.DbFirst.GetTableByName("tb_alltype");
 | 
				
			||||||
 | 
					            var t2 = fsql.DbFirst.GetTableByName("dbo.tb_alltype");
 | 
				
			||||||
 | 
					            Assert.NotNull(t1);
 | 
				
			||||||
 | 
					            Assert.NotNull(t2);
 | 
				
			||||||
 | 
					            Assert.True(t1.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.True(t2.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.Equal(t1.Columns.Count, t2.Columns.Count);
 | 
				
			||||||
 | 
					            var t3 = fsql.DbFirst.GetTableByName("notexists_tb");
 | 
				
			||||||
 | 
					            Assert.Null(t3);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,19 +9,32 @@ namespace FreeSql.Tests.Dameng
 | 
				
			|||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetDatabases()
 | 
					        public void GetDatabases()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var t1 = g.dameng.DbFirst.GetDatabases();
 | 
					            var t1 = g.dameng.DbFirst.GetDatabases();
 | 
				
			||||||
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetTablesByDatabase()
 | 
					        public void GetTablesByDatabase()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var t2 = g.dameng.DbFirst.GetTablesByDatabase();
 | 
					            var t2 = g.dameng.DbFirst.GetTablesByDatabase();
 | 
				
			||||||
 | 
					            Assert.True(t2.Count > 0);
 | 
				
			||||||
            //var tb = g.dameng.Ado.ExecuteArray(System.Data.CommandType.Text, "select * from \"tb_dbfirst\"");
 | 
					            //var tb = g.dameng.Ado.ExecuteArray(System.Data.CommandType.Text, "select * from \"tb_dbfirst\"");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void GetTableByName()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var fsql = g.dameng;
 | 
				
			||||||
 | 
					            var t1 = fsql.DbFirst.GetTableByName("tb_alltype");
 | 
				
			||||||
 | 
					            var t2 = fsql.DbFirst.GetTableByName("2user.tb_alltype");
 | 
				
			||||||
 | 
					            Assert.NotNull(t1);
 | 
				
			||||||
 | 
					            Assert.NotNull(t2);
 | 
				
			||||||
 | 
					            Assert.True(t1.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.True(t2.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.Equal(t1.Columns.Count, t2.Columns.Count);
 | 
				
			||||||
 | 
					            var t3 = fsql.DbFirst.GetTableByName("notexists_tb");
 | 
				
			||||||
 | 
					            Assert.Null(t3);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void ExistsTable()
 | 
					        public void ExistsTable()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,17 +9,29 @@ namespace FreeSql.Tests.MySql
 | 
				
			|||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetDatabases()
 | 
					        public void GetDatabases()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var t1 = g.mysql.DbFirst.GetDatabases();
 | 
					            var t1 = g.mysql.DbFirst.GetDatabases();
 | 
				
			||||||
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetTablesByDatabase()
 | 
					        public void GetTablesByDatabase()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var t2 = g.mysql.DbFirst.GetTablesByDatabase(g.mysql.DbFirst.GetDatabases()[0]);
 | 
					            var t2 = g.mysql.DbFirst.GetTablesByDatabase(g.mysql.DbFirst.GetDatabases()[0]);
 | 
				
			||||||
 | 
					            Assert.True(t2.Count > 0);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void GetTableByName()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var fsql = g.mysql;
 | 
				
			||||||
 | 
					            var t1 = fsql.DbFirst.GetTableByName("tb_alltype");
 | 
				
			||||||
 | 
					            var t2 = fsql.DbFirst.GetTableByName("cccddd.tb_alltype");
 | 
				
			||||||
 | 
					            Assert.NotNull(t1);
 | 
				
			||||||
 | 
					            Assert.NotNull(t2);
 | 
				
			||||||
 | 
					            Assert.True(t1.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.True(t2.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.Equal(t1.Columns.Count, t2.Columns.Count);
 | 
				
			||||||
 | 
					            var t3 = fsql.DbFirst.GetTableByName("notexists_tb");
 | 
				
			||||||
 | 
					            Assert.Null(t3);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,19 +9,32 @@ namespace FreeSql.Tests.Oracle
 | 
				
			|||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetDatabases()
 | 
					        public void GetDatabases()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var t1 = g.oracle.DbFirst.GetDatabases();
 | 
					            var t1 = g.oracle.DbFirst.GetDatabases();
 | 
				
			||||||
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetTablesByDatabase()
 | 
					        public void GetTablesByDatabase()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var t2 = g.oracle.DbFirst.GetTablesByDatabase();
 | 
					            var t2 = g.oracle.DbFirst.GetTablesByDatabase();
 | 
				
			||||||
 | 
					            Assert.True(t2.Count > 0);
 | 
				
			||||||
            //var tb = g.oracle.Ado.ExecuteArray(System.Data.CommandType.Text, "select * from \"tb_dbfirst\"");
 | 
					            //var tb = g.oracle.Ado.ExecuteArray(System.Data.CommandType.Text, "select * from \"tb_dbfirst\"");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void GetTableByName()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var fsql = g.oracle;
 | 
				
			||||||
 | 
					            var t1 = fsql.DbFirst.GetTableByName("tb_alltype");
 | 
				
			||||||
 | 
					            var t2 = fsql.DbFirst.GetTableByName("1user.tb_alltype");
 | 
				
			||||||
 | 
					            Assert.NotNull(t1);
 | 
				
			||||||
 | 
					            Assert.NotNull(t2);
 | 
				
			||||||
 | 
					            Assert.True(t1.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.True(t2.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.Equal(t1.Columns.Count, t2.Columns.Count);
 | 
				
			||||||
 | 
					            var t3 = fsql.DbFirst.GetTableByName("notexists_tb");
 | 
				
			||||||
 | 
					            Assert.Null(t3);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void ExistsTable()
 | 
					        public void ExistsTable()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,21 +10,29 @@ namespace FreeSql.Tests.PostgreSQL
 | 
				
			|||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetDatabases()
 | 
					        public void GetDatabases()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var t1 = g.pgsql.DbFirst.GetDatabases();
 | 
					            var t1 = g.pgsql.DbFirst.GetDatabases();
 | 
				
			||||||
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetTablesByDatabase()
 | 
					        public void GetTablesByDatabase()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var t2 = g.pgsql.DbFirst.GetTablesByDatabase(g.pgsql.DbFirst.GetDatabases()[1]);
 | 
					            var t2 = g.pgsql.DbFirst.GetTablesByDatabase(g.pgsql.DbFirst.GetDatabases()[1]);
 | 
				
			||||||
 | 
					            Assert.True(t2.Count > 0);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var tb_alltype = t2.Where(a => a.Name == "tb_alltype").FirstOrDefault();
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void GetTableByName()
 | 
				
			||||||
            var tb_identity = t2.Where(a => a.Name == "test_new").FirstOrDefault();
 | 
					        {
 | 
				
			||||||
 | 
					            var fsql = g.pgsql;
 | 
				
			||||||
 | 
					            var t1 = fsql.DbFirst.GetTableByName("tb_alltype");
 | 
				
			||||||
 | 
					            var t2 = fsql.DbFirst.GetTableByName("public.tb_alltype");
 | 
				
			||||||
 | 
					            Assert.NotNull(t1);
 | 
				
			||||||
 | 
					            Assert.NotNull(t2);
 | 
				
			||||||
 | 
					            Assert.True(t1.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.True(t2.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.Equal(t1.Columns.Count, t2.Columns.Count);
 | 
				
			||||||
 | 
					            var t3 = fsql.DbFirst.GetTableByName("notexists_tb");
 | 
				
			||||||
 | 
					            Assert.Null(t3);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,9 +9,7 @@ namespace FreeSql.Tests.ShenTong
 | 
				
			|||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetDatabases()
 | 
					        public void GetDatabases()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var t1 = g.shentong.DbFirst.GetDatabases();
 | 
					            var t1 = g.shentong.DbFirst.GetDatabases();
 | 
				
			||||||
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
@@ -19,7 +17,23 @@ namespace FreeSql.Tests.ShenTong
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            var t1 = g.shentong.DbFirst.GetTablesByDatabase();
 | 
					            var t1 = g.shentong.DbFirst.GetTablesByDatabase();
 | 
				
			||||||
            var t2 = g.shentong.DbFirst.GetTablesByDatabase(g.shentong.DbFirst.GetDatabases()[0]);
 | 
					            var t2 = g.shentong.DbFirst.GetTablesByDatabase(g.shentong.DbFirst.GetDatabases()[0]);
 | 
				
			||||||
 | 
					            Assert.True(t1.Count > 0);
 | 
				
			||||||
 | 
					            Assert.True(t2.Count > 0);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void GetTableByName()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var fsql = g.shentong;
 | 
				
			||||||
 | 
					            var t1 = fsql.DbFirst.GetTableByName("tb_alltype");
 | 
				
			||||||
 | 
					            var t2 = fsql.DbFirst.GetTableByName("public.tb_alltype");
 | 
				
			||||||
 | 
					            Assert.NotNull(t1);
 | 
				
			||||||
 | 
					            Assert.NotNull(t2);
 | 
				
			||||||
 | 
					            Assert.True(t1.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.True(t2.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.Equal(t1.Columns.Count, t2.Columns.Count);
 | 
				
			||||||
 | 
					            var t3 = fsql.DbFirst.GetTableByName("notexists_tb");
 | 
				
			||||||
 | 
					            Assert.Null(t3);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,17 +19,29 @@ namespace FreeSql.Tests.SqlServer
 | 
				
			|||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetDatabases()
 | 
					        public void GetDatabases()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var t1 = g.sqlserver.DbFirst.GetDatabases();
 | 
					            var t1 = g.sqlserver.DbFirst.GetDatabases();
 | 
				
			||||||
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetTablesByDatabase()
 | 
					        public void GetTablesByDatabase()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var t2 = g.sqlserver.DbFirst.GetTablesByDatabase();
 | 
					            var t2 = g.sqlserver.DbFirst.GetTablesByDatabase();
 | 
				
			||||||
 | 
					            Assert.True(t2.Count > 0);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void GetTableByName()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var fsql = g.sqlserver;
 | 
				
			||||||
 | 
					            var t1 = fsql.DbFirst.GetTableByName("tb_alltype");
 | 
				
			||||||
 | 
					            var t2 = fsql.DbFirst.GetTableByName("dbo.tb_alltype");
 | 
				
			||||||
 | 
					            Assert.NotNull(t1);
 | 
				
			||||||
 | 
					            Assert.NotNull(t2);
 | 
				
			||||||
 | 
					            Assert.True(t1.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.True(t2.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.Equal(t1.Columns.Count, t2.Columns.Count);
 | 
				
			||||||
 | 
					            var t3 = fsql.DbFirst.GetTableByName("notexists_tb");
 | 
				
			||||||
 | 
					            Assert.Null(t3);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,17 +9,29 @@ namespace FreeSql.Tests.Sqlite
 | 
				
			|||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetDatabases()
 | 
					        public void GetDatabases()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var t1 = g.sqlite.DbFirst.GetDatabases();
 | 
					            var t1 = g.sqlite.DbFirst.GetDatabases();
 | 
				
			||||||
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void GetTablesByDatabase()
 | 
					        public void GetTablesByDatabase()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					 | 
				
			||||||
            var t2 = g.sqlite.DbFirst.GetTablesByDatabase();
 | 
					            var t2 = g.sqlite.DbFirst.GetTablesByDatabase();
 | 
				
			||||||
 | 
					            Assert.True(t2.Count > 0);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void GetTableByName()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var fsql = g.sqlite;
 | 
				
			||||||
 | 
					            var t1 = fsql.DbFirst.GetTableByName("tb_alltype");
 | 
				
			||||||
 | 
					            var t2 = fsql.DbFirst.GetTableByName("main.tb_alltype");
 | 
				
			||||||
 | 
					            Assert.NotNull(t1);
 | 
				
			||||||
 | 
					            Assert.NotNull(t2);
 | 
				
			||||||
 | 
					            Assert.True(t1.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.True(t2.Columns.Count > 0);
 | 
				
			||||||
 | 
					            Assert.Equal(t1.Columns.Count, t2.Columns.Count);
 | 
				
			||||||
 | 
					            var t3 = fsql.DbFirst.GetTableByName("notexists_tb");
 | 
				
			||||||
 | 
					            Assert.Null(t3);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3121,6 +3121,22 @@
 | 
				
			|||||||
            <param name="database"></param>
 | 
					            <param name="database"></param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.IDbFirst.GetTableByName(System.String,System.Boolean)">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            获取指定单表信息,包括列详情、主键、唯一键、索引、备注
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="name">表名,如:dbo.table1</param>
 | 
				
			||||||
 | 
					            <param name="ignoreCase">是否忽略大小写</param>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.IDbFirst.ExistsTable(System.String,System.Boolean)">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            判断表是否存在
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="name">表名,如:dbo.table1</param>
 | 
				
			||||||
 | 
					            <param name="ignoreCase">是否忽略大小写</param>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.IDbFirst.GetDbType(FreeSql.DatabaseModel.DbColumnInfo)">
 | 
					        <member name="M:FreeSql.IDbFirst.GetDbType(FreeSql.DatabaseModel.DbColumnInfo)">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            获取数据库枚举类型int值
 | 
					            获取数据库枚举类型int值
 | 
				
			||||||
@@ -3184,14 +3200,6 @@
 | 
				
			|||||||
            <param name="database"></param>
 | 
					            <param name="database"></param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.IDbFirst.ExistsTable(System.String,System.Boolean)">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            判断表是否存在
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
            <param name="name">表名,如:dbo.table1</param>
 | 
					 | 
				
			||||||
            <param name="ignoreCase">是否忽略大小写</param>
 | 
					 | 
				
			||||||
            <returns></returns>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="M:FreeSql.Internal.CommonProvider.InsertOrUpdateProvider`1.SplitSourceByIdentityValueIsNull(System.Collections.Generic.List{`0})">
 | 
					        <member name="M:FreeSql.Internal.CommonProvider.InsertOrUpdateProvider`1.SplitSourceByIdentityValueIsNull(System.Collections.Generic.List{`0})">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            如果实体类有自增属性,分成两个 List,有值的Item1 merge,无值的Item2 insert
 | 
					            如果实体类有自增属性,分成两个 List,有值的Item1 merge,无值的Item2 insert
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,6 +19,22 @@ namespace FreeSql
 | 
				
			|||||||
        /// <returns></returns>
 | 
					        /// <returns></returns>
 | 
				
			||||||
        List<DbTableInfo> GetTablesByDatabase(params string[] database);
 | 
					        List<DbTableInfo> GetTablesByDatabase(params string[] database);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 获取指定单表信息,包括列详情、主键、唯一键、索引、备注
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="name">表名,如:dbo.table1</param>
 | 
				
			||||||
 | 
					        /// <param name="ignoreCase">是否忽略大小写</param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        DbTableInfo GetTableByName(string name, bool ignoreCase = true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 判断表是否存在
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="name">表名,如:dbo.table1</param>
 | 
				
			||||||
 | 
					        /// <param name="ignoreCase">是否忽略大小写</param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        bool ExistsTable(string name, bool ignoreCase = true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// 获取数据库枚举类型int值
 | 
					        /// 获取数据库枚举类型int值
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
@@ -75,15 +91,5 @@ namespace FreeSql
 | 
				
			|||||||
        /// <param name="database"></param>
 | 
					        /// <param name="database"></param>
 | 
				
			||||||
        /// <returns></returns>
 | 
					        /// <returns></returns>
 | 
				
			||||||
        List<DbEnumInfo> GetEnumsByDatabase(params string[] database);
 | 
					        List<DbEnumInfo> GetEnumsByDatabase(params string[] database);
 | 
				
			||||||
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					 | 
				
			||||||
        /// 判断表是否存在
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        /// <param name="name">表名,如:dbo.table1</param>
 | 
					 | 
				
			||||||
        /// <param name="ignoreCase">是否忽略大小写</param>
 | 
					 | 
				
			||||||
        /// <returns></returns>
 | 
					 | 
				
			||||||
        bool ExistsTable(string name, bool ignoreCase = true);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        //DbTableInfo GetTableByName(string name);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -231,21 +231,36 @@ namespace FreeSql.Dameng
 | 
				
			|||||||
            return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "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 loc1 = new List<DbTableInfo>();
 | 
				
			||||||
            var loc2 = new Dictionary<string, DbTableInfo>();
 | 
					            var loc2 = new Dictionary<string, DbTableInfo>();
 | 
				
			||||||
            var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
					            var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
				
			||||||
            var database = database2?.ToArray();
 | 
					            string[] tbname = null;
 | 
				
			||||||
 | 
					            if (string.IsNullOrEmpty(tablename) == false)
 | 
				
			||||||
            if (database == null || database.Any() == 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();
 | 
					                var userUsers = _orm.Ado.ExecuteScalar(" select username from user_users")?.ToString();
 | 
				
			||||||
                if (string.IsNullOrEmpty(userUsers)) return loc1;
 | 
					                if (string.IsNullOrEmpty(userUsers)) return loc1;
 | 
				
			||||||
                database = new[] { userUsers };
 | 
					                database = new[] { userUsers };
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a)));
 | 
					            var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a)));
 | 
				
			||||||
            var sql = string.Format(@"
 | 
					            var sql = $@"
 | 
				
			||||||
select
 | 
					select
 | 
				
			||||||
a.owner || '.' || a.table_name,
 | 
					a.owner || '.' || a.table_name,
 | 
				
			||||||
a.owner,
 | 
					a.owner,
 | 
				
			||||||
@@ -254,7 +269,7 @@ b.comments,
 | 
				
			|||||||
'TABLE'
 | 
					'TABLE'
 | 
				
			||||||
from all_tables a
 | 
					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'
 | 
					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);
 | 
					            var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
            if (ds == null) return loc1;
 | 
					            if (ds == null) return loc1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -315,7 +330,7 @@ where a.owner in ({0})", databaseIn);
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            loc8.Append(")");
 | 
					            loc8.Append(")");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            sql = string.Format(@"
 | 
					            sql = $@"
 | 
				
			||||||
select
 | 
					select
 | 
				
			||||||
a.owner || '.' || a.table_name,
 | 
					a.owner || '.' || a.table_name,
 | 
				
			||||||
a.column_name,
 | 
					a.column_name,
 | 
				
			||||||
@@ -330,8 +345,8 @@ b.comments,
 | 
				
			|||||||
a.data_default
 | 
					a.data_default
 | 
				
			||||||
from all_tab_cols a
 | 
					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
 | 
					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}
 | 
					where {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}) and {loc8}
 | 
				
			||||||
", loc8, databaseIn);
 | 
					";
 | 
				
			||||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
					            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
            if (ds == null) return loc1;
 | 
					            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]);
 | 
					                loc3[table_id][column].CsType = this.GetCsTypeInfo(loc3[table_id][column]);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            sql = string.Format(@"
 | 
					            sql = $@"
 | 
				
			||||||
select
 | 
					select
 | 
				
			||||||
a.table_owner || '.' || a.table_name,
 | 
					a.table_owner || '.' || a.table_name,
 | 
				
			||||||
c.column_name,
 | 
					c.column_name,
 | 
				
			||||||
@@ -401,8 +416,8 @@ all_ind_columns c
 | 
				
			|||||||
where a.index_name = c.index_name
 | 
					where a.index_name = c.index_name
 | 
				
			||||||
and a.table_owner = c.table_owner
 | 
					and a.table_owner = c.table_owner
 | 
				
			||||||
and a.table_name = c.table_name
 | 
					and a.table_name = c.table_name
 | 
				
			||||||
and a.table_owner in ({1}) and {0}
 | 
					and {(ignoreCase ? "lower(a.table_owner)" : "a.table_owner")} in ({databaseIn}) and {loc8}
 | 
				
			||||||
", loc8, databaseIn);
 | 
					";
 | 
				
			||||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
					            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
            if (ds == null) return loc1;
 | 
					            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
 | 
					select
 | 
				
			||||||
a.owner || '.' || a.table_name,
 | 
					a.owner || '.' || a.table_name,
 | 
				
			||||||
c.column_name,
 | 
					c.column_name,
 | 
				
			||||||
@@ -488,8 +505,8 @@ and a.owner = c.owner
 | 
				
			|||||||
and a.table_name = c.table_name
 | 
					and a.table_name = c.table_name
 | 
				
			||||||
and b.owner = d.owner
 | 
					and b.owner = d.owner
 | 
				
			||||||
and b.table_name = d.table_name
 | 
					and b.table_name = d.table_name
 | 
				
			||||||
and a.owner in ({1}) and {0}
 | 
					and {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}) and {loc8}
 | 
				
			||||||
", loc8, databaseIn);
 | 
					";
 | 
				
			||||||
                ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
					                ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
                if (ds == null) return loc1;
 | 
					                if (ds == null) return loc1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -525,6 +542,7 @@ and a.owner in ({1}) and {0}
 | 
				
			|||||||
                foreach (var table_id in fkColumns.Keys)
 | 
					                foreach (var table_id in fkColumns.Keys)
 | 
				
			||||||
                    foreach (var fk in fkColumns[table_id])
 | 
					                    foreach (var fk in fkColumns[table_id])
 | 
				
			||||||
                        loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
					                        loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            foreach (var table_id in loc3.Keys)
 | 
					            foreach (var table_id in loc3.Keys)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -166,14 +166,30 @@ namespace FreeSql.MySql
 | 
				
			|||||||
            return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "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 loc1 = new List<DbTableInfo>();
 | 
				
			||||||
            var loc2 = new Dictionary<string, DbTableInfo>();
 | 
					            var loc2 = new Dictionary<string, DbTableInfo>();
 | 
				
			||||||
            var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
					            var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
				
			||||||
            var database = database2?.ToArray();
 | 
					            string[] tbname = null;
 | 
				
			||||||
 | 
					            if (string.IsNullOrEmpty(tablename) == false)
 | 
				
			||||||
            if (database == null || database.Any() == 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())
 | 
					                using (var conn = _orm.Ado.MasterPool.Get())
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
@@ -181,8 +197,9 @@ namespace FreeSql.MySql
 | 
				
			|||||||
                    database = new[] { conn.Value.Database };
 | 
					                    database = new[] { conn.Value.Database };
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a)));
 | 
					            var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a)));
 | 
				
			||||||
            var sql = string.Format(@"
 | 
					            var sql = $@"
 | 
				
			||||||
select 
 | 
					select 
 | 
				
			||||||
concat(a.table_schema, '.', a.table_name) 'id',
 | 
					concat(a.table_schema, '.', a.table_name) 'id',
 | 
				
			||||||
a.table_schema 'schema',
 | 
					a.table_schema 'schema',
 | 
				
			||||||
@@ -190,7 +207,7 @@ a.table_name 'table',
 | 
				
			|||||||
a.table_comment,
 | 
					a.table_comment,
 | 
				
			||||||
a.table_type 'type'
 | 
					a.table_type 'type'
 | 
				
			||||||
from information_schema.tables a
 | 
					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);
 | 
					            var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
            if (ds == null) return loc1;
 | 
					            if (ds == null) return loc1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -251,7 +268,7 @@ where a.table_schema in ({0})", databaseIn);
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            loc8.Append(")");
 | 
					            loc8.Append(")");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            sql = string.Format(@"
 | 
					            sql = $@"
 | 
				
			||||||
select
 | 
					select
 | 
				
			||||||
concat(a.table_schema, '.', a.table_name),
 | 
					concat(a.table_schema, '.', a.table_name),
 | 
				
			||||||
a.column_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_comment 'comment',
 | 
				
			||||||
a.column_default 'default_value'
 | 
					a.column_default 'default_value'
 | 
				
			||||||
from information_schema.columns a
 | 
					from information_schema.columns a
 | 
				
			||||||
where a.table_schema in ({1}) and {0}
 | 
					where {(ignoreCase ? "lower(a.table_schema)" : "a.table_schema")} in ({databaseIn}) and {loc8}
 | 
				
			||||||
", loc8, databaseIn);
 | 
					";
 | 
				
			||||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
					            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
            if (ds == null) return loc1;
 | 
					            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]);
 | 
					                loc3[table_id][column].CsType = this.GetCsTypeInfo(loc3[table_id][column]);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            sql = string.Format(@"
 | 
					            sql = $@"
 | 
				
			||||||
select 
 | 
					select 
 | 
				
			||||||
concat(a.table_schema, '.', a.table_name) 'table_id',
 | 
					concat(a.table_schema, '.', a.table_name) 'table_id',
 | 
				
			||||||
a.column_name,
 | 
					a.column_name,
 | 
				
			||||||
@@ -315,8 +332,8 @@ case when a.index_name = 'PRIMARY' then 1 else 0 end 'IsPrimaryKey',
 | 
				
			|||||||
0 'IsClustered',
 | 
					0 'IsClustered',
 | 
				
			||||||
0 'IsDesc'
 | 
					0 'IsDesc'
 | 
				
			||||||
from information_schema.statistics a
 | 
					from information_schema.statistics a
 | 
				
			||||||
where a.table_schema in ({1}) and {0}
 | 
					where {(ignoreCase ? "lower(a.table_schema)" : "a.table_schema")} in ({databaseIn}) and {loc8}
 | 
				
			||||||
", loc8, databaseIn);
 | 
					";
 | 
				
			||||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
					            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
            if (ds == null) return loc1;
 | 
					            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 
 | 
					select 
 | 
				
			||||||
concat(a.constraint_schema, '.', a.table_name) 'table_id',
 | 
					concat(a.constraint_schema, '.', a.table_name) 'table_id',
 | 
				
			||||||
a.column_name,
 | 
					a.column_name,
 | 
				
			||||||
@@ -376,8 +395,8 @@ concat(a.referenced_table_schema, '.', a.referenced_table_name) 'ref_table_id',
 | 
				
			|||||||
1 'IsForeignKey',
 | 
					1 'IsForeignKey',
 | 
				
			||||||
a.referenced_column_name 'ref_column'
 | 
					a.referenced_column_name 'ref_column'
 | 
				
			||||||
from information_schema.key_column_usage a
 | 
					from information_schema.key_column_usage a
 | 
				
			||||||
where a.constraint_schema in ({1}) and {0} and not isnull(position_in_unique_constraint)
 | 
					where {(ignoreCase ? "lower(a.constraint_schema)" : "a.constraint_schema")} in ({databaseIn}) and {loc8} and not isnull(position_in_unique_constraint)
 | 
				
			||||||
", loc8, databaseIn);
 | 
					";
 | 
				
			||||||
                ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
					                ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
                if (ds == null) return loc1;
 | 
					                if (ds == null) return loc1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -413,6 +432,7 @@ where a.constraint_schema in ({1}) and {0} and not isnull(position_in_unique_con
 | 
				
			|||||||
                foreach (var table_id in fkColumns.Keys)
 | 
					                foreach (var table_id in fkColumns.Keys)
 | 
				
			||||||
                    foreach (var fk in fkColumns[table_id])
 | 
					                    foreach (var fk in fkColumns[table_id])
 | 
				
			||||||
                        loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
					                        loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            foreach (var table_id in loc3.Keys)
 | 
					            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";
 | 
					            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 loc1 = new List<DbTableInfo>();
 | 
				
			||||||
            var loc2 = new Dictionary<string, DbTableInfo>();
 | 
					            var loc2 = new Dictionary<string, DbTableInfo>();
 | 
				
			||||||
            var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
					            var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
				
			||||||
            var database = database2?.ToArray();
 | 
					            string[] tbname = null;
 | 
				
			||||||
 | 
					            if (string.IsNullOrEmpty(tablename) == false)
 | 
				
			||||||
            if (database == null || database.Any() == 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();
 | 
					                var userUsers = _orm.Ado.ExecuteScalar(" select username from user_users")?.ToString();
 | 
				
			||||||
                if (string.IsNullOrEmpty(userUsers)) return loc1;
 | 
					                if (string.IsNullOrEmpty(userUsers)) return loc1;
 | 
				
			||||||
                database = new[] { userUsers };
 | 
					                database = new[] { userUsers };
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a)));
 | 
					            var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a)));
 | 
				
			||||||
            var sql = string.Format(@"
 | 
					            var sql = $@"
 | 
				
			||||||
select
 | 
					select
 | 
				
			||||||
a.owner || '.' || a.table_name,
 | 
					a.owner || '.' || a.table_name,
 | 
				
			||||||
a.owner,
 | 
					a.owner,
 | 
				
			||||||
@@ -254,7 +269,7 @@ b.comments,
 | 
				
			|||||||
'TABLE'
 | 
					'TABLE'
 | 
				
			||||||
from all_tables a
 | 
					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'
 | 
					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);
 | 
					            var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
            if (ds == null) return loc1;
 | 
					            if (ds == null) return loc1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -315,7 +330,7 @@ where a.owner in ({0})", databaseIn);
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            loc8.Append(")");
 | 
					            loc8.Append(")");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            sql = string.Format(@"
 | 
					            sql = $@"
 | 
				
			||||||
select
 | 
					select
 | 
				
			||||||
a.owner || '.' || a.table_name,
 | 
					a.owner || '.' || a.table_name,
 | 
				
			||||||
a.column_name,
 | 
					a.column_name,
 | 
				
			||||||
@@ -330,8 +345,8 @@ b.comments,
 | 
				
			|||||||
a.data_default
 | 
					a.data_default
 | 
				
			||||||
from all_tab_cols a
 | 
					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
 | 
					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}
 | 
					where {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}) and {loc8}
 | 
				
			||||||
", loc8, databaseIn);
 | 
					";
 | 
				
			||||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
					            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
            if (ds == null) return loc1;
 | 
					            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]);
 | 
					                loc3[table_id][column].CsType = this.GetCsTypeInfo(loc3[table_id][column]);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            sql = string.Format(@"
 | 
					            sql = $@"
 | 
				
			||||||
select
 | 
					select
 | 
				
			||||||
a.table_owner || '.' || a.table_name,
 | 
					a.table_owner || '.' || a.table_name,
 | 
				
			||||||
c.column_name,
 | 
					c.column_name,
 | 
				
			||||||
@@ -401,8 +416,8 @@ all_ind_columns c
 | 
				
			|||||||
where a.index_name = c.index_name
 | 
					where a.index_name = c.index_name
 | 
				
			||||||
and a.table_owner = c.table_owner
 | 
					and a.table_owner = c.table_owner
 | 
				
			||||||
and a.table_name = c.table_name
 | 
					and a.table_name = c.table_name
 | 
				
			||||||
and a.table_owner in ({1}) and {0}
 | 
					and {(ignoreCase ? "lower(a.table_owner)" : "a.table_owner")} in ({databaseIn}) and {loc8}
 | 
				
			||||||
", loc8, databaseIn);
 | 
					";
 | 
				
			||||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
					            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
            if (ds == null) return loc1;
 | 
					            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
 | 
					select
 | 
				
			||||||
a.owner || '.' || a.table_name,
 | 
					a.owner || '.' || a.table_name,
 | 
				
			||||||
c.column_name,
 | 
					c.column_name,
 | 
				
			||||||
@@ -488,8 +505,8 @@ and a.owner = c.owner
 | 
				
			|||||||
and a.table_name = c.table_name
 | 
					and a.table_name = c.table_name
 | 
				
			||||||
and b.owner = d.owner
 | 
					and b.owner = d.owner
 | 
				
			||||||
and b.table_name = d.table_name
 | 
					and b.table_name = d.table_name
 | 
				
			||||||
and a.owner in ({1}) and {0}
 | 
					and {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}) and {loc8}
 | 
				
			||||||
", loc8, databaseIn);
 | 
					";
 | 
				
			||||||
                ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
					                ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
                if (ds == null) return loc1;
 | 
					                if (ds == null) return loc1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -525,6 +542,7 @@ and a.owner in ({1}) and {0}
 | 
				
			|||||||
                foreach (var table_id in fkColumns.Keys)
 | 
					                foreach (var table_id in fkColumns.Keys)
 | 
				
			||||||
                    foreach (var fk in fkColumns[table_id])
 | 
					                    foreach (var fk in fkColumns[table_id])
 | 
				
			||||||
                        loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
					                        loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            foreach (var table_id in loc3.Keys)
 | 
					            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 InternalSbSet => _set;
 | 
				
			||||||
        internal StringBuilder InternalSbSetIncr => _setIncr;
 | 
					        internal StringBuilder InternalSbSetIncr => _setIncr;
 | 
				
			||||||
        internal Dictionary<string, bool> InternalIgnore => _ignore;
 | 
					        internal Dictionary<string, bool> InternalIgnore => _ignore;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -116,20 +116,31 @@ namespace FreeSql.Odbc.KingbaseES
 | 
				
			|||||||
            var tbname = _commonUtils.SplitTableName(name);
 | 
					            var tbname = _commonUtils.SplitTableName(name);
 | 
				
			||||||
            if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] };
 | 
					            if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] };
 | 
				
			||||||
            if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray();
 | 
					            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";
 | 
					            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 olddatabase = "";
 | 
				
			||||||
            using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)))
 | 
					            using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)))
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                olddatabase = conn.Value.Database;
 | 
					                olddatabase = conn.Value.Database;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            var dbs = database == null || database.Any() == false ? new[] { olddatabase } : database;
 | 
					            string[] tbname = null;
 | 
				
			||||||
            var tables = new List<DbTableInfo>();
 | 
					            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)
 | 
					            foreach (var db in dbs)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (string.IsNullOrEmpty(db) || string.Compare(db, olddatabase, true) != 0) continue;
 | 
					                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 loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                var sql = $@"
 | 
					                var sql = $@"
 | 
				
			||||||
select
 | 
					{(tbname == null ? "" : $"select * from (")}select
 | 
				
			||||||
b.nspname || '.' || a.tablename,
 | 
					b.nspname || '.' || a.tablename,
 | 
				
			||||||
a.schemaname,
 | 
					a.schemaname,
 | 
				
			||||||
a.tablename ,
 | 
					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
 | 
					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') 
 | 
					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')
 | 
					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);
 | 
					                var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
                if (ds == null) return loc1;
 | 
					                if (ds == null) return loc1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -381,6 +392,8 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || d.relname")
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (tbname == null)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                    sql = $@"
 | 
					                    sql = $@"
 | 
				
			||||||
select
 | 
					select
 | 
				
			||||||
ns.nspname || '.' || b.relname as table_id, 
 | 
					ns.nspname || '.' || b.relname as table_id, 
 | 
				
			||||||
@@ -431,6 +444,7 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || b.relname")
 | 
				
			|||||||
                    foreach (var table_id in fkColumns.Keys)
 | 
					                    foreach (var table_id in fkColumns.Keys)
 | 
				
			||||||
                        foreach (var fk in fkColumns[table_id])
 | 
					                        foreach (var fk in fkColumns[table_id])
 | 
				
			||||||
                            loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
					                            loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                foreach (var table_id in loc3.Keys)
 | 
					                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";
 | 
					            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 loc1 = new List<DbTableInfo>();
 | 
				
			||||||
            var loc2 = new Dictionary<string, DbTableInfo>();
 | 
					            var loc2 = new Dictionary<string, DbTableInfo>();
 | 
				
			||||||
            var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
					            var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
				
			||||||
            var database = database2?.ToArray();
 | 
					            string[] tbname = null;
 | 
				
			||||||
 | 
					            if (string.IsNullOrEmpty(tablename) == false)
 | 
				
			||||||
            if (database == null || database.Any() == 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())
 | 
					                using (var conn = _orm.Ado.MasterPool.Get())
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
@@ -147,8 +163,9 @@ namespace FreeSql.Odbc.MySql
 | 
				
			|||||||
                    database = new[] { conn.Value.Database };
 | 
					                    database = new[] { conn.Value.Database };
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a)));
 | 
					            var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a)));
 | 
				
			||||||
            var sql = string.Format(@"
 | 
					            var sql = $@"
 | 
				
			||||||
select 
 | 
					select 
 | 
				
			||||||
concat(a.table_schema, '.', a.table_name) 'id',
 | 
					concat(a.table_schema, '.', a.table_name) 'id',
 | 
				
			||||||
a.table_schema 'schema',
 | 
					a.table_schema 'schema',
 | 
				
			||||||
@@ -156,7 +173,7 @@ a.table_name 'table',
 | 
				
			|||||||
a.table_comment,
 | 
					a.table_comment,
 | 
				
			||||||
a.table_type 'type'
 | 
					a.table_type 'type'
 | 
				
			||||||
from information_schema.tables a
 | 
					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);
 | 
					            var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
            if (ds == null) return loc1;
 | 
					            if (ds == null) return loc1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -217,7 +234,7 @@ where a.table_schema in ({0})", databaseIn);
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            loc8.Append(")");
 | 
					            loc8.Append(")");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            sql = string.Format(@"
 | 
					            sql = $@"
 | 
				
			||||||
select
 | 
					select
 | 
				
			||||||
concat(a.table_schema, '.', a.table_name),
 | 
					concat(a.table_schema, '.', a.table_name),
 | 
				
			||||||
a.column_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_comment 'comment',
 | 
				
			||||||
a.column_default 'default_value'
 | 
					a.column_default 'default_value'
 | 
				
			||||||
from information_schema.columns a
 | 
					from information_schema.columns a
 | 
				
			||||||
where a.table_schema in ({1}) and {0}
 | 
					where {(ignoreCase ? "lower(a.table_schema)" : "a.table_schema")} in ({databaseIn}) and {loc8}
 | 
				
			||||||
", loc8, databaseIn);
 | 
					";
 | 
				
			||||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
					            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
            if (ds == null) return loc1;
 | 
					            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]);
 | 
					                loc3[table_id][column].CsType = this.GetCsTypeInfo(loc3[table_id][column]);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            sql = string.Format(@"
 | 
					            sql = $@"
 | 
				
			||||||
select 
 | 
					select 
 | 
				
			||||||
concat(a.table_schema, '.', a.table_name) 'table_id',
 | 
					concat(a.table_schema, '.', a.table_name) 'table_id',
 | 
				
			||||||
a.column_name,
 | 
					a.column_name,
 | 
				
			||||||
@@ -281,8 +298,8 @@ case when a.index_name = 'PRIMARY' then 1 else 0 end 'IsPrimaryKey',
 | 
				
			|||||||
0 'IsClustered',
 | 
					0 'IsClustered',
 | 
				
			||||||
0 'IsDesc'
 | 
					0 'IsDesc'
 | 
				
			||||||
from information_schema.statistics a
 | 
					from information_schema.statistics a
 | 
				
			||||||
where a.table_schema in ({1}) and {0}
 | 
					where {(ignoreCase ? "lower(a.table_schema)" : "a.table_schema")} in ({databaseIn}) and {loc8}
 | 
				
			||||||
", loc8, databaseIn);
 | 
					";
 | 
				
			||||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
					            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
            if (ds == null) return loc1;
 | 
					            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 
 | 
					select 
 | 
				
			||||||
concat(a.constraint_schema, '.', a.table_name) 'table_id',
 | 
					concat(a.constraint_schema, '.', a.table_name) 'table_id',
 | 
				
			||||||
a.column_name,
 | 
					a.column_name,
 | 
				
			||||||
@@ -342,8 +361,8 @@ concat(a.referenced_table_schema, '.', a.referenced_table_name) 'ref_table_id',
 | 
				
			|||||||
1 'IsForeignKey',
 | 
					1 'IsForeignKey',
 | 
				
			||||||
a.referenced_column_name 'ref_column'
 | 
					a.referenced_column_name 'ref_column'
 | 
				
			||||||
from information_schema.key_column_usage a
 | 
					from information_schema.key_column_usage a
 | 
				
			||||||
where a.constraint_schema in ({1}) and {0} and not isnull(position_in_unique_constraint)
 | 
					where {(ignoreCase ? "lower(a.constraint_schema)" : "a.constraint_schema")} in ({databaseIn}) and {loc8} and not isnull(position_in_unique_constraint)
 | 
				
			||||||
", loc8, databaseIn);
 | 
					";
 | 
				
			||||||
                ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
					                ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
                if (ds == null) return loc1;
 | 
					                if (ds == null) return loc1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -379,6 +398,7 @@ where a.constraint_schema in ({1}) and {0} and not isnull(position_in_unique_con
 | 
				
			|||||||
                foreach (var table_id in fkColumns.Keys)
 | 
					                foreach (var table_id in fkColumns.Keys)
 | 
				
			||||||
                    foreach (var fk in fkColumns[table_id])
 | 
					                    foreach (var fk in fkColumns[table_id])
 | 
				
			||||||
                        loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
					                        loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            foreach (var table_id in loc3.Keys)
 | 
					            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";
 | 
					            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 loc1 = new List<DbTableInfo>();
 | 
				
			||||||
            var loc2 = new Dictionary<string, DbTableInfo>();
 | 
					            var loc2 = new Dictionary<string, DbTableInfo>();
 | 
				
			||||||
            var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
					            var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
				
			||||||
            var database = database2?.ToArray();
 | 
					            string[] tbname = null;
 | 
				
			||||||
 | 
					            if (string.IsNullOrEmpty(tablename) == false)
 | 
				
			||||||
            if (database == null || database.Any() == 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();
 | 
					                var userUsers = _orm.Ado.ExecuteScalar(" select username from user_users")?.ToString();
 | 
				
			||||||
                if (string.IsNullOrEmpty(userUsers)) return loc1;
 | 
					                if (string.IsNullOrEmpty(userUsers)) return loc1;
 | 
				
			||||||
                database = new[] { userUsers };
 | 
					                database = new[] { userUsers };
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a)));
 | 
					            var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a)));
 | 
				
			||||||
            var sql = string.Format(@"
 | 
					            var sql = $@"
 | 
				
			||||||
select
 | 
					select
 | 
				
			||||||
a.owner || '.' || a.table_name,
 | 
					a.owner || '.' || a.table_name,
 | 
				
			||||||
a.owner,
 | 
					a.owner,
 | 
				
			||||||
@@ -208,7 +223,7 @@ b.comments,
 | 
				
			|||||||
'TABLE'
 | 
					'TABLE'
 | 
				
			||||||
from all_tables a
 | 
					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'
 | 
					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);
 | 
					            var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
            if (ds == null) return loc1;
 | 
					            if (ds == null) return loc1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -288,7 +303,7 @@ BEGIN
 | 
				
			|||||||
  RETURN TEXT_C1;
 | 
					  RETURN TEXT_C1;
 | 
				
			||||||
END;");
 | 
					END;");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            sql = string.Format(@"
 | 
					            sql = $@"
 | 
				
			||||||
select
 | 
					select
 | 
				
			||||||
a.owner || '.' || a.table_name,
 | 
					a.owner || '.' || a.table_name,
 | 
				
			||||||
a.column_name,
 | 
					a.column_name,
 | 
				
			||||||
@@ -303,8 +318,8 @@ to_char(b.comments),
 | 
				
			|||||||
nvl(FREESQL_LONG_TO_CHAR_DEFAULT(a.table_name, a.column_name),'')
 | 
					nvl(FREESQL_LONG_TO_CHAR_DEFAULT(a.table_name, a.column_name),'')
 | 
				
			||||||
from all_tab_cols a
 | 
					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
 | 
					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}
 | 
					where {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}) and {loc8}
 | 
				
			||||||
", loc8, databaseIn);
 | 
					";
 | 
				
			||||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
					            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
            if (ds == null) return loc1;
 | 
					            if (ds == null) return loc1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -360,7 +375,7 @@ where a.owner in ({1}) and {0}
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            OdbcOracleCodeFirst.CreateOracleFunction(_orm);
 | 
					            OdbcOracleCodeFirst.CreateOracleFunction(_orm);
 | 
				
			||||||
            sql = string.Format(@"
 | 
					            sql = $@"
 | 
				
			||||||
select
 | 
					select
 | 
				
			||||||
a.table_owner || '.' || a.table_name,
 | 
					a.table_owner || '.' || a.table_name,
 | 
				
			||||||
nvl(freesql_long_2_varchar(a.index_name, c.table_name, c.column_position), c.column_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
 | 
					where a.index_name = c.index_name
 | 
				
			||||||
and a.table_owner = c.table_owner
 | 
					and a.table_owner = c.table_owner
 | 
				
			||||||
and a.table_name = c.table_name
 | 
					and a.table_name = c.table_name
 | 
				
			||||||
and a.table_owner in ({1}) and {0}
 | 
					and {(ignoreCase ? "lower(a.table_owner)" : "a.table_owner")} in ({databaseIn}) and {loc8}
 | 
				
			||||||
", loc8, databaseIn);
 | 
					";
 | 
				
			||||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
					            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
            if (ds == null) return loc1;
 | 
					            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
 | 
					select
 | 
				
			||||||
a.owner || '.' || a.table_name,
 | 
					a.owner || '.' || a.table_name,
 | 
				
			||||||
c.column_name,
 | 
					c.column_name,
 | 
				
			||||||
@@ -462,8 +479,8 @@ and a.owner = c.owner   
 | 
				
			|||||||
and a.table_name = c.table_name   
 | 
					and a.table_name = c.table_name   
 | 
				
			||||||
and b.owner = d.owner   
 | 
					and b.owner = d.owner   
 | 
				
			||||||
and b.table_name = d.table_name
 | 
					and b.table_name = d.table_name
 | 
				
			||||||
and a.owner in ({1}) and {0}
 | 
					and {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}) and {loc8}
 | 
				
			||||||
", loc8, databaseIn);
 | 
					";
 | 
				
			||||||
                ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
					                ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
                if (ds == null) return loc1;
 | 
					                if (ds == null) return loc1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -499,6 +516,7 @@ and a.owner in ({1}) and {0}
 | 
				
			|||||||
                foreach (var table_id in fkColumns.Keys)
 | 
					                foreach (var table_id in fkColumns.Keys)
 | 
				
			||||||
                    foreach (var fk in fkColumns[table_id])
 | 
					                    foreach (var fk in fkColumns[table_id])
 | 
				
			||||||
                        loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
					                        loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            foreach (var table_id in loc3.Keys)
 | 
					            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 InternalSbSet => _set;
 | 
				
			||||||
        internal StringBuilder InternalSbSetIncr => _setIncr;
 | 
					        internal StringBuilder InternalSbSetIncr => _setIncr;
 | 
				
			||||||
        internal Dictionary<string, bool> InternalIgnore => _ignore;
 | 
					        internal Dictionary<string, bool> InternalIgnore => _ignore;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -128,11 +128,14 @@ namespace FreeSql.Odbc.PostgreSQL
 | 
				
			|||||||
            var tbname = _commonUtils.SplitTableName(name);
 | 
					            var tbname = _commonUtils.SplitTableName(name);
 | 
				
			||||||
            if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] };
 | 
					            if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] };
 | 
				
			||||||
            if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray();
 | 
					            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";
 | 
					            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 olddatabase = "";
 | 
				
			||||||
            var is96 = true;
 | 
					            var is96 = true;
 | 
				
			||||||
@@ -141,7 +144,15 @@ namespace FreeSql.Odbc.PostgreSQL
 | 
				
			|||||||
                olddatabase = conn.Value.Database;
 | 
					                olddatabase = conn.Value.Database;
 | 
				
			||||||
                is96 = PgVersionIs96(conn.Value.ServerVersion);
 | 
					                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>();
 | 
					            var tables = new List<DbTableInfo>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            foreach (var db in dbs)
 | 
					            foreach (var db in dbs)
 | 
				
			||||||
@@ -153,7 +164,7 @@ namespace FreeSql.Odbc.PostgreSQL
 | 
				
			|||||||
                var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
					                var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                var sql = $@"
 | 
					                var sql = $@"
 | 
				
			||||||
select
 | 
					{(tbname == null ? "" : $"select * from (")}select
 | 
				
			||||||
b.nspname || '.' || a.tablename,
 | 
					b.nspname || '.' || a.tablename,
 | 
				
			||||||
a.schemaname,
 | 
					a.schemaname,
 | 
				
			||||||
a.tablename ,
 | 
					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
 | 
					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') 
 | 
					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')
 | 
					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);
 | 
					                var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
                if (ds == null) return loc1;
 | 
					                if (ds == null) return loc1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -396,6 +407,8 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || d.relname")
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (tbname == null)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                    sql = $@"
 | 
					                    sql = $@"
 | 
				
			||||||
select
 | 
					select
 | 
				
			||||||
ns.nspname || '.' || b.relname as table_id, 
 | 
					ns.nspname || '.' || b.relname as table_id, 
 | 
				
			||||||
@@ -446,6 +459,7 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || b.relname")
 | 
				
			|||||||
                    foreach (var table_id in fkColumns.Keys)
 | 
					                    foreach (var table_id in fkColumns.Keys)
 | 
				
			||||||
                        foreach (var fk in fkColumns[table_id])
 | 
					                        foreach (var fk in fkColumns[table_id])
 | 
				
			||||||
                            loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
					                            loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                foreach (var table_id in loc3.Keys)
 | 
					                foreach (var table_id in loc3.Keys)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,6 @@ using System.Data;
 | 
				
			|||||||
using System.Data.Odbc;
 | 
					using System.Data.Odbc;
 | 
				
			||||||
using System.Linq;
 | 
					using System.Linq;
 | 
				
			||||||
using System.Text;
 | 
					using System.Text;
 | 
				
			||||||
using System.Text.RegularExpressions;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace FreeSql.Odbc.SqlServer
 | 
					namespace FreeSql.Odbc.SqlServer
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -125,21 +124,32 @@ select
 | 
				
			|||||||
1
 | 
					1
 | 
				
			||||||
from sys.tables a
 | 
					from sys.tables a
 | 
				
			||||||
inner join sys.schemas b on b.schema_id = a.schema_id
 | 
					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}];
 | 
					use [{olddatabase}];
 | 
				
			||||||
";
 | 
					";
 | 
				
			||||||
            return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1";
 | 
					            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 = "";
 | 
					            var olddatabase = "";
 | 
				
			||||||
            using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)))
 | 
					            using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)))
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                olddatabase = conn.Value.Database;
 | 
					                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>();
 | 
					            var tables = new List<DbTableInfo>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            foreach (var db in dbs)
 | 
					            foreach (var db in dbs)
 | 
				
			||||||
@@ -152,6 +162,7 @@ use [{olddatabase}];
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                var sql = $@"
 | 
					                var sql = $@"
 | 
				
			||||||
use [{db}];
 | 
					use [{db}];
 | 
				
			||||||
 | 
					select * from (
 | 
				
			||||||
select 
 | 
					select 
 | 
				
			||||||
 a.Object_id
 | 
					 a.Object_id
 | 
				
			||||||
,b.name 'Owner'
 | 
					,b.name 'Owner'
 | 
				
			||||||
@@ -180,8 +191,8 @@ select
 | 
				
			|||||||
from sys.procedures a
 | 
					from sys.procedures a
 | 
				
			||||||
inner join sys.schemas b on b.schema_id = a.schema_id
 | 
					inner join sys.schemas b on b.schema_id = a.schema_id
 | 
				
			||||||
where a.type = 'P' and charindex('diagram', a.name) = 0
 | 
					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}];
 | 
					use [{olddatabase}];
 | 
				
			||||||
";
 | 
					";
 | 
				
			||||||
                var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
					                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 + ')'
 | 
					  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) + ')'
 | 
					 when b.name in ('Numeric', 'Decimal') then '(' + cast(a.precision as varchar) + ',' + cast(a.scale as varchar) + ')'
 | 
				
			||||||
 else '' end as 'SqlType'
 | 
					 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
 | 
					{0} a
 | 
				
			||||||
inner join sys.types b on b.user_type_id = a.user_type_id
 | 
					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
 | 
					left join sys.tables d on d.object_id = a.object_id
 | 
				
			||||||
@@ -392,6 +403,8 @@ use [{olddatabase}];
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (tbname == null)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                    sql = $@"
 | 
					                    sql = $@"
 | 
				
			||||||
use [{db}];
 | 
					use [{db}];
 | 
				
			||||||
select 
 | 
					select 
 | 
				
			||||||
@@ -453,6 +466,7 @@ use [{olddatabase}];
 | 
				
			|||||||
                    foreach (var table_id in fkColumns.Keys)
 | 
					                    foreach (var table_id in fkColumns.Keys)
 | 
				
			||||||
                        foreach (var fk in fkColumns[table_id])
 | 
					                        foreach (var fk in fkColumns[table_id])
 | 
				
			||||||
                            loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
					                            loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                foreach (var table_id in loc3.Keys)
 | 
					                foreach (var table_id in loc3.Keys)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -185,21 +185,36 @@ namespace FreeSql.Oracle
 | 
				
			|||||||
            return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "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 loc1 = new List<DbTableInfo>();
 | 
				
			||||||
            var loc2 = new Dictionary<string, DbTableInfo>();
 | 
					            var loc2 = new Dictionary<string, DbTableInfo>();
 | 
				
			||||||
            var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
					            var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
				
			||||||
            var database = database2?.ToArray();
 | 
					            string[] tbname = null;
 | 
				
			||||||
 | 
					            if (string.IsNullOrEmpty(tablename) == false)
 | 
				
			||||||
            if (database == null || database.Any() == 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();
 | 
					                var userUsers = _orm.Ado.ExecuteScalar(" select username from user_users")?.ToString();
 | 
				
			||||||
                if (string.IsNullOrEmpty(userUsers)) return loc1;
 | 
					                if (string.IsNullOrEmpty(userUsers)) return loc1;
 | 
				
			||||||
                database = new[] { userUsers };
 | 
					                database = new[] { userUsers };
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a)));
 | 
					            var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a)));
 | 
				
			||||||
            var sql = string.Format(@"
 | 
					            var sql = $@"
 | 
				
			||||||
select
 | 
					select
 | 
				
			||||||
a.owner || '.' || a.table_name,
 | 
					a.owner || '.' || a.table_name,
 | 
				
			||||||
a.owner,
 | 
					a.owner,
 | 
				
			||||||
@@ -208,7 +223,7 @@ b.comments,
 | 
				
			|||||||
'TABLE'
 | 
					'TABLE'
 | 
				
			||||||
from all_tables a
 | 
					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'
 | 
					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);
 | 
					            var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
            if (ds == null) return loc1;
 | 
					            if (ds == null) return loc1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -288,7 +303,7 @@ BEGIN
 | 
				
			|||||||
  RETURN TEXT_C1;
 | 
					  RETURN TEXT_C1;
 | 
				
			||||||
END;");
 | 
					END;");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            sql = string.Format(@"
 | 
					            sql = $@"
 | 
				
			||||||
select
 | 
					select
 | 
				
			||||||
a.owner || '.' || a.table_name,
 | 
					a.owner || '.' || a.table_name,
 | 
				
			||||||
a.column_name,
 | 
					a.column_name,
 | 
				
			||||||
@@ -303,8 +318,8 @@ to_char(b.comments),
 | 
				
			|||||||
nvl(FREESQL_LONG_TO_CHAR_DEFAULT(a.table_name, a.column_name),'')
 | 
					nvl(FREESQL_LONG_TO_CHAR_DEFAULT(a.table_name, a.column_name),'')
 | 
				
			||||||
from all_tab_cols a
 | 
					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
 | 
					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}
 | 
					where {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}) and {loc8}
 | 
				
			||||||
", loc8, databaseIn);
 | 
					";
 | 
				
			||||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
					            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
            if (ds == null) return loc1;
 | 
					            if (ds == null) return loc1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -360,7 +375,7 @@ where a.owner in ({1}) and {0}
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            OracleCodeFirst.CreateOracleFunction(_orm);
 | 
					            OracleCodeFirst.CreateOracleFunction(_orm);
 | 
				
			||||||
            sql = string.Format(@"
 | 
					            sql = $@"
 | 
				
			||||||
select
 | 
					select
 | 
				
			||||||
a.table_owner || '.' || a.table_name,
 | 
					a.table_owner || '.' || a.table_name,
 | 
				
			||||||
nvl(freesql_long_2_varchar(a.index_name, c.table_name, c.column_position), c.column_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
 | 
					where a.index_name = c.index_name
 | 
				
			||||||
and a.table_owner = c.table_owner
 | 
					and a.table_owner = c.table_owner
 | 
				
			||||||
and a.table_name = c.table_name
 | 
					and a.table_name = c.table_name
 | 
				
			||||||
and a.table_owner in ({1}) and {0}
 | 
					and {(ignoreCase ? "lower(a.table_owner)" : "a.table_owner")} in ({databaseIn}) and {loc8}
 | 
				
			||||||
", loc8, databaseIn);
 | 
					";
 | 
				
			||||||
            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
					            ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
            if (ds == null) return loc1;
 | 
					            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
 | 
					select
 | 
				
			||||||
a.owner || '.' || a.table_name,
 | 
					a.owner || '.' || a.table_name,
 | 
				
			||||||
c.column_name,
 | 
					c.column_name,
 | 
				
			||||||
@@ -462,8 +479,8 @@ and a.owner = c.owner   
 | 
				
			|||||||
and a.table_name = c.table_name   
 | 
					and a.table_name = c.table_name   
 | 
				
			||||||
and b.owner = d.owner   
 | 
					and b.owner = d.owner   
 | 
				
			||||||
and b.table_name = d.table_name
 | 
					and b.table_name = d.table_name
 | 
				
			||||||
and a.owner in ({1}) and {0}
 | 
					and {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}) and {loc8}
 | 
				
			||||||
", loc8, databaseIn);
 | 
					";
 | 
				
			||||||
                ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
					                ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
                if (ds == null) return loc1;
 | 
					                if (ds == null) return loc1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -499,6 +516,7 @@ and a.owner in ({1}) and {0}
 | 
				
			|||||||
                foreach (var table_id in fkColumns.Keys)
 | 
					                foreach (var table_id in fkColumns.Keys)
 | 
				
			||||||
                    foreach (var fk in fkColumns[table_id])
 | 
					                    foreach (var fk in fkColumns[table_id])
 | 
				
			||||||
                        loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
					                        loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            foreach (var table_id in loc3.Keys)
 | 
					            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 InternalSbSet => _set;
 | 
				
			||||||
        internal StringBuilder InternalSbSetIncr => _setIncr;
 | 
					        internal StringBuilder InternalSbSetIncr => _setIncr;
 | 
				
			||||||
        internal Dictionary<string, bool> InternalIgnore => _ignore;
 | 
					        internal Dictionary<string, bool> InternalIgnore => _ignore;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -238,11 +238,14 @@ namespace FreeSql.PostgreSQL
 | 
				
			|||||||
            var tbname = _commonUtils.SplitTableName(name);
 | 
					            var tbname = _commonUtils.SplitTableName(name);
 | 
				
			||||||
            if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] };
 | 
					            if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] };
 | 
				
			||||||
            if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray();
 | 
					            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";
 | 
					            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 olddatabase = "";
 | 
				
			||||||
            var is96 = true;
 | 
					            var is96 = true;
 | 
				
			||||||
@@ -251,7 +254,15 @@ namespace FreeSql.PostgreSQL
 | 
				
			|||||||
                olddatabase = conn.Value.Database;
 | 
					                olddatabase = conn.Value.Database;
 | 
				
			||||||
                is96 = PgVersionIs96(conn.Value.ServerVersion);
 | 
					                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>();
 | 
					            var tables = new List<DbTableInfo>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            foreach (var db in dbs)
 | 
					            foreach (var db in dbs)
 | 
				
			||||||
@@ -263,7 +274,7 @@ namespace FreeSql.PostgreSQL
 | 
				
			|||||||
                var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
					                var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                var sql = $@"
 | 
					                var sql = $@"
 | 
				
			||||||
select
 | 
					{(tbname == null ? "" : $"select * from (")}select
 | 
				
			||||||
b.nspname || '.' || a.tablename,
 | 
					b.nspname || '.' || a.tablename,
 | 
				
			||||||
a.schemaname,
 | 
					a.schemaname,
 | 
				
			||||||
a.tablename ,
 | 
					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
 | 
					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') 
 | 
					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')
 | 
					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);
 | 
					                var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
                if (ds == null) return loc1;
 | 
					                if (ds == null) return loc1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -506,6 +517,8 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || d.relname")
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (tbname == null)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                    sql = $@"
 | 
					                    sql = $@"
 | 
				
			||||||
select
 | 
					select
 | 
				
			||||||
ns.nspname || '.' || b.relname as table_id, 
 | 
					ns.nspname || '.' || b.relname as table_id, 
 | 
				
			||||||
@@ -556,6 +569,7 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || b.relname")
 | 
				
			|||||||
                    foreach (var table_id in fkColumns.Keys)
 | 
					                    foreach (var table_id in fkColumns.Keys)
 | 
				
			||||||
                        foreach (var fk in fkColumns[table_id])
 | 
					                        foreach (var fk in fkColumns[table_id])
 | 
				
			||||||
                            loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
					                            loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                foreach (var table_id in loc3.Keys)
 | 
					                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 InternalSbSet => _set;
 | 
				
			||||||
        internal StringBuilder InternalSbSetIncr => _setIncr;
 | 
					        internal StringBuilder InternalSbSetIncr => _setIncr;
 | 
				
			||||||
        internal Dictionary<string, bool> InternalIgnore => _ignore;
 | 
					        internal Dictionary<string, bool> InternalIgnore => _ignore;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -134,19 +134,30 @@ select
 | 
				
			|||||||
1
 | 
					1
 | 
				
			||||||
from sys_class a
 | 
					from sys_class a
 | 
				
			||||||
inner join sys_namespace b on b.oid = a.relnamespace
 | 
					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";
 | 
					            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 olddatabase = "";
 | 
				
			||||||
            using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)))
 | 
					            using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)))
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                olddatabase = conn.Value.Database;
 | 
					                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>();
 | 
					            var tables = new List<DbTableInfo>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            foreach (var db in dbs)
 | 
					            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 loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                var sql = $@"
 | 
					                var sql = $@"
 | 
				
			||||||
select
 | 
					{(tbname == null ? "" : $"select * from (")}select
 | 
				
			||||||
b.nspname || '.' || a.relname,
 | 
					b.nspname || '.' || a.relname,
 | 
				
			||||||
b.nspname,
 | 
					b.nspname,
 | 
				
			||||||
a.relname,
 | 
					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
 | 
					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') 
 | 
					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')
 | 
					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);
 | 
					                var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
                if (ds == null) return loc1;
 | 
					                if (ds == null) return loc1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -400,6 +411,8 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || d.relname")
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (tbname == null)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                    sql = $@"
 | 
					                    sql = $@"
 | 
				
			||||||
select
 | 
					select
 | 
				
			||||||
a.pktable_schem || '.' || a.pktable_name,
 | 
					a.pktable_schem || '.' || a.pktable_name,
 | 
				
			||||||
@@ -441,6 +454,7 @@ where {loc8.ToString().Replace("a.table_name", "a.pktable_schem || '.' || a.pkta
 | 
				
			|||||||
                    foreach (var table_id in fkColumns.Keys)
 | 
					                    foreach (var table_id in fkColumns.Keys)
 | 
				
			||||||
                        foreach (var fk in fkColumns[table_id])
 | 
					                        foreach (var fk in fkColumns[table_id])
 | 
				
			||||||
                            loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
					                            loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                foreach (var table_id in loc3.Keys)
 | 
					                foreach (var table_id in loc3.Keys)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,6 @@ using System.Collections.Generic;
 | 
				
			|||||||
using System.Data;
 | 
					using System.Data;
 | 
				
			||||||
using System.Linq;
 | 
					using System.Linq;
 | 
				
			||||||
using System.Text;
 | 
					using System.Text;
 | 
				
			||||||
using System.Text.RegularExpressions;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace FreeSql.SqlServer
 | 
					namespace FreeSql.SqlServer
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -128,21 +127,32 @@ select
 | 
				
			|||||||
1
 | 
					1
 | 
				
			||||||
from sys.tables a
 | 
					from sys.tables a
 | 
				
			||||||
inner join sys.schemas b on b.schema_id = a.schema_id
 | 
					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}];
 | 
					use [{olddatabase}];
 | 
				
			||||||
";
 | 
					";
 | 
				
			||||||
            return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1";
 | 
					            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 = "";
 | 
					            var olddatabase = "";
 | 
				
			||||||
            using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)))
 | 
					            using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)))
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                olddatabase = conn.Value.Database;
 | 
					                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>();
 | 
					            var tables = new List<DbTableInfo>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            foreach (var db in dbs)
 | 
					            foreach (var db in dbs)
 | 
				
			||||||
@@ -155,6 +165,7 @@ use [{olddatabase}];
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                var sql = $@"
 | 
					                var sql = $@"
 | 
				
			||||||
use [{db}];
 | 
					use [{db}];
 | 
				
			||||||
 | 
					select * from (
 | 
				
			||||||
select 
 | 
					select 
 | 
				
			||||||
 a.Object_id
 | 
					 a.Object_id
 | 
				
			||||||
,b.name 'Owner'
 | 
					,b.name 'Owner'
 | 
				
			||||||
@@ -183,8 +194,8 @@ select
 | 
				
			|||||||
from sys.procedures a
 | 
					from sys.procedures a
 | 
				
			||||||
inner join sys.schemas b on b.schema_id = a.schema_id
 | 
					inner join sys.schemas b on b.schema_id = a.schema_id
 | 
				
			||||||
where a.type = 'P' and charindex('diagram', a.name) = 0
 | 
					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}];
 | 
					use [{olddatabase}];
 | 
				
			||||||
";
 | 
					";
 | 
				
			||||||
                var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
					                var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
@@ -395,6 +406,8 @@ use [{olddatabase}];
 | 
				
			|||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (tbname == null)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                    sql = $@"
 | 
					                    sql = $@"
 | 
				
			||||||
use [{db}];
 | 
					use [{db}];
 | 
				
			||||||
select 
 | 
					select 
 | 
				
			||||||
@@ -456,6 +469,7 @@ use [{olddatabase}];
 | 
				
			|||||||
                    foreach (var table_id in fkColumns.Keys)
 | 
					                    foreach (var table_id in fkColumns.Keys)
 | 
				
			||||||
                        foreach (var fk in fkColumns[table_id])
 | 
					                        foreach (var fk in fkColumns[table_id])
 | 
				
			||||||
                            loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
					                            loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                foreach (var table_id in loc3.Keys)
 | 
					                foreach (var table_id in loc3.Keys)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -155,18 +155,28 @@ namespace FreeSql.Sqlite
 | 
				
			|||||||
            var tbname = _commonUtils.SplitTableName(name);
 | 
					            var tbname = _commonUtils.SplitTableName(name);
 | 
				
			||||||
            if (tbname?.Length == 1) tbname = new[] { "main", tbname[0] };
 | 
					            if (tbname?.Length == 1) tbname = new[] { "main", tbname[0] };
 | 
				
			||||||
            if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray();
 | 
					            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";
 | 
					            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 loc1 = new List<DbTableInfo>();
 | 
				
			||||||
            var loc2 = new Dictionary<string, DbTableInfo>();
 | 
					            var loc2 = new Dictionary<string, DbTableInfo>();
 | 
				
			||||||
            var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
					            var loc3 = new Dictionary<string, Dictionary<string, DbColumnInfo>>();
 | 
				
			||||||
            var database = database2?.ToArray();
 | 
					            string[] tbname = null;
 | 
				
			||||||
 | 
					            if (string.IsNullOrEmpty(tablename) == false)
 | 
				
			||||||
            if (database == null || database.Any() == false) database = GetDatabases().ToArray();
 | 
					            {
 | 
				
			||||||
 | 
					                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;
 | 
					            if (database.Any() == false) return loc1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Action<object[], int> addColumn = (row, position) =>
 | 
					            Action<object[], int> addColumn = (row, position) =>
 | 
				
			||||||
@@ -212,7 +222,7 @@ tbl_name,
 | 
				
			|||||||
'' Comment,
 | 
					'' Comment,
 | 
				
			||||||
'TABLE',
 | 
					'TABLE',
 | 
				
			||||||
sql
 | 
					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);
 | 
					                var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
 | 
				
			||||||
                if (ds == null) continue;
 | 
					                if (ds == null) continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -284,6 +294,8 @@ from {db}.sqlite_master where type = 'table'";
 | 
				
			|||||||
                            addColumn(ds2item, ++position);
 | 
					                            addColumn(ds2item, ++position);
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if (tbname == null)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
                            var fks = _orm.Ado.ExecuteArray(CommandType.Text, $"PRAGMA \"{db}\".foreign_key_list(\"{table}\")");
 | 
					                            var fks = _orm.Ado.ExecuteArray(CommandType.Text, $"PRAGMA \"{db}\".foreign_key_list(\"{table}\")");
 | 
				
			||||||
                            if (fks != null && fks.Length > 0)
 | 
					                            if (fks != null && fks.Length > 0)
 | 
				
			||||||
                            {
 | 
					                            {
 | 
				
			||||||
@@ -315,6 +327,7 @@ from {db}.sqlite_master where type = 'table'";
 | 
				
			|||||||
                            }
 | 
					                            }
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
                if (loc6_1000.Count > 0) loc6.Add(loc6_1000.ToArray());
 | 
					                if (loc6_1000.Count > 0) loc6.Add(loc6_1000.ToArray());
 | 
				
			||||||
                if (loc66_1000.Count > 0) loc66.Add(loc66_1000.ToArray());
 | 
					                if (loc66_1000.Count > 0) loc66.Add(loc66_1000.ToArray());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user