From 0d832a5a231cff9071eae867e64816cc73916933 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Tue, 11 Aug 2020 23:23:54 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20IDbFirst.GetTableByNam?= =?UTF-8?q?e=20=E6=96=B9=E6=B3=95=E8=8E=B7=E5=8F=96=E5=8D=95=E8=A1=A8?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=EF=BC=8C=E5=8C=85=E6=8B=AC=E5=88=97=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E3=80=81=E4=B8=BB=E9=94=AE=E3=80=81=E5=94=AF=E4=B8=80?= =?UTF-8?q?=E9=94=AE=E3=80=81=E7=B4=A2=E5=BC=95=E3=80=81=E5=A4=87=E6=B3=A8?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MySqlConnector/MySqlDbFirstTest.cs | 18 ++- .../Dameng/DamengDbFirstTest.cs | 19 ++- .../KingbaseES/KingbaseESDbFirstTest.cs | 17 ++- .../MySql/MySqlDbFirstTest.cs | 18 ++- .../Oracle/OracleDbFirstTest.cs | 19 ++- .../PostgreSQL/PostgreSQLDbFirstTest.cs | 23 ++-- .../SqlServer/SqlServerDbFirstTest.cs | 18 ++- .../FreeSql.Tests/Dameng/DamengDbFirstTest.cs | 19 ++- .../FreeSql.Tests/MySql/MySqlDbFirstTest.cs | 18 ++- .../FreeSql.Tests/Oracle/OracleDbFirstTest.cs | 19 ++- .../PostgreSQL/PostgreSQLDbFirstTest.cs | 22 ++-- .../ShenTong/ShenTongDbFirstTest.cs | 18 ++- .../SqlServer/SqlServerDbFirstTest.cs | 18 ++- .../FreeSql.Tests/Sqlite/SqliteDbFirstTest.cs | 18 ++- FreeSql/FreeSql.xml | 24 ++-- FreeSql/Interface/IDbFirst.cs | 26 ++-- .../FreeSql.Provider.Dameng/DamengDbFirst.cs | 110 ++++++++++------- .../FreeSql.Provider.MySql/MySqlDbFirst.cs | 112 +++++++++++------- .../Dameng/OdbcDamengDbFirst.cs | 110 ++++++++++------- .../KingbaseES/Curd/OdbcKingbaseESUpdate.cs | 2 +- .../KingbaseES/OdbcKingbaseESDbFirst.cs | 86 ++++++++------ .../MySql/OdbcMySqlDbFirst.cs | 112 +++++++++++------- .../Oracle/OdbcOracleDbFirst.cs | 110 ++++++++++------- .../PostgreSQL/Curd/OdbcPostgreSQLUpdate.cs | 2 +- .../PostgreSQL/OdbcPostgreSQLDbFirst.cs | 84 +++++++------ .../SqlServer/OdbcSqlServerDbFirst.cs | 102 +++++++++------- .../FreeSql.Provider.Oracle/OracleDbFirst.cs | 110 ++++++++++------- .../Curd/PostgreSQLUpdate.cs | 2 +- .../PostgreSQLDbFirst.cs | 84 +++++++------ .../Curd/ShenTongUpdate.cs | 2 +- .../ShenTongDbFirst.cs | 80 +++++++------ .../SqlServerDbFirst.cs | 100 +++++++++------- .../FreeSql.Provider.Sqlite/SqliteDbFirst.cs | 73 +++++++----- 33 files changed, 994 insertions(+), 601 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlDbFirstTest.cs index 901ec1c6..ddf2f1a0 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlDbFirstTest.cs @@ -9,17 +9,29 @@ namespace FreeSql.Tests.MySqlConnector [Fact] public void GetDatabases() { - var t1 = g.mysql.DbFirst.GetDatabases(); - } [Fact] public void GetTablesByDatabase() { - 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] diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/DamengDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/DamengDbFirstTest.cs index 12dee40a..ee4a2119 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/DamengDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/DamengDbFirstTest.cs @@ -9,19 +9,32 @@ namespace FreeSql.Tests.Odbc.Dameng [Fact] public void GetDatabases() { - var t1 = g.dameng.DbFirst.GetDatabases(); - } [Fact] public void 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\""); } + [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] public void ExistsTable() { diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/KingbaseES/KingbaseESDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/KingbaseES/KingbaseESDbFirstTest.cs index 0098989e..cebd3ac1 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/KingbaseES/KingbaseESDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/KingbaseES/KingbaseESDbFirstTest.cs @@ -16,7 +16,22 @@ namespace FreeSql.Tests.Odbc.KingbaseES public void 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] diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/MySqlDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/MySqlDbFirstTest.cs index 1a687cbc..613ca970 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/MySqlDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/MySqlDbFirstTest.cs @@ -9,17 +9,29 @@ namespace FreeSql.Tests.Odbc.MySql [Fact] public void GetDatabases() { - var t1 = g.mysql.DbFirst.GetDatabases(); - } [Fact] public void GetTablesByDatabase() { - 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] diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/OracleDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/OracleDbFirstTest.cs index 5012ceee..1b1eb6f3 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/OracleDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/OracleDbFirstTest.cs @@ -9,19 +9,32 @@ namespace FreeSql.Tests.Odbc.Oracle [Fact] public void GetDatabases() { - var t1 = g.oracle.DbFirst.GetDatabases(); - } [Fact] public void 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\""); } + [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] public void ExistsTable() { diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/PostgreSQLDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/PostgreSQLDbFirstTest.cs index 70892d7c..ca76dae8 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/PostgreSQLDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/PostgreSQLDbFirstTest.cs @@ -10,20 +10,29 @@ namespace FreeSql.Tests.Odbc.PostgreSQL [Fact] public void GetDatabases() { - var t1 = g.pgsql.DbFirst.GetDatabases(); - } [Fact] 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]); - - var tb_alltype = t2.Where(a => a.Name == "tb_alltype").FirstOrDefault(); - - var tb_identity = t2.Where(a => a.Name == "test_new").FirstOrDefault(); + [Fact] + public void GetTableByName() + { + 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] diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/SqlServerDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/SqlServerDbFirstTest.cs index 90b3e2d8..95ebf376 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/SqlServerDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/SqlServerDbFirstTest.cs @@ -10,17 +10,29 @@ namespace FreeSql.Tests.Odbc.SqlServer [Fact] public void GetDatabases() { - var t1 = g.sqlserver.DbFirst.GetDatabases(); - } [Fact] public void 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] diff --git a/FreeSql.Tests/FreeSql.Tests/Dameng/DamengDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/Dameng/DamengDbFirstTest.cs index 4e6698b9..8ae7578a 100644 --- a/FreeSql.Tests/FreeSql.Tests/Dameng/DamengDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Dameng/DamengDbFirstTest.cs @@ -9,19 +9,32 @@ namespace FreeSql.Tests.Dameng [Fact] public void GetDatabases() { - var t1 = g.dameng.DbFirst.GetDatabases(); - } [Fact] public void 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\""); } + [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] public void ExistsTable() { diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/MySqlDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/MySqlDbFirstTest.cs index 9e2fa376..b6e9c337 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/MySqlDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/MySqlDbFirstTest.cs @@ -9,17 +9,29 @@ namespace FreeSql.Tests.MySql [Fact] public void GetDatabases() { - var t1 = g.mysql.DbFirst.GetDatabases(); - } [Fact] public void GetTablesByDatabase() { - 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] diff --git a/FreeSql.Tests/FreeSql.Tests/Oracle/OracleDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/Oracle/OracleDbFirstTest.cs index 19fc547d..c3cfaaa0 100644 --- a/FreeSql.Tests/FreeSql.Tests/Oracle/OracleDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Oracle/OracleDbFirstTest.cs @@ -9,19 +9,32 @@ namespace FreeSql.Tests.Oracle [Fact] public void GetDatabases() { - var t1 = g.oracle.DbFirst.GetDatabases(); - } [Fact] public void 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\""); } + [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] public void ExistsTable() { diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLDbFirstTest.cs index 507694a5..bd7dfcb5 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLDbFirstTest.cs @@ -10,21 +10,29 @@ namespace FreeSql.Tests.PostgreSQL [Fact] public void GetDatabases() { - var t1 = g.pgsql.DbFirst.GetDatabases(); - } [Fact] public void GetTablesByDatabase() { - 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(); - - var tb_identity = t2.Where(a => a.Name == "test_new").FirstOrDefault(); - + [Fact] + public void GetTableByName() + { + 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] diff --git a/FreeSql.Tests/FreeSql.Tests/ShenTong/ShenTongDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/ShenTong/ShenTongDbFirstTest.cs index bd26596a..db4bdd3a 100644 --- a/FreeSql.Tests/FreeSql.Tests/ShenTong/ShenTongDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/ShenTong/ShenTongDbFirstTest.cs @@ -9,9 +9,7 @@ namespace FreeSql.Tests.ShenTong [Fact] public void GetDatabases() { - var t1 = g.shentong.DbFirst.GetDatabases(); - } [Fact] @@ -19,7 +17,23 @@ namespace FreeSql.Tests.ShenTong { var t1 = g.shentong.DbFirst.GetTablesByDatabase(); 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] diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerDbFirstTest.cs index 8a5b251a..21917375 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerDbFirstTest.cs @@ -19,17 +19,29 @@ namespace FreeSql.Tests.SqlServer [Fact] public void GetDatabases() { - var t1 = g.sqlserver.DbFirst.GetDatabases(); - } [Fact] public void 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] diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteDbFirstTest.cs index 0f7d304d..e152584f 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteDbFirstTest.cs @@ -9,17 +9,29 @@ namespace FreeSql.Tests.Sqlite [Fact] public void GetDatabases() { - var t1 = g.sqlite.DbFirst.GetDatabases(); - } [Fact] public void 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] diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index bc504527..4f5d13e2 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -3121,6 +3121,22 @@ + + + 获取指定单表信息,包括列详情、主键、唯一键、索引、备注 + + 表名,如:dbo.table1 + 是否忽略大小写 + + + + + 判断表是否存在 + + 表名,如:dbo.table1 + 是否忽略大小写 + + 获取数据库枚举类型int值 @@ -3184,14 +3200,6 @@ - - - 判断表是否存在 - - 表名,如:dbo.table1 - 是否忽略大小写 - - 如果实体类有自增属性,分成两个 List,有值的Item1 merge,无值的Item2 insert diff --git a/FreeSql/Interface/IDbFirst.cs b/FreeSql/Interface/IDbFirst.cs index 3a385384..de614453 100644 --- a/FreeSql/Interface/IDbFirst.cs +++ b/FreeSql/Interface/IDbFirst.cs @@ -19,6 +19,22 @@ namespace FreeSql /// List GetTablesByDatabase(params string[] database); + /// + /// 获取指定单表信息,包括列详情、主键、唯一键、索引、备注 + /// + /// 表名,如:dbo.table1 + /// 是否忽略大小写 + /// + DbTableInfo GetTableByName(string name, bool ignoreCase = true); + + /// + /// 判断表是否存在 + /// + /// 表名,如:dbo.table1 + /// 是否忽略大小写 + /// + bool ExistsTable(string name, bool ignoreCase = true); + /// /// 获取数据库枚举类型int值 /// @@ -75,15 +91,5 @@ namespace FreeSql /// /// List GetEnumsByDatabase(params string[] database); - - /// - /// 判断表是否存在 - /// - /// 表名,如:dbo.table1 - /// 是否忽略大小写 - /// - bool ExistsTable(string name, bool ignoreCase = true); - - //DbTableInfo GetTableByName(string name); } } diff --git a/Providers/FreeSql.Provider.Dameng/DamengDbFirst.cs b/Providers/FreeSql.Provider.Dameng/DamengDbFirst.cs index d3525e7c..9f20d709 100644 --- a/Providers/FreeSql.Provider.Dameng/DamengDbFirst.cs +++ b/Providers/FreeSql.Provider.Dameng/DamengDbFirst.cs @@ -231,21 +231,36 @@ namespace FreeSql.Dameng return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; } - public List GetTablesByDatabase(params string[] database2) + public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault(); + public List GetTablesByDatabase(params string[] database) => GetTables(database, null, false); + + public List GetTables(string[] database, string tablename, bool ignoreCase) { var loc1 = new List(); var loc2 = new Dictionary(); var loc3 = new Dictionary>(); - var database = database2?.ToArray(); - - if (database == null || database.Any() == false) + string[] tbname = null; + if (string.IsNullOrEmpty(tablename) == false) + { + tbname = _commonUtils.SplitTableName(tablename); + if (tbname?.Length == 1) + { + var userUsers = _orm.Ado.ExecuteScalar(" select username from user_users")?.ToString(); + if (string.IsNullOrEmpty(userUsers)) return loc1; + tbname = new[] { userUsers, tbname[0] }; + } + if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray(); + database = new[] { tbname[0] }; + } + else if (database == null || database.Any() == false) { var userUsers = _orm.Ado.ExecuteScalar(" select username from user_users")?.ToString(); if (string.IsNullOrEmpty(userUsers)) return loc1; database = new[] { userUsers }; } + var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a))); - var sql = string.Format(@" + var sql = $@" select a.owner || '.' || a.table_name, a.owner, @@ -254,7 +269,7 @@ b.comments, 'TABLE' from all_tables a left join all_tab_comments b on b.owner = a.owner and b.table_name = a.table_name and b.table_type = 'TABLE' -where a.owner in ({0})", databaseIn); +where {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}){(tbname == null ? "" : $" and {(ignoreCase ? "lower(a.table_name)" : "a.table_name")}={_commonUtils.FormatSql("{0}", tbname[1])}")}"; var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -315,7 +330,7 @@ where a.owner in ({0})", databaseIn); } loc8.Append(")"); - sql = string.Format(@" + sql = $@" select a.owner || '.' || a.table_name, a.column_name, @@ -330,8 +345,8 @@ b.comments, a.data_default from all_tab_cols a left join all_col_comments b on b.owner = a.owner and b.table_name = a.table_name and b.column_name = a.column_name -where a.owner in ({1}) and {0} -", loc8, databaseIn); +where {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}) and {loc8} +"; ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -386,7 +401,7 @@ where a.owner in ({1}) and {0} loc3[table_id][column].CsType = this.GetCsTypeInfo(loc3[table_id][column]); } - sql = string.Format(@" + sql = $@" select a.table_owner || '.' || a.table_name, c.column_name, @@ -401,8 +416,8 @@ all_ind_columns c where a.index_name = c.index_name and a.table_owner = c.table_owner and a.table_name = c.table_name -and a.table_owner in ({1}) and {0} -", loc8, databaseIn); +and {(ignoreCase ? "lower(a.table_owner)" : "a.table_owner")} in ({databaseIn}) and {loc8} +"; ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -454,7 +469,9 @@ and a.table_owner in ({1}) and {0} } } - sql = string.Format(@" + if (tbname == null) + { + sql = $@" select a.owner || '.' || a.table_name, c.column_name, @@ -488,43 +505,44 @@ and a.owner = c.owner and a.table_name = c.table_name and b.owner = d.owner and b.table_name = d.table_name -and a.owner in ({1}) and {0} -", loc8, databaseIn); - ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); - if (ds == null) return loc1; +and {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}) and {loc8} +"; + ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); + if (ds == null) return loc1; - var fkColumns = new Dictionary>(); - foreach (var row in ds) - { - string table_id = string.Concat(row[0]); - string column = string.Concat(row[1]); - string fk_id = string.Concat(row[2]); - string ref_table_id = string.Concat(row[3]); - bool is_foreign_key = string.Concat(row[4]) == "1"; - string referenced_column = string.Concat(row[5]); - if (database.Length == 1) + var fkColumns = new Dictionary>(); + foreach (var row in ds) { - table_id = table_id.Substring(table_id.IndexOf('.') + 1); - ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1); - } - if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue; - var loc9 = loc3[table_id][column]; - if (loc2.ContainsKey(ref_table_id) == false) continue; - var loc10 = loc2[ref_table_id]; - var loc11 = loc3[ref_table_id][referenced_column]; + string table_id = string.Concat(row[0]); + string column = string.Concat(row[1]); + string fk_id = string.Concat(row[2]); + string ref_table_id = string.Concat(row[3]); + bool is_foreign_key = string.Concat(row[4]) == "1"; + string referenced_column = string.Concat(row[5]); + if (database.Length == 1) + { + table_id = table_id.Substring(table_id.IndexOf('.') + 1); + ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1); + } + if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue; + var loc9 = loc3[table_id][column]; + if (loc2.ContainsKey(ref_table_id) == false) continue; + var loc10 = loc2[ref_table_id]; + var loc11 = loc3[ref_table_id][referenced_column]; - Dictionary loc12 = null; - DbForeignInfo loc13 = null; - if (!fkColumns.TryGetValue(table_id, out loc12)) - fkColumns.Add(table_id, loc12 = new Dictionary()); - if (!loc12.TryGetValue(fk_id, out loc13)) - loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 }); - loc13.Columns.Add(loc9); - loc13.ReferencedColumns.Add(loc11); + Dictionary loc12 = null; + DbForeignInfo loc13 = null; + if (!fkColumns.TryGetValue(table_id, out loc12)) + fkColumns.Add(table_id, loc12 = new Dictionary()); + if (!loc12.TryGetValue(fk_id, out loc13)) + loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 }); + loc13.Columns.Add(loc9); + loc13.ReferencedColumns.Add(loc11); + } + foreach (var table_id in fkColumns.Keys) + foreach (var fk in fkColumns[table_id]) + loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value); } - foreach (var table_id in fkColumns.Keys) - foreach (var fk in fkColumns[table_id]) - loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value); foreach (var table_id in loc3.Keys) { diff --git a/Providers/FreeSql.Provider.MySql/MySqlDbFirst.cs b/Providers/FreeSql.Provider.MySql/MySqlDbFirst.cs index 03923720..5ec430ec 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlDbFirst.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlDbFirst.cs @@ -166,14 +166,30 @@ namespace FreeSql.MySql return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; } - public List GetTablesByDatabase(params string[] database2) + public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault(); + public List GetTablesByDatabase(params string[] database) => GetTables(database, null, false); + + public List GetTables(string[] database, string tablename, bool ignoreCase) { var loc1 = new List(); var loc2 = new Dictionary(); var loc3 = new Dictionary>(); - var database = database2?.ToArray(); - - if (database == null || database.Any() == false) + string[] tbname = null; + if (string.IsNullOrEmpty(tablename) == false) + { + tbname = _commonUtils.SplitTableName(tablename); + if (tbname?.Length == 1) + { + using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5))) + { + if (string.IsNullOrEmpty(conn.Value.Database)) return loc1; + tbname = new[] { conn.Value.Database, tbname[0] }; + } + } + if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray(); + database = new[] { tbname[0] }; + } + else if (database == null || database.Any() == false) { using (var conn = _orm.Ado.MasterPool.Get()) { @@ -181,8 +197,9 @@ namespace FreeSql.MySql database = new[] { conn.Value.Database }; } } + var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a))); - var sql = string.Format(@" + var sql = $@" select concat(a.table_schema, '.', a.table_name) 'id', a.table_schema 'schema', @@ -190,7 +207,7 @@ a.table_name 'table', a.table_comment, a.table_type 'type' from information_schema.tables a -where a.table_schema in ({0})", databaseIn); +where {(ignoreCase ? "lower(a.table_schema)" : "a.table_schema")} in ({databaseIn}){(tbname == null ? "" : $" and {(ignoreCase ? "lower(a.table_name)" : "a.table_name")}={_commonUtils.FormatSql("{0}", tbname[1])}")}"; var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -251,7 +268,7 @@ where a.table_schema in ({0})", databaseIn); } loc8.Append(")"); - sql = string.Format(@" + sql = $@" select concat(a.table_schema, '.', a.table_name), a.column_name, @@ -263,8 +280,8 @@ case when locate('auto_increment', a.extra) > 0 then 1 else 0 end 'is_identity', a.column_comment 'comment', a.column_default 'default_value' from information_schema.columns a -where a.table_schema in ({1}) and {0} -", loc8, databaseIn); +where {(ignoreCase ? "lower(a.table_schema)" : "a.table_schema")} in ({databaseIn}) and {loc8} +"; ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -305,7 +322,7 @@ where a.table_schema in ({1}) and {0} loc3[table_id][column].CsType = this.GetCsTypeInfo(loc3[table_id][column]); } - sql = string.Format(@" + sql = $@" select concat(a.table_schema, '.', a.table_name) 'table_id', a.column_name, @@ -315,8 +332,8 @@ case when a.index_name = 'PRIMARY' then 1 else 0 end 'IsPrimaryKey', 0 'IsClustered', 0 'IsDesc' from information_schema.statistics a -where a.table_schema in ({1}) and {0} -", loc8, databaseIn); +where {(ignoreCase ? "lower(a.table_schema)" : "a.table_schema")} in ({databaseIn}) and {loc8} +"; ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -367,7 +384,9 @@ where a.table_schema in ({1}) and {0} } } - sql = string.Format(@" + if (tbname == null) + { + sql = $@" select concat(a.constraint_schema, '.', a.table_name) 'table_id', a.column_name, @@ -376,43 +395,44 @@ concat(a.referenced_table_schema, '.', a.referenced_table_name) 'ref_table_id', 1 'IsForeignKey', a.referenced_column_name 'ref_column' from information_schema.key_column_usage a -where a.constraint_schema in ({1}) and {0} and not isnull(position_in_unique_constraint) -", loc8, databaseIn); - ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); - if (ds == null) return loc1; +where {(ignoreCase ? "lower(a.constraint_schema)" : "a.constraint_schema")} in ({databaseIn}) and {loc8} and not isnull(position_in_unique_constraint) +"; + ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); + if (ds == null) return loc1; - var fkColumns = new Dictionary>(); - foreach (var row in ds) - { - string table_id = string.Concat(row[0]); - string column = string.Concat(row[1]); - string fk_id = string.Concat(row[2]); - string ref_table_id = string.Concat(row[3]); - bool is_foreign_key = string.Concat(row[4]) == "1"; - string referenced_column = string.Concat(row[5]); - if (database.Length == 1) + var fkColumns = new Dictionary>(); + foreach (var row in ds) { - table_id = table_id.Substring(table_id.IndexOf('.') + 1); - ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1); - } - if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue; - var loc9 = loc3[table_id][column]; - if (loc2.ContainsKey(ref_table_id) == false) continue; - var loc10 = loc2[ref_table_id]; - var loc11 = loc3[ref_table_id][referenced_column]; + string table_id = string.Concat(row[0]); + string column = string.Concat(row[1]); + string fk_id = string.Concat(row[2]); + string ref_table_id = string.Concat(row[3]); + bool is_foreign_key = string.Concat(row[4]) == "1"; + string referenced_column = string.Concat(row[5]); + if (database.Length == 1) + { + table_id = table_id.Substring(table_id.IndexOf('.') + 1); + ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1); + } + if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue; + var loc9 = loc3[table_id][column]; + if (loc2.ContainsKey(ref_table_id) == false) continue; + var loc10 = loc2[ref_table_id]; + var loc11 = loc3[ref_table_id][referenced_column]; - Dictionary loc12 = null; - DbForeignInfo loc13 = null; - if (!fkColumns.TryGetValue(table_id, out loc12)) - fkColumns.Add(table_id, loc12 = new Dictionary()); - if (!loc12.TryGetValue(fk_id, out loc13)) - loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 }); - loc13.Columns.Add(loc9); - loc13.ReferencedColumns.Add(loc11); + Dictionary loc12 = null; + DbForeignInfo loc13 = null; + if (!fkColumns.TryGetValue(table_id, out loc12)) + fkColumns.Add(table_id, loc12 = new Dictionary()); + if (!loc12.TryGetValue(fk_id, out loc13)) + loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 }); + loc13.Columns.Add(loc9); + loc13.ReferencedColumns.Add(loc11); + } + foreach (var table_id in fkColumns.Keys) + foreach (var fk in fkColumns[table_id]) + loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value); } - foreach (var table_id in fkColumns.Keys) - foreach (var fk in fkColumns[table_id]) - loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value); foreach (var table_id in loc3.Keys) { diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengDbFirst.cs b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengDbFirst.cs index 5b3d808f..a7b6d741 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengDbFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengDbFirst.cs @@ -231,21 +231,36 @@ namespace FreeSql.Odbc.Dameng return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; } - public List GetTablesByDatabase(params string[] database2) + public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault(); + public List GetTablesByDatabase(params string[] database) => GetTables(database, null, false); + + public List GetTables(string[] database, string tablename, bool ignoreCase) { var loc1 = new List(); var loc2 = new Dictionary(); var loc3 = new Dictionary>(); - var database = database2?.ToArray(); - - if (database == null || database.Any() == false) + string[] tbname = null; + if (string.IsNullOrEmpty(tablename) == false) + { + tbname = _commonUtils.SplitTableName(tablename); + if (tbname?.Length == 1) + { + var userUsers = _orm.Ado.ExecuteScalar(" select username from user_users")?.ToString(); + if (string.IsNullOrEmpty(userUsers)) return loc1; + tbname = new[] { userUsers, tbname[0] }; + } + if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray(); + database = new[] { tbname[0] }; + } + else if (database == null || database.Any() == false) { var userUsers = _orm.Ado.ExecuteScalar(" select username from user_users")?.ToString(); if (string.IsNullOrEmpty(userUsers)) return loc1; database = new[] { userUsers }; } + var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a))); - var sql = string.Format(@" + var sql = $@" select a.owner || '.' || a.table_name, a.owner, @@ -254,7 +269,7 @@ b.comments, 'TABLE' from all_tables a left join all_tab_comments b on b.owner = a.owner and b.table_name = a.table_name and b.table_type = 'TABLE' -where a.owner in ({0})", databaseIn); +where {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}){(tbname == null ? "" : $" and {(ignoreCase ? "lower(a.table_name)" : "a.table_name")}={_commonUtils.FormatSql("{0}", tbname[1])}")}"; var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -315,7 +330,7 @@ where a.owner in ({0})", databaseIn); } loc8.Append(")"); - sql = string.Format(@" + sql = $@" select a.owner || '.' || a.table_name, a.column_name, @@ -330,8 +345,8 @@ b.comments, a.data_default from all_tab_cols a left join all_col_comments b on b.owner = a.owner and b.table_name = a.table_name and b.column_name = a.column_name -where a.owner in ({1}) and {0} -", loc8, databaseIn); +where {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}) and {loc8} +"; ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -386,7 +401,7 @@ where a.owner in ({1}) and {0} loc3[table_id][column].CsType = this.GetCsTypeInfo(loc3[table_id][column]); } - sql = string.Format(@" + sql = $@" select a.table_owner || '.' || a.table_name, c.column_name, @@ -401,8 +416,8 @@ all_ind_columns c where a.index_name = c.index_name and a.table_owner = c.table_owner and a.table_name = c.table_name -and a.table_owner in ({1}) and {0} -", loc8, databaseIn); +and {(ignoreCase ? "lower(a.table_owner)" : "a.table_owner")} in ({databaseIn}) and {loc8} +"; ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -454,7 +469,9 @@ and a.table_owner in ({1}) and {0} } } - sql = string.Format(@" + if (tbname == null) + { + sql = $@" select a.owner || '.' || a.table_name, c.column_name, @@ -488,43 +505,44 @@ and a.owner = c.owner and a.table_name = c.table_name and b.owner = d.owner and b.table_name = d.table_name -and a.owner in ({1}) and {0} -", loc8, databaseIn); - ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); - if (ds == null) return loc1; +and {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}) and {loc8} +"; + ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); + if (ds == null) return loc1; - var fkColumns = new Dictionary>(); - foreach (var row in ds) - { - string table_id = string.Concat(row[0]); - string column = string.Concat(row[1]); - string fk_id = string.Concat(row[2]); - string ref_table_id = string.Concat(row[3]); - bool is_foreign_key = string.Concat(row[4]) == "1"; - string referenced_column = string.Concat(row[5]); - if (database.Length == 1) + var fkColumns = new Dictionary>(); + foreach (var row in ds) { - table_id = table_id.Substring(table_id.IndexOf('.') + 1); - ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1); - } - if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue; - var loc9 = loc3[table_id][column]; - if (loc2.ContainsKey(ref_table_id) == false) continue; - var loc10 = loc2[ref_table_id]; - var loc11 = loc3[ref_table_id][referenced_column]; + string table_id = string.Concat(row[0]); + string column = string.Concat(row[1]); + string fk_id = string.Concat(row[2]); + string ref_table_id = string.Concat(row[3]); + bool is_foreign_key = string.Concat(row[4]) == "1"; + string referenced_column = string.Concat(row[5]); + if (database.Length == 1) + { + table_id = table_id.Substring(table_id.IndexOf('.') + 1); + ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1); + } + if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue; + var loc9 = loc3[table_id][column]; + if (loc2.ContainsKey(ref_table_id) == false) continue; + var loc10 = loc2[ref_table_id]; + var loc11 = loc3[ref_table_id][referenced_column]; - Dictionary loc12 = null; - DbForeignInfo loc13 = null; - if (!fkColumns.TryGetValue(table_id, out loc12)) - fkColumns.Add(table_id, loc12 = new Dictionary()); - if (!loc12.TryGetValue(fk_id, out loc13)) - loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 }); - loc13.Columns.Add(loc9); - loc13.ReferencedColumns.Add(loc11); + Dictionary loc12 = null; + DbForeignInfo loc13 = null; + if (!fkColumns.TryGetValue(table_id, out loc12)) + fkColumns.Add(table_id, loc12 = new Dictionary()); + if (!loc12.TryGetValue(fk_id, out loc13)) + loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 }); + loc13.Columns.Add(loc9); + loc13.ReferencedColumns.Add(loc11); + } + foreach (var table_id in fkColumns.Keys) + foreach (var fk in fkColumns[table_id]) + loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value); } - foreach (var table_id in fkColumns.Keys) - foreach (var fk in fkColumns[table_id]) - loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value); foreach (var table_id in loc3.Keys) { diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESUpdate.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESUpdate.cs index b0eab467..44f5013d 100644 --- a/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESUpdate.cs @@ -18,7 +18,7 @@ namespace FreeSql.Odbc.KingbaseES { } - internal string InternalTableAlias; + internal string InternalTableAlias { get; set; } internal StringBuilder InternalSbSet => _set; internal StringBuilder InternalSbSetIncr => _setIncr; internal Dictionary InternalIgnore => _ignore; diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESDbFirst.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESDbFirst.cs index b7f0853f..006d7f34 100644 --- a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESDbFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESDbFirst.cs @@ -116,20 +116,31 @@ namespace FreeSql.Odbc.KingbaseES var tbname = _commonUtils.SplitTableName(name); if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] }; if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray(); - var sql = $" select 1 from sys_tables a inner join sys_namespace b on b.nspname = a.schemaname where {(ignoreCase ? "lower(b.nspname)" : "b.nspname")} = {_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(a.tablename)" : "a.tablename")} = {_commonUtils.FormatSql("{0}", tbname[1])}"; + var sql = $" select 1 from sys_tables a inner join sys_namespace b on b.nspname = a.schemaname where {(ignoreCase ? "lower(b.nspname)" : "b.nspname")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(a.tablename)" : "a.tablename")}={_commonUtils.FormatSql("{0}", tbname[1])}"; return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; } - public List GetTablesByDatabase(params string[] database) + public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault(); + public List GetTablesByDatabase(params string[] database) => GetTables(database, null, false); + + public List GetTables(string[] database, string tablename, bool ignoreCase) { var olddatabase = ""; using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5))) { olddatabase = conn.Value.Database; } - var dbs = database == null || database.Any() == false ? new[] { olddatabase } : database; - var tables = new List(); + 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(); foreach (var db in dbs) { if (string.IsNullOrEmpty(db) || string.Compare(db, olddatabase, true) != 0) continue; @@ -139,7 +150,7 @@ namespace FreeSql.Odbc.KingbaseES var loc3 = new Dictionary>(); var sql = $@" -select +{(tbname == null ? "" : $"select * from (")}select b.nspname || '.' || a.tablename, a.schemaname, a.tablename , @@ -165,7 +176,7 @@ inner join sys_namespace b on b.oid = a.relnamespace left join sys_description d on d.objoid = a.oid and objsubid = 0 where b.nspname not in ('SYS_CATALOG', 'INFORMATION_SCHEMA', 'TOPOLOGY', 'SYSAUDIT', 'SYSLOGICAL', 'SYS_TEMP_1', 'SYS_TOAST', 'SYS_TOAST_TEMP_1', 'XLOG_RECORD_READ') and a.relkind in ('m','v') and b.nspname || '.' || a.relname not in ('PUBLIC.GEOGRAPHY_COLUMNS','PUBLIC.GEOMETRY_COLUMNS','PUBLIC.RASTER_COLUMNS','PUBLIC.RASTER_OVERVIEWS') -"; +{(tbname == null ? "" : $") ft_dbf where {(ignoreCase ? "lower(schemaname)" : "schemaname")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(tablename)" : "tablename")}={_commonUtils.FormatSql("{0}", tbname[1])}")}"; var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -381,7 +392,9 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || d.relname") } } - sql = $@" + if (tbname == null) + { + sql = $@" select ns.nspname || '.' || b.relname as table_id, array(select attname from sys_attribute where attrelid = a.conrelid and attnum = any(a.conkey)) as column_name, @@ -398,39 +411,40 @@ inner join sys_namespace ns on ns.oid = b.relnamespace inner join sys_namespace ns2 on ns2.oid = c.relnamespace where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || b.relname")} "; - ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); - if (ds == null) return loc1; + ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); + if (ds == null) return loc1; - var fkColumns = new Dictionary>(); - foreach (object[] row in ds) - { - var table_id = string.Concat(row[0]); - var column = row[1] as string[]; - var fk_id = string.Concat(row[2]); - var ref_table_id = string.Concat(row[3]); - var is_foreign_key = string.Concat(row[4]) == "1"; - var referenced_column = row[5] as string[]; - var referenced_db = string.Concat(row[6]); - var referenced_table = string.Concat(row[7]); - - if (loc2.ContainsKey(ref_table_id) == false) continue; - - Dictionary loc12 = null; - DbForeignInfo loc13 = null; - if (!fkColumns.TryGetValue(table_id, out loc12)) - fkColumns.Add(table_id, loc12 = new Dictionary()); - if (!loc12.TryGetValue(fk_id, out loc13)) - loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc2[ref_table_id] }); - - for (int a = 0; a < column.Length; a++) + var fkColumns = new Dictionary>(); + foreach (object[] row in ds) { - loc13.Columns.Add(loc3[table_id][column[a]]); - loc13.ReferencedColumns.Add(loc3[ref_table_id][referenced_column[a]]); + var table_id = string.Concat(row[0]); + var column = row[1] as string[]; + var fk_id = string.Concat(row[2]); + var ref_table_id = string.Concat(row[3]); + var is_foreign_key = string.Concat(row[4]) == "1"; + var referenced_column = row[5] as string[]; + var referenced_db = string.Concat(row[6]); + var referenced_table = string.Concat(row[7]); + + if (loc2.ContainsKey(ref_table_id) == false) continue; + + Dictionary loc12 = null; + DbForeignInfo loc13 = null; + if (!fkColumns.TryGetValue(table_id, out loc12)) + fkColumns.Add(table_id, loc12 = new Dictionary()); + if (!loc12.TryGetValue(fk_id, out loc13)) + loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc2[ref_table_id] }); + + for (int a = 0; a < column.Length; a++) + { + loc13.Columns.Add(loc3[table_id][column[a]]); + loc13.ReferencedColumns.Add(loc3[ref_table_id][referenced_column[a]]); + } } + foreach (var table_id in fkColumns.Keys) + foreach (var fk in fkColumns[table_id]) + loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value); } - foreach (var table_id in fkColumns.Keys) - foreach (var fk in fkColumns[table_id]) - loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value); foreach (var table_id in loc3.Keys) { diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlDbFirst.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlDbFirst.cs index 07661662..b655037c 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlDbFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlDbFirst.cs @@ -132,14 +132,30 @@ namespace FreeSql.Odbc.MySql return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; } - public List GetTablesByDatabase(params string[] database2) + public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault(); + public List GetTablesByDatabase(params string[] database) => GetTables(database, null, false); + + public List GetTables(string[] database, string tablename, bool ignoreCase) { var loc1 = new List(); var loc2 = new Dictionary(); var loc3 = new Dictionary>(); - var database = database2?.ToArray(); - - if (database == null || database.Any() == false) + string[] tbname = null; + if (string.IsNullOrEmpty(tablename) == false) + { + tbname = _commonUtils.SplitTableName(tablename); + if (tbname?.Length == 1) + { + using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5))) + { + if (string.IsNullOrEmpty(conn.Value.Database)) return loc1; + tbname = new[] { conn.Value.Database, tbname[0] }; + } + } + if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray(); + database = new[] { tbname[0] }; + } + else if (database == null || database.Any() == false) { using (var conn = _orm.Ado.MasterPool.Get()) { @@ -147,8 +163,9 @@ namespace FreeSql.Odbc.MySql database = new[] { conn.Value.Database }; } } + var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a))); - var sql = string.Format(@" + var sql = $@" select concat(a.table_schema, '.', a.table_name) 'id', a.table_schema 'schema', @@ -156,7 +173,7 @@ a.table_name 'table', a.table_comment, a.table_type 'type' from information_schema.tables a -where a.table_schema in ({0})", databaseIn); +where {(ignoreCase ? "lower(a.table_schema)" : "a.table_schema")} in ({databaseIn}){(tbname == null ? "" : $" and {(ignoreCase ? "lower(a.table_name)" : "a.table_name")}={_commonUtils.FormatSql("{0}", tbname[1])}")}"; var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -217,7 +234,7 @@ where a.table_schema in ({0})", databaseIn); } loc8.Append(")"); - sql = string.Format(@" + sql = $@" select concat(a.table_schema, '.', a.table_name), a.column_name, @@ -229,8 +246,8 @@ case when locate('auto_increment', a.extra) > 0 then 1 else 0 end 'is_identity', a.column_comment 'comment', a.column_default 'default_value' from information_schema.columns a -where a.table_schema in ({1}) and {0} -", loc8, databaseIn); +where {(ignoreCase ? "lower(a.table_schema)" : "a.table_schema")} in ({databaseIn}) and {loc8} +"; ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -271,7 +288,7 @@ where a.table_schema in ({1}) and {0} loc3[table_id][column].CsType = this.GetCsTypeInfo(loc3[table_id][column]); } - sql = string.Format(@" + sql = $@" select concat(a.table_schema, '.', a.table_name) 'table_id', a.column_name, @@ -281,8 +298,8 @@ case when a.index_name = 'PRIMARY' then 1 else 0 end 'IsPrimaryKey', 0 'IsClustered', 0 'IsDesc' from information_schema.statistics a -where a.table_schema in ({1}) and {0} -", loc8, databaseIn); +where {(ignoreCase ? "lower(a.table_schema)" : "a.table_schema")} in ({databaseIn}) and {loc8} +"; ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -333,7 +350,9 @@ where a.table_schema in ({1}) and {0} } } - sql = string.Format(@" + if (tbname == null) + { + sql = $@" select concat(a.constraint_schema, '.', a.table_name) 'table_id', a.column_name, @@ -342,43 +361,44 @@ concat(a.referenced_table_schema, '.', a.referenced_table_name) 'ref_table_id', 1 'IsForeignKey', a.referenced_column_name 'ref_column' from information_schema.key_column_usage a -where a.constraint_schema in ({1}) and {0} and not isnull(position_in_unique_constraint) -", loc8, databaseIn); - ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); - if (ds == null) return loc1; +where {(ignoreCase ? "lower(a.constraint_schema)" : "a.constraint_schema")} in ({databaseIn}) and {loc8} and not isnull(position_in_unique_constraint) +"; + ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); + if (ds == null) return loc1; - var fkColumns = new Dictionary>(); - foreach (var row in ds) - { - string table_id = string.Concat(row[0]); - string column = string.Concat(row[1]); - string fk_id = string.Concat(row[2]); - string ref_table_id = string.Concat(row[3]); - bool is_foreign_key = string.Concat(row[4]) == "1"; - string referenced_column = string.Concat(row[5]); - if (database.Length == 1) + var fkColumns = new Dictionary>(); + foreach (var row in ds) { - table_id = table_id.Substring(table_id.IndexOf('.') + 1); - ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1); - } - if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue; - var loc9 = loc3[table_id][column]; - if (loc2.ContainsKey(ref_table_id) == false) continue; - var loc10 = loc2[ref_table_id]; - var loc11 = loc3[ref_table_id][referenced_column]; + string table_id = string.Concat(row[0]); + string column = string.Concat(row[1]); + string fk_id = string.Concat(row[2]); + string ref_table_id = string.Concat(row[3]); + bool is_foreign_key = string.Concat(row[4]) == "1"; + string referenced_column = string.Concat(row[5]); + if (database.Length == 1) + { + table_id = table_id.Substring(table_id.IndexOf('.') + 1); + ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1); + } + if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue; + var loc9 = loc3[table_id][column]; + if (loc2.ContainsKey(ref_table_id) == false) continue; + var loc10 = loc2[ref_table_id]; + var loc11 = loc3[ref_table_id][referenced_column]; - Dictionary loc12 = null; - DbForeignInfo loc13 = null; - if (!fkColumns.TryGetValue(table_id, out loc12)) - fkColumns.Add(table_id, loc12 = new Dictionary()); - if (!loc12.TryGetValue(fk_id, out loc13)) - loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 }); - loc13.Columns.Add(loc9); - loc13.ReferencedColumns.Add(loc11); + Dictionary loc12 = null; + DbForeignInfo loc13 = null; + if (!fkColumns.TryGetValue(table_id, out loc12)) + fkColumns.Add(table_id, loc12 = new Dictionary()); + if (!loc12.TryGetValue(fk_id, out loc13)) + loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 }); + loc13.Columns.Add(loc9); + loc13.ReferencedColumns.Add(loc11); + } + foreach (var table_id in fkColumns.Keys) + foreach (var fk in fkColumns[table_id]) + loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value); } - foreach (var table_id in fkColumns.Keys) - foreach (var fk in fkColumns[table_id]) - loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value); foreach (var table_id in loc3.Keys) { diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleDbFirst.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleDbFirst.cs index f426d221..c9f477cb 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleDbFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleDbFirst.cs @@ -185,21 +185,36 @@ namespace FreeSql.Odbc.Oracle return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; } - public List GetTablesByDatabase(params string[] database2) + public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault(); + public List GetTablesByDatabase(params string[] database) => GetTables(database, null, false); + + public List GetTables(string[] database, string tablename, bool ignoreCase) { var loc1 = new List(); var loc2 = new Dictionary(); var loc3 = new Dictionary>(); - var database = database2?.ToArray(); - - if (database == null || database.Any() == false) + string[] tbname = null; + if (string.IsNullOrEmpty(tablename) == false) + { + tbname = _commonUtils.SplitTableName(tablename); + if (tbname?.Length == 1) + { + var userUsers = _orm.Ado.ExecuteScalar(" select username from user_users")?.ToString(); + if (string.IsNullOrEmpty(userUsers)) return loc1; + tbname = new[] { userUsers, tbname[0] }; + } + if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray(); + database = new[] { tbname[0] }; + } + else if (database == null || database.Any() == false) { var userUsers = _orm.Ado.ExecuteScalar(" select username from user_users")?.ToString(); if (string.IsNullOrEmpty(userUsers)) return loc1; database = new[] { userUsers }; } + var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a))); - var sql = string.Format(@" + var sql = $@" select a.owner || '.' || a.table_name, a.owner, @@ -208,7 +223,7 @@ b.comments, 'TABLE' from all_tables a left join all_tab_comments b on b.owner = a.owner and b.table_name = a.table_name and b.table_type = 'TABLE' -where a.owner in ({0})", databaseIn); +where {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}){(tbname == null ? "" : $" and {(ignoreCase ? "lower(a.table_name)" : "a.table_name")}={_commonUtils.FormatSql("{0}", tbname[1])}")}"; var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -288,7 +303,7 @@ BEGIN RETURN TEXT_C1; END;"); - sql = string.Format(@" + sql = $@" select a.owner || '.' || a.table_name, a.column_name, @@ -303,8 +318,8 @@ to_char(b.comments), nvl(FREESQL_LONG_TO_CHAR_DEFAULT(a.table_name, a.column_name),'') from all_tab_cols a left join all_col_comments b on b.owner = a.owner and b.table_name = a.table_name and b.column_name = a.column_name -where a.owner in ({1}) and {0} -", loc8, databaseIn); +where {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}) and {loc8} +"; ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -360,7 +375,7 @@ where a.owner in ({1}) and {0} } OdbcOracleCodeFirst.CreateOracleFunction(_orm); - sql = string.Format(@" + sql = $@" select a.table_owner || '.' || a.table_name, nvl(freesql_long_2_varchar(a.index_name, c.table_name, c.column_position), c.column_name), @@ -375,8 +390,8 @@ all_ind_columns c where a.index_name = c.index_name and a.table_owner = c.table_owner and a.table_name = c.table_name -and a.table_owner in ({1}) and {0} -", loc8, databaseIn); +and {(ignoreCase ? "lower(a.table_owner)" : "a.table_owner")} in ({databaseIn}) and {loc8} +"; ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -428,7 +443,9 @@ and a.table_owner in ({1}) and {0} } } - sql = string.Format(@" + if (tbname == null) + { + sql = $@" select a.owner || '.' || a.table_name, c.column_name, @@ -462,43 +479,44 @@ and a.owner = c.owner    and a.table_name = c.table_name    and b.owner = d.owner    and b.table_name = d.table_name -and a.owner in ({1}) and {0} -", loc8, databaseIn); - ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); - if (ds == null) return loc1; +and {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}) and {loc8} +"; + ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); + if (ds == null) return loc1; - var fkColumns = new Dictionary>(); - foreach (var row in ds) - { - string table_id = string.Concat(row[0]); - string column = string.Concat(row[1]); - string fk_id = string.Concat(row[2]); - string ref_table_id = string.Concat(row[3]); - bool is_foreign_key = string.Concat(row[4]) == "1"; - string referenced_column = string.Concat(row[5]); - if (database.Length == 1) + var fkColumns = new Dictionary>(); + foreach (var row in ds) { - table_id = table_id.Substring(table_id.IndexOf('.') + 1); - ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1); - } - if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue; - var loc9 = loc3[table_id][column]; - if (loc2.ContainsKey(ref_table_id) == false) continue; - var loc10 = loc2[ref_table_id]; - var loc11 = loc3[ref_table_id][referenced_column]; + string table_id = string.Concat(row[0]); + string column = string.Concat(row[1]); + string fk_id = string.Concat(row[2]); + string ref_table_id = string.Concat(row[3]); + bool is_foreign_key = string.Concat(row[4]) == "1"; + string referenced_column = string.Concat(row[5]); + if (database.Length == 1) + { + table_id = table_id.Substring(table_id.IndexOf('.') + 1); + ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1); + } + if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue; + var loc9 = loc3[table_id][column]; + if (loc2.ContainsKey(ref_table_id) == false) continue; + var loc10 = loc2[ref_table_id]; + var loc11 = loc3[ref_table_id][referenced_column]; - Dictionary loc12 = null; - DbForeignInfo loc13 = null; - if (!fkColumns.TryGetValue(table_id, out loc12)) - fkColumns.Add(table_id, loc12 = new Dictionary()); - if (!loc12.TryGetValue(fk_id, out loc13)) - loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 }); - loc13.Columns.Add(loc9); - loc13.ReferencedColumns.Add(loc11); + Dictionary loc12 = null; + DbForeignInfo loc13 = null; + if (!fkColumns.TryGetValue(table_id, out loc12)) + fkColumns.Add(table_id, loc12 = new Dictionary()); + if (!loc12.TryGetValue(fk_id, out loc13)) + loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 }); + loc13.Columns.Add(loc9); + loc13.ReferencedColumns.Add(loc11); + } + foreach (var table_id in fkColumns.Keys) + foreach (var fk in fkColumns[table_id]) + loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value); } - foreach (var table_id in fkColumns.Keys) - foreach (var fk in fkColumns[table_id]) - loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value); foreach (var table_id in loc3.Keys) { diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLUpdate.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLUpdate.cs index f4c2cbc2..b713b56b 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLUpdate.cs @@ -18,7 +18,7 @@ namespace FreeSql.Odbc.PostgreSQL { } - internal string InternalTableAlias; + internal string InternalTableAlias { get; set; } internal StringBuilder InternalSbSet => _set; internal StringBuilder InternalSbSetIncr => _setIncr; internal Dictionary InternalIgnore => _ignore; diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLDbFirst.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLDbFirst.cs index e3e66b20..ef6fc7bf 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLDbFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLDbFirst.cs @@ -128,11 +128,14 @@ namespace FreeSql.Odbc.PostgreSQL var tbname = _commonUtils.SplitTableName(name); if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] }; if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray(); - var sql = $" select 1 from pg_tables a inner join pg_namespace b on b.nspname = a.schemaname where {(ignoreCase ? "lower(b.nspname)" : "b.nspname")} = {_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(a.tablename)" : "a.tablename")} = {_commonUtils.FormatSql("{0}", tbname[1])}"; + var sql = $" select 1 from pg_tables a inner join pg_namespace b on b.nspname = a.schemaname where {(ignoreCase ? "lower(b.nspname)" : "b.nspname")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(a.tablename)" : "a.tablename")}={_commonUtils.FormatSql("{0}", tbname[1])}"; return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; } - public List GetTablesByDatabase(params string[] database) + public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault(); + public List GetTablesByDatabase(params string[] database) => GetTables(database, null, false); + + public List GetTables(string[] database, string tablename, bool ignoreCase) { var olddatabase = ""; var is96 = true; @@ -141,7 +144,15 @@ namespace FreeSql.Odbc.PostgreSQL olddatabase = conn.Value.Database; is96 = PgVersionIs96(conn.Value.ServerVersion); } - var dbs = database == null || database.Any() == false ? new[] { olddatabase } : database; + string[] tbname = null; + string[] dbs = database == null || database.Any() == false ? new[] { olddatabase } : database; + if (string.IsNullOrEmpty(tablename) == false) + { + tbname = _commonUtils.SplitTableName(tablename); + if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] }; + if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray(); + dbs = new[] { olddatabase }; + } var tables = new List(); foreach (var db in dbs) @@ -153,7 +164,7 @@ namespace FreeSql.Odbc.PostgreSQL var loc3 = new Dictionary>(); var sql = $@" -select +{(tbname == null ? "" : $"select * from (")}select b.nspname || '.' || a.tablename, a.schemaname, a.tablename , @@ -179,7 +190,7 @@ inner join pg_namespace b on b.oid = a.relnamespace left join pg_description d on d.objoid = a.oid and objsubid = 0 where b.nspname not in ('pg_catalog', 'information_schema') and a.relkind in ('m','v') and b.nspname || '.' || a.relname not in ('public.geography_columns','public.geometry_columns','public.raster_columns','public.raster_overviews') -"; +{(tbname == null ? "" : $") ft_dbf where {(ignoreCase ? "lower(schemaname)" : "schemaname")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(tablename)" : "tablename")}={_commonUtils.FormatSql("{0}", tbname[1])}")}"; var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -396,7 +407,9 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || d.relname") } } - sql = $@" + if (tbname == null) + { + sql = $@" select ns.nspname || '.' || b.relname as table_id, array(select attname from pg_attribute where attrelid = a.conrelid and attnum = any(a.conkey)) as column_name, @@ -413,39 +426,40 @@ inner join pg_namespace ns on ns.oid = b.relnamespace inner join pg_namespace ns2 on ns2.oid = c.relnamespace where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || b.relname")} "; - ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); - if (ds == null) return loc1; + ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); + if (ds == null) return loc1; - var fkColumns = new Dictionary>(); - foreach (object[] row in ds) - { - var table_id = string.Concat(row[0]); - var column = row[1] as string[]; - var fk_id = string.Concat(row[2]); - var ref_table_id = string.Concat(row[3]); - var is_foreign_key = string.Concat(row[4]) == "1"; - var referenced_column = row[5] as string[]; - var referenced_db = string.Concat(row[6]); - var referenced_table = string.Concat(row[7]); - - if (loc2.ContainsKey(ref_table_id) == false) continue; - - Dictionary loc12 = null; - DbForeignInfo loc13 = null; - if (!fkColumns.TryGetValue(table_id, out loc12)) - fkColumns.Add(table_id, loc12 = new Dictionary()); - if (!loc12.TryGetValue(fk_id, out loc13)) - loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc2[ref_table_id] }); - - for (int a = 0; a < column.Length; a++) + var fkColumns = new Dictionary>(); + foreach (object[] row in ds) { - loc13.Columns.Add(loc3[table_id][column[a]]); - loc13.ReferencedColumns.Add(loc3[ref_table_id][referenced_column[a]]); + var table_id = string.Concat(row[0]); + var column = row[1] as string[]; + var fk_id = string.Concat(row[2]); + var ref_table_id = string.Concat(row[3]); + var is_foreign_key = string.Concat(row[4]) == "1"; + var referenced_column = row[5] as string[]; + var referenced_db = string.Concat(row[6]); + var referenced_table = string.Concat(row[7]); + + if (loc2.ContainsKey(ref_table_id) == false) continue; + + Dictionary loc12 = null; + DbForeignInfo loc13 = null; + if (!fkColumns.TryGetValue(table_id, out loc12)) + fkColumns.Add(table_id, loc12 = new Dictionary()); + if (!loc12.TryGetValue(fk_id, out loc13)) + loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc2[ref_table_id] }); + + for (int a = 0; a < column.Length; a++) + { + loc13.Columns.Add(loc3[table_id][column[a]]); + loc13.ReferencedColumns.Add(loc3[ref_table_id][referenced_column[a]]); + } } + foreach (var table_id in fkColumns.Keys) + foreach (var fk in fkColumns[table_id]) + loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value); } - foreach (var table_id in fkColumns.Keys) - foreach (var fk in fkColumns[table_id]) - loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value); foreach (var table_id in loc3.Keys) { diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerDbFirst.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerDbFirst.cs index d958b0bb..146936a0 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerDbFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerDbFirst.cs @@ -7,7 +7,6 @@ using System.Data; using System.Data.Odbc; using System.Linq; using System.Text; -using System.Text.RegularExpressions; namespace FreeSql.Odbc.SqlServer { @@ -125,21 +124,32 @@ select 1 from sys.tables a inner join sys.schemas b on b.schema_id = a.schema_id -where lower(b.name) = {_commonUtils.FormatSql("{0}", tbname[1])} and lower(a.name) = {_commonUtils.FormatSql("{0}", tbname[2])} +where lower(b.name)={_commonUtils.FormatSql("{0}", tbname[1])} and lower(a.name)={_commonUtils.FormatSql("{0}", tbname[2])} ; use [{olddatabase}]; "; return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; } + public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault(); + public List GetTablesByDatabase(params string[] database) => GetTables(database, null, false); - public List GetTablesByDatabase(params string[] database) + public List GetTables(string[] database, string tablename, bool ignoreCase) { var olddatabase = ""; using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5))) { olddatabase = conn.Value.Database; } - var dbs = database == null || database.Any() == false ? new[] { olddatabase } : database; + string[] tbname = null; + string[] dbs = database == null || database.Any() == false ? new[] { olddatabase } : database; + if (string.IsNullOrEmpty(tablename) == false) + { + tbname = _commonUtils.SplitTableName(tablename); + if (tbname?.Length == 1) tbname = new[] { olddatabase, "dbo", tbname[0] }; + if (tbname?.Length == 2) tbname = new[] { olddatabase, tbname[0], tbname[1] }; + tbname = tbname.Select(a => a.ToLower()).ToArray(); + dbs = new[] { tbname[0] }; + } var tables = new List(); foreach (var db in dbs) @@ -152,6 +162,7 @@ use [{olddatabase}]; var sql = $@" use [{db}]; +select * from ( select a.Object_id ,b.name 'Owner' @@ -180,8 +191,8 @@ select from sys.procedures a inner join sys.schemas b on b.schema_id = a.schema_id where a.type = 'P' and charindex('diagram', a.name) = 0 -order by type desc, b.name, a.name -; +) ft_dbf{(tbname == null ? "" : _commonUtils.FormatSql(" where lower([owner])={0} and lower([Name])={1}", new[] { tbname[1], tbname[2] }))} +order by type desc, [owner], [Name]; use [{olddatabase}]; "; var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); @@ -264,7 +275,7 @@ isnull(e.name,'') + '.' + isnull(d.name,'') else cast(a.max_length as varchar) end + ')' when b.name in ('Numeric', 'Decimal') then '(' + cast(a.precision as varchar) + ',' + cast(a.scale as varchar) + ')' else '' end as 'SqlType' -,(select value from sys.extended_properties where major_id = a.object_id AND minor_id = a.column_id AND name = 'MS_Description') 'Comment' +,( select value from sys.extended_properties where major_id = a.object_id AND minor_id = a.column_id AND name = 'MS_Description') 'Comment' {0} a inner join sys.types b on b.user_type_id = a.user_type_id left join sys.tables d on d.object_id = a.object_id @@ -392,7 +403,9 @@ use [{olddatabase}]; } } - sql = $@" + if (tbname == null) + { + sql = $@" use [{db}]; select b.object_id 'Object_id' @@ -412,47 +425,48 @@ where {loc8.ToString().Replace("a.table_name", "b.object_id")} ; use [{olddatabase}]; "; - ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); - if (ds == null) return loc1; + ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); + if (ds == null) return loc1; - var fkColumns = new Dictionary>(); - foreach (object[] row in ds) - { - int object_id, referenced_object_id; - int.TryParse(string.Concat(row[0]), out object_id); - var column = string.Concat(row[1]); - string fk_id = string.Concat(row[2]); - int.TryParse(string.Concat(row[3]), out referenced_object_id); - var is_foreign_key = bool.Parse(string.Concat(row[4])); - var referenced_column = string.Concat(row[5]); - var referenced_db = string.Concat(row[6]); - var referenced_table = string.Concat(row[7]); - DbColumnInfo loc9 = loc3[object_id][column]; - DbTableInfo loc10 = null; - DbColumnInfo loc11 = null; - bool isThisSln = referenced_object_id != 0; - - if (isThisSln) - { - loc10 = loc2[referenced_object_id]; - loc11 = loc3[referenced_object_id][referenced_column]; - } - else + var fkColumns = new Dictionary>(); + foreach (object[] row in ds) { + int object_id, referenced_object_id; + int.TryParse(string.Concat(row[0]), out object_id); + var column = string.Concat(row[1]); + string fk_id = string.Concat(row[2]); + int.TryParse(string.Concat(row[3]), out referenced_object_id); + var is_foreign_key = bool.Parse(string.Concat(row[4])); + var referenced_column = string.Concat(row[5]); + var referenced_db = string.Concat(row[6]); + var referenced_table = string.Concat(row[7]); + DbColumnInfo loc9 = loc3[object_id][column]; + DbTableInfo loc10 = null; + DbColumnInfo loc11 = null; + bool isThisSln = referenced_object_id != 0; + if (isThisSln) + { + loc10 = loc2[referenced_object_id]; + loc11 = loc3[referenced_object_id][referenced_column]; + } + else + { + + } + Dictionary loc12 = null; + DbForeignInfo loc13 = null; + if (!fkColumns.TryGetValue(object_id, out loc12)) + fkColumns.Add(object_id, loc12 = new Dictionary()); + if (!loc12.TryGetValue(fk_id, out loc13)) + loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[object_id], ReferencedTable = loc10 }); + loc13.Columns.Add(loc9); + loc13.ReferencedColumns.Add(loc11); } - Dictionary loc12 = null; - DbForeignInfo loc13 = null; - if (!fkColumns.TryGetValue(object_id, out loc12)) - fkColumns.Add(object_id, loc12 = new Dictionary()); - if (!loc12.TryGetValue(fk_id, out loc13)) - loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[object_id], ReferencedTable = loc10 }); - loc13.Columns.Add(loc9); - loc13.ReferencedColumns.Add(loc11); + foreach (var table_id in fkColumns.Keys) + foreach (var fk in fkColumns[table_id]) + loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value); } - foreach (var table_id in fkColumns.Keys) - foreach (var fk in fkColumns[table_id]) - loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value); foreach (var table_id in loc3.Keys) { diff --git a/Providers/FreeSql.Provider.Oracle/OracleDbFirst.cs b/Providers/FreeSql.Provider.Oracle/OracleDbFirst.cs index f8e7e3d1..2231f27a 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleDbFirst.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleDbFirst.cs @@ -185,21 +185,36 @@ namespace FreeSql.Oracle return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; } - public List GetTablesByDatabase(params string[] database2) + public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault(); + public List GetTablesByDatabase(params string[] database) => GetTables(database, null, false); + + public List GetTables(string[] database, string tablename, bool ignoreCase) { var loc1 = new List(); var loc2 = new Dictionary(); var loc3 = new Dictionary>(); - var database = database2?.ToArray(); - - if (database == null || database.Any() == false) + string[] tbname = null; + if (string.IsNullOrEmpty(tablename) == false) + { + tbname = _commonUtils.SplitTableName(tablename); + if (tbname?.Length == 1) + { + var userUsers = _orm.Ado.ExecuteScalar(" select username from user_users")?.ToString(); + if (string.IsNullOrEmpty(userUsers)) return loc1; + tbname = new[] { userUsers, tbname[0] }; + } + if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray(); + database = new[] { tbname[0] }; + } + else if (database == null || database.Any() == false) { var userUsers = _orm.Ado.ExecuteScalar(" select username from user_users")?.ToString(); if (string.IsNullOrEmpty(userUsers)) return loc1; database = new[] { userUsers }; } + var databaseIn = string.Join(",", database.Select(a => _commonUtils.FormatSql("{0}", a))); - var sql = string.Format(@" + var sql = $@" select a.owner || '.' || a.table_name, a.owner, @@ -208,7 +223,7 @@ b.comments, 'TABLE' from all_tables a left join all_tab_comments b on b.owner = a.owner and b.table_name = a.table_name and b.table_type = 'TABLE' -where a.owner in ({0})", databaseIn); +where {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}){(tbname == null ? "" : $" and {(ignoreCase ? "lower(a.table_name)" : "a.table_name")}={_commonUtils.FormatSql("{0}", tbname[1])}")}"; var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -288,7 +303,7 @@ BEGIN RETURN TEXT_C1; END;"); - sql = string.Format(@" + sql = $@" select a.owner || '.' || a.table_name, a.column_name, @@ -303,8 +318,8 @@ to_char(b.comments), nvl(FREESQL_LONG_TO_CHAR_DEFAULT(a.table_name, a.column_name),'') from all_tab_cols a left join all_col_comments b on b.owner = a.owner and b.table_name = a.table_name and b.column_name = a.column_name -where a.owner in ({1}) and {0} -", loc8, databaseIn); +where {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}) and {loc8} +"; ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -360,7 +375,7 @@ where a.owner in ({1}) and {0} } OracleCodeFirst.CreateOracleFunction(_orm); - sql = string.Format(@" + sql = $@" select a.table_owner || '.' || a.table_name, nvl(freesql_long_2_varchar(a.index_name, c.table_name, c.column_position), c.column_name), @@ -375,8 +390,8 @@ all_ind_columns c where a.index_name = c.index_name and a.table_owner = c.table_owner and a.table_name = c.table_name -and a.table_owner in ({1}) and {0} -", loc8, databaseIn); +and {(ignoreCase ? "lower(a.table_owner)" : "a.table_owner")} in ({databaseIn}) and {loc8} +"; ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -428,7 +443,9 @@ and a.table_owner in ({1}) and {0} } } - sql = string.Format(@" + if (tbname == null) + { + sql = $@" select a.owner || '.' || a.table_name, c.column_name, @@ -462,43 +479,44 @@ and a.owner = c.owner    and a.table_name = c.table_name    and b.owner = d.owner    and b.table_name = d.table_name -and a.owner in ({1}) and {0} -", loc8, databaseIn); - ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); - if (ds == null) return loc1; +and {(ignoreCase ? "lower(a.owner)" : "a.owner")} in ({databaseIn}) and {loc8} +"; + ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); + if (ds == null) return loc1; - var fkColumns = new Dictionary>(); - foreach (var row in ds) - { - string table_id = string.Concat(row[0]); - string column = string.Concat(row[1]); - string fk_id = string.Concat(row[2]); - string ref_table_id = string.Concat(row[3]); - bool is_foreign_key = string.Concat(row[4]) == "1"; - string referenced_column = string.Concat(row[5]); - if (database.Length == 1) + var fkColumns = new Dictionary>(); + foreach (var row in ds) { - table_id = table_id.Substring(table_id.IndexOf('.') + 1); - ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1); - } - if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue; - var loc9 = loc3[table_id][column]; - if (loc2.ContainsKey(ref_table_id) == false) continue; - var loc10 = loc2[ref_table_id]; - var loc11 = loc3[ref_table_id][referenced_column]; + string table_id = string.Concat(row[0]); + string column = string.Concat(row[1]); + string fk_id = string.Concat(row[2]); + string ref_table_id = string.Concat(row[3]); + bool is_foreign_key = string.Concat(row[4]) == "1"; + string referenced_column = string.Concat(row[5]); + if (database.Length == 1) + { + table_id = table_id.Substring(table_id.IndexOf('.') + 1); + ref_table_id = ref_table_id.Substring(ref_table_id.IndexOf('.') + 1); + } + if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue; + var loc9 = loc3[table_id][column]; + if (loc2.ContainsKey(ref_table_id) == false) continue; + var loc10 = loc2[ref_table_id]; + var loc11 = loc3[ref_table_id][referenced_column]; - Dictionary loc12 = null; - DbForeignInfo loc13 = null; - if (!fkColumns.TryGetValue(table_id, out loc12)) - fkColumns.Add(table_id, loc12 = new Dictionary()); - if (!loc12.TryGetValue(fk_id, out loc13)) - loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 }); - loc13.Columns.Add(loc9); - loc13.ReferencedColumns.Add(loc11); + Dictionary loc12 = null; + DbForeignInfo loc13 = null; + if (!fkColumns.TryGetValue(table_id, out loc12)) + fkColumns.Add(table_id, loc12 = new Dictionary()); + if (!loc12.TryGetValue(fk_id, out loc13)) + loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 }); + loc13.Columns.Add(loc9); + loc13.ReferencedColumns.Add(loc11); + } + foreach (var table_id in fkColumns.Keys) + foreach (var fk in fkColumns[table_id]) + loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value); } - foreach (var table_id in fkColumns.Keys) - foreach (var fk in fkColumns[table_id]) - loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value); foreach (var table_id in loc3.Keys) { diff --git a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLUpdate.cs b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLUpdate.cs index cc74c1d1..6991e799 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLUpdate.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLUpdate.cs @@ -18,7 +18,7 @@ namespace FreeSql.PostgreSQL.Curd { } - internal string InternalTableAlias; + internal string InternalTableAlias { get; set; } internal StringBuilder InternalSbSet => _set; internal StringBuilder InternalSbSetIncr => _setIncr; internal Dictionary InternalIgnore => _ignore; diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLDbFirst.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLDbFirst.cs index b5681333..96ebf9bb 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLDbFirst.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLDbFirst.cs @@ -238,11 +238,14 @@ namespace FreeSql.PostgreSQL var tbname = _commonUtils.SplitTableName(name); if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] }; if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray(); - var sql = $" select 1 from pg_tables a inner join pg_namespace b on b.nspname = a.schemaname where {(ignoreCase ? "lower(b.nspname)" : "b.nspname")} = {_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(a.tablename)" : "a.tablename")} = {_commonUtils.FormatSql("{0}", tbname[1])}"; + var sql = $" select 1 from pg_tables a inner join pg_namespace b on b.nspname = a.schemaname where {(ignoreCase ? "lower(b.nspname)" : "b.nspname")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(a.tablename)" : "a.tablename")}={_commonUtils.FormatSql("{0}", tbname[1])}"; return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; } - public List GetTablesByDatabase(params string[] database) + public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault(); + public List GetTablesByDatabase(params string[] database) => GetTables(database, null, false); + + public List GetTables(string[] database, string tablename, bool ignoreCase) { var olddatabase = ""; var is96 = true; @@ -251,7 +254,15 @@ namespace FreeSql.PostgreSQL olddatabase = conn.Value.Database; is96 = PgVersionIs96(conn.Value.ServerVersion); } - var dbs = database == null || database.Any() == false ? new[] { olddatabase } : database; + string[] tbname = null; + string[] dbs = database == null || database.Any() == false ? new[] { olddatabase } : database; + if (string.IsNullOrEmpty(tablename) == false) + { + tbname = _commonUtils.SplitTableName(tablename); + if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] }; + if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray(); + dbs = new[] { olddatabase }; + } var tables = new List(); foreach (var db in dbs) @@ -263,7 +274,7 @@ namespace FreeSql.PostgreSQL var loc3 = new Dictionary>(); var sql = $@" -select +{(tbname == null ? "" : $"select * from (")}select b.nspname || '.' || a.tablename, a.schemaname, a.tablename , @@ -289,7 +300,7 @@ inner join pg_namespace b on b.oid = a.relnamespace left join pg_description d on d.objoid = a.oid and objsubid = 0 where b.nspname not in ('pg_catalog', 'information_schema') and a.relkind in ('m','v') and b.nspname || '.' || a.relname not in ('public.geography_columns','public.geometry_columns','public.raster_columns','public.raster_overviews') -"; +{(tbname == null ? "" : $") ft_dbf where {(ignoreCase ? "lower(schemaname)" : "schemaname")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(tablename)" : "tablename")}={_commonUtils.FormatSql("{0}", tbname[1])}")}"; var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -506,7 +517,9 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || d.relname") } } - sql = $@" + if (tbname == null) + { + sql = $@" select ns.nspname || '.' || b.relname as table_id, array(select attname from pg_attribute where attrelid = a.conrelid and attnum = any(a.conkey)) as column_name, @@ -523,39 +536,40 @@ inner join pg_namespace ns on ns.oid = b.relnamespace inner join pg_namespace ns2 on ns2.oid = c.relnamespace where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || b.relname")} "; - ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); - if (ds == null) return loc1; + ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); + if (ds == null) return loc1; - var fkColumns = new Dictionary>(); - foreach (object[] row in ds) - { - var table_id = string.Concat(row[0]); - var column = row[1] as string[]; - var fk_id = string.Concat(row[2]); - var ref_table_id = string.Concat(row[3]); - var is_foreign_key = string.Concat(row[4]) == "1"; - var referenced_column = row[5] as string[]; - var referenced_db = string.Concat(row[6]); - var referenced_table = string.Concat(row[7]); - - if (loc2.ContainsKey(ref_table_id) == false) continue; - - Dictionary loc12 = null; - DbForeignInfo loc13 = null; - if (!fkColumns.TryGetValue(table_id, out loc12)) - fkColumns.Add(table_id, loc12 = new Dictionary()); - if (!loc12.TryGetValue(fk_id, out loc13)) - loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc2[ref_table_id] }); - - for (int a = 0; a < column.Length; a++) + var fkColumns = new Dictionary>(); + foreach (object[] row in ds) { - loc13.Columns.Add(loc3[table_id][column[a]]); - loc13.ReferencedColumns.Add(loc3[ref_table_id][referenced_column[a]]); + var table_id = string.Concat(row[0]); + var column = row[1] as string[]; + var fk_id = string.Concat(row[2]); + var ref_table_id = string.Concat(row[3]); + var is_foreign_key = string.Concat(row[4]) == "1"; + var referenced_column = row[5] as string[]; + var referenced_db = string.Concat(row[6]); + var referenced_table = string.Concat(row[7]); + + if (loc2.ContainsKey(ref_table_id) == false) continue; + + Dictionary loc12 = null; + DbForeignInfo loc13 = null; + if (!fkColumns.TryGetValue(table_id, out loc12)) + fkColumns.Add(table_id, loc12 = new Dictionary()); + if (!loc12.TryGetValue(fk_id, out loc13)) + loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc2[ref_table_id] }); + + for (int a = 0; a < column.Length; a++) + { + loc13.Columns.Add(loc3[table_id][column[a]]); + loc13.ReferencedColumns.Add(loc3[ref_table_id][referenced_column[a]]); + } } + foreach (var table_id in fkColumns.Keys) + foreach (var fk in fkColumns[table_id]) + loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value); } - foreach (var table_id in fkColumns.Keys) - foreach (var fk in fkColumns[table_id]) - loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value); foreach (var table_id in loc3.Keys) { diff --git a/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongUpdate.cs b/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongUpdate.cs index 97ce5c1f..c5ca315e 100644 --- a/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongUpdate.cs +++ b/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongUpdate.cs @@ -19,7 +19,7 @@ namespace FreeSql.ShenTong.Curd { } - internal string InternalTableAlias; + internal string InternalTableAlias { get; set; } internal StringBuilder InternalSbSet => _set; internal StringBuilder InternalSbSetIncr => _setIncr; internal Dictionary InternalIgnore => _ignore; diff --git a/Providers/FreeSql.Provider.ShenTong/ShenTongDbFirst.cs b/Providers/FreeSql.Provider.ShenTong/ShenTongDbFirst.cs index 1d573b84..0f9ce722 100644 --- a/Providers/FreeSql.Provider.ShenTong/ShenTongDbFirst.cs +++ b/Providers/FreeSql.Provider.ShenTong/ShenTongDbFirst.cs @@ -134,19 +134,30 @@ select 1 from sys_class a inner join sys_namespace b on b.oid = a.relnamespace -where {(ignoreCase ? "lower(b.nspname)" : "b.nspname")} = {_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(a.relname)" : "a.relname")} = {_commonUtils.FormatSql("{0}", tbname[1])} and a.relkind in ('r') +where {(ignoreCase ? "lower(b.nspname)" : "b.nspname")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(a.relname)" : "a.relname")}={_commonUtils.FormatSql("{0}", tbname[1])} and a.relkind in ('r') "; return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; } - public List GetTablesByDatabase(params string[] database) + public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault(); + public List GetTablesByDatabase(params string[] database) => GetTables(database, null, false); + + public List GetTables(string[] database, string tablename, bool ignoreCase) { var olddatabase = ""; using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5))) { olddatabase = conn.Value.Database; } - var dbs = database == null || database.Any() == false ? new[] { olddatabase } : database; + string[] tbname = null; + string[] dbs = database == null || database.Any() == false ? new[] { olddatabase } : database; + if (string.IsNullOrEmpty(tablename) == false) + { + tbname = _commonUtils.SplitTableName(tablename); + if (tbname?.Length == 1) tbname = new[] { "PUBLIC", tbname[0] }; + if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray(); + dbs = new[] { olddatabase }; + } var tables = new List(); foreach (var db in dbs) @@ -158,7 +169,7 @@ where {(ignoreCase ? "lower(b.nspname)" : "b.nspname")} = {_commonUtils.FormatSq var loc3 = new Dictionary>(); var sql = $@" -select +{(tbname == null ? "" : $"select * from (")}select b.nspname || '.' || a.relname, b.nspname, a.relname, @@ -183,7 +194,7 @@ inner join sys_namespace b on b.oid = a.relnamespace left join sys_description d on d.objoid = a.oid and objsubid = 0 where b.nspname not in ('DIRECTORIES', 'INFO_SCHEM', 'REPLICATION', 'STAGENT', 'SYSAUDIT', 'SYSDBA', 'SYSFTSDBA', 'SYSSECURE', 'SYS_GLOBAL_TEMP', 'WMSYS') and a.relkind in ('m','v') and b.nspname || '.' || a.relname not in ('PUBLIC.GEOGRAPHY_COLUMNS','PUBLIC.GEOMETRY_COLUMNS','PUBLIC.RASTER_COLUMNS','PUBLIC.RASTER_OVERVIEWS','PUBLIC.DBA_JOBS') -"; +{(tbname == null ? "" : $") ft_dbf where {(ignoreCase ? "lower(nspname)" : "nspname")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(relname)" : "relname")}={_commonUtils.FormatSql("{0}", tbname[1])}")}"; var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -400,7 +411,9 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || d.relname") } } - sql = $@" + if (tbname == null) + { + sql = $@" select a.pktable_schem || '.' || a.pktable_name, a.pkcolumn_name, @@ -411,36 +424,37 @@ a.fkcolumn_name from v_sys_foreign_keys a where {loc8.ToString().Replace("a.table_name", "a.pktable_schem || '.' || a.pktable_name")} "; - ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); - if (ds == null) return loc1; + ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); + if (ds == null) return loc1; - var fkColumns = new Dictionary>(); - foreach (var row in ds) - { - string table_id = string.Concat(row[0]); - string column = string.Concat(row[1]); - string fk_id = string.Concat(row[2]); - string ref_table_id = string.Concat(row[3]); - bool is_foreign_key = string.Concat(row[4]) == "1"; - string referenced_column = string.Concat(row[5]); - if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue; - var loc9 = loc3[table_id][column]; - if (loc2.ContainsKey(ref_table_id) == false) continue; - var loc10 = loc2[ref_table_id]; - var loc11 = loc3[ref_table_id][referenced_column]; + var fkColumns = new Dictionary>(); + foreach (var row in ds) + { + string table_id = string.Concat(row[0]); + string column = string.Concat(row[1]); + string fk_id = string.Concat(row[2]); + string ref_table_id = string.Concat(row[3]); + bool is_foreign_key = string.Concat(row[4]) == "1"; + string referenced_column = string.Concat(row[5]); + if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue; + var loc9 = loc3[table_id][column]; + if (loc2.ContainsKey(ref_table_id) == false) continue; + var loc10 = loc2[ref_table_id]; + var loc11 = loc3[ref_table_id][referenced_column]; - Dictionary loc12 = null; - DbForeignInfo loc13 = null; - if (!fkColumns.TryGetValue(table_id, out loc12)) - fkColumns.Add(table_id, loc12 = new Dictionary()); - if (!loc12.TryGetValue(fk_id, out loc13)) - loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 }); - loc13.Columns.Add(loc9); - loc13.ReferencedColumns.Add(loc11); + Dictionary loc12 = null; + DbForeignInfo loc13 = null; + if (!fkColumns.TryGetValue(table_id, out loc12)) + fkColumns.Add(table_id, loc12 = new Dictionary()); + if (!loc12.TryGetValue(fk_id, out loc13)) + loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 }); + loc13.Columns.Add(loc9); + loc13.ReferencedColumns.Add(loc11); + } + foreach (var table_id in fkColumns.Keys) + foreach (var fk in fkColumns[table_id]) + loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value); } - foreach (var table_id in fkColumns.Keys) - foreach (var fk in fkColumns[table_id]) - loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value); foreach (var table_id in loc3.Keys) { diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerDbFirst.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerDbFirst.cs index f376bf61..36459b46 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerDbFirst.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerDbFirst.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; -using System.Text.RegularExpressions; namespace FreeSql.SqlServer { @@ -128,21 +127,32 @@ select 1 from sys.tables a inner join sys.schemas b on b.schema_id = a.schema_id -where lower(b.name) = {_commonUtils.FormatSql("{0}", tbname[1])} and lower(a.name) = {_commonUtils.FormatSql("{0}", tbname[2])} +where lower(b.name)={_commonUtils.FormatSql("{0}", tbname[1])} and lower(a.name)={_commonUtils.FormatSql("{0}", tbname[2])} ; use [{olddatabase}]; "; return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; } + public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault(); + public List GetTablesByDatabase(params string[] database) => GetTables(database, null, false); - public List GetTablesByDatabase(params string[] database) + public List GetTables(string[] database, string tablename, bool ignoreCase) { var olddatabase = ""; using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5))) { olddatabase = conn.Value.Database; } - var dbs = database == null || database.Any() == false ? new[] { olddatabase } : database; + string[] tbname = null; + string[] dbs = database == null || database.Any() == false ? new[] { olddatabase } : database; + if (string.IsNullOrEmpty(tablename) == false) + { + tbname = _commonUtils.SplitTableName(tablename); + if (tbname?.Length == 1) tbname = new[] { olddatabase, "dbo", tbname[0] }; + if (tbname?.Length == 2) tbname = new[] { olddatabase, tbname[0], tbname[1] }; + tbname = tbname.Select(a => a.ToLower()).ToArray(); + dbs = new[] { tbname[0] }; + } var tables = new List(); foreach (var db in dbs) @@ -155,6 +165,7 @@ use [{olddatabase}]; var sql = $@" use [{db}]; +select * from ( select a.Object_id ,b.name 'Owner' @@ -183,8 +194,8 @@ select from sys.procedures a inner join sys.schemas b on b.schema_id = a.schema_id where a.type = 'P' and charindex('diagram', a.name) = 0 -order by type desc, b.name, a.name -; +) ft_dbf{(tbname == null ? "" : _commonUtils.FormatSql(" where lower([owner])={0} and lower([Name])={1}", new[] { tbname[1], tbname[2] }))} +order by type desc, [owner], [Name]; use [{olddatabase}]; "; var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); @@ -395,7 +406,9 @@ use [{olddatabase}]; } } - sql = $@" + if (tbname == null) + { + sql = $@" use [{db}]; select b.object_id 'Object_id' @@ -415,47 +428,48 @@ where {loc8.ToString().Replace("a.table_name", "b.object_id")} ; use [{olddatabase}]; "; - ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); - if (ds == null) return loc1; + ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); + if (ds == null) return loc1; - var fkColumns = new Dictionary>(); - foreach (object[] row in ds) - { - int object_id, referenced_object_id; - int.TryParse(string.Concat(row[0]), out object_id); - var column = string.Concat(row[1]); - string fk_id = string.Concat(row[2]); - int.TryParse(string.Concat(row[3]), out referenced_object_id); - var is_foreign_key = bool.Parse(string.Concat(row[4])); - var referenced_column = string.Concat(row[5]); - var referenced_db = string.Concat(row[6]); - var referenced_table = string.Concat(row[7]); - DbColumnInfo loc9 = loc3[object_id][column]; - DbTableInfo loc10 = null; - DbColumnInfo loc11 = null; - bool isThisSln = referenced_object_id != 0; - - if (isThisSln) - { - loc10 = loc2[referenced_object_id]; - loc11 = loc3[referenced_object_id][referenced_column]; - } - else + var fkColumns = new Dictionary>(); + foreach (object[] row in ds) { + int object_id, referenced_object_id; + int.TryParse(string.Concat(row[0]), out object_id); + var column = string.Concat(row[1]); + string fk_id = string.Concat(row[2]); + int.TryParse(string.Concat(row[3]), out referenced_object_id); + var is_foreign_key = bool.Parse(string.Concat(row[4])); + var referenced_column = string.Concat(row[5]); + var referenced_db = string.Concat(row[6]); + var referenced_table = string.Concat(row[7]); + DbColumnInfo loc9 = loc3[object_id][column]; + DbTableInfo loc10 = null; + DbColumnInfo loc11 = null; + bool isThisSln = referenced_object_id != 0; + if (isThisSln) + { + loc10 = loc2[referenced_object_id]; + loc11 = loc3[referenced_object_id][referenced_column]; + } + else + { + + } + Dictionary loc12 = null; + DbForeignInfo loc13 = null; + if (!fkColumns.TryGetValue(object_id, out loc12)) + fkColumns.Add(object_id, loc12 = new Dictionary()); + if (!loc12.TryGetValue(fk_id, out loc13)) + loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[object_id], ReferencedTable = loc10 }); + loc13.Columns.Add(loc9); + loc13.ReferencedColumns.Add(loc11); } - Dictionary loc12 = null; - DbForeignInfo loc13 = null; - if (!fkColumns.TryGetValue(object_id, out loc12)) - fkColumns.Add(object_id, loc12 = new Dictionary()); - if (!loc12.TryGetValue(fk_id, out loc13)) - loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[object_id], ReferencedTable = loc10 }); - loc13.Columns.Add(loc9); - loc13.ReferencedColumns.Add(loc11); + foreach (var table_id in fkColumns.Keys) + foreach (var fk in fkColumns[table_id]) + loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value); } - foreach (var table_id in fkColumns.Keys) - foreach (var fk in fkColumns[table_id]) - loc2[table_id].ForeignsDict.Add(fk.Key, fk.Value); foreach (var table_id in loc3.Keys) { diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteDbFirst.cs b/Providers/FreeSql.Provider.Sqlite/SqliteDbFirst.cs index e3fe5077..46b3bdeb 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteDbFirst.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteDbFirst.cs @@ -155,18 +155,28 @@ namespace FreeSql.Sqlite var tbname = _commonUtils.SplitTableName(name); if (tbname?.Length == 1) tbname = new[] { "main", tbname[0] }; if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray(); - var sql = $@" select 1 from {_commonUtils.QuoteSqlName(tbname[0])}.sqlite_master where type = 'table' and {(ignoreCase ? "lower(tbl_name)" : "tbl_name")} = {_commonUtils.FormatSql("{0}", tbname[1])}"; + var sql = $@" select 1 from {_commonUtils.QuoteSqlName(tbname[0])}.sqlite_master where type='table' and {(ignoreCase ? "lower(tbl_name)" : "tbl_name")}={_commonUtils.FormatSql("{0}", tbname[1])}"; return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; } - public List GetTablesByDatabase(params string[] database2) + public DbTableInfo GetTableByName(string name, bool ignoreCase = true) => GetTables(null, name, ignoreCase)?.FirstOrDefault(); + public List GetTablesByDatabase(params string[] database) => GetTables(database, null, false); + + public List GetTables(string[] database, string tablename, bool ignoreCase) { var loc1 = new List(); var loc2 = new Dictionary(); var loc3 = new Dictionary>(); - var database = database2?.ToArray(); - - if (database == null || database.Any() == false) database = GetDatabases().ToArray(); + string[] tbname = null; + if (string.IsNullOrEmpty(tablename) == false) + { + tbname = _commonUtils.SplitTableName(tablename); + if (tbname?.Length == 1) tbname = new[] { "main", tbname[0] }; + if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray(); + database = new[] { tbname[0] }; + } + else if (database == null || database.Any() == false) + database = GetDatabases().ToArray(); if (database.Any() == false) return loc1; Action addColumn = (row, position) => @@ -212,7 +222,7 @@ tbl_name, '' Comment, 'TABLE', sql -from {db}.sqlite_master where type = 'table'"; +from {db}.sqlite_master where type='table'{(tbname == null ? "" : $" and {(ignoreCase ? "lower(tbl_name)" : "tbl_name")}={_commonUtils.FormatSql("{0}", tbname[1])}")}"; var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) continue; @@ -284,34 +294,37 @@ from {db}.sqlite_master where type = 'table'"; addColumn(ds2item, ++position); } - var fks = _orm.Ado.ExecuteArray(CommandType.Text, $"PRAGMA \"{db}\".foreign_key_list(\"{table}\")"); - if (fks != null && fks.Length > 0) + if (tbname == null) { - var fkColumns = new Dictionary>(); - foreach (var fk in fks) + var fks = _orm.Ado.ExecuteArray(CommandType.Text, $"PRAGMA \"{db}\".foreign_key_list(\"{table}\")"); + if (fks != null && fks.Length > 0) { - string column = string.Concat(fk[3]); - string fk_id = $"{db}.{table}.{fk[0]}"; - string ref_table_id = database.Length == 1 ? string.Concat(fk[2]) : $"{db}.{fk[2]}"; - string referenced_column = string.Concat(fk[4]); - if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue; - var loc9 = loc3[table_id][column]; - if (loc2.ContainsKey(ref_table_id) == false) continue; - var loc10 = loc2[ref_table_id]; - var loc11 = loc3[ref_table_id][referenced_column]; + var fkColumns = new Dictionary>(); + foreach (var fk in fks) + { + string column = string.Concat(fk[3]); + string fk_id = $"{db}.{table}.{fk[0]}"; + string ref_table_id = database.Length == 1 ? string.Concat(fk[2]) : $"{db}.{fk[2]}"; + string referenced_column = string.Concat(fk[4]); + if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue; + var loc9 = loc3[table_id][column]; + if (loc2.ContainsKey(ref_table_id) == false) continue; + var loc10 = loc2[ref_table_id]; + var loc11 = loc3[ref_table_id][referenced_column]; - Dictionary loc12 = null; - DbForeignInfo loc13 = null; - if (!fkColumns.TryGetValue(table_id, out loc12)) - fkColumns.Add(table_id, loc12 = new Dictionary()); - if (!loc12.TryGetValue(fk_id, out loc13)) - loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 }); - loc13.Columns.Add(loc9); - loc13.ReferencedColumns.Add(loc11); + Dictionary loc12 = null; + DbForeignInfo loc13 = null; + if (!fkColumns.TryGetValue(table_id, out loc12)) + fkColumns.Add(table_id, loc12 = new Dictionary()); + if (!loc12.TryGetValue(fk_id, out loc13)) + loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 }); + loc13.Columns.Add(loc9); + loc13.ReferencedColumns.Add(loc11); + } + foreach (var table_id2 in fkColumns.Keys) + foreach (var fk in fkColumns[table_id2]) + loc2[table_id2].ForeignsDict.Add(fk.Key, fk.Value); } - foreach (var table_id2 in fkColumns.Keys) - foreach (var fk in fkColumns[table_id2]) - loc2[table_id2].ForeignsDict.Add(fk.Key, fk.Value); } } }