diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 2acb6679..5ca74890 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -130,13 +130,6 @@ 清空状态数据 - - - 根据 lambda 条件删除数据 - - - - 添加 @@ -527,14 +520,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlDbFirstTest.cs index 5ce6d981..901ec1c6 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlDbFirstTest.cs @@ -21,5 +21,32 @@ namespace FreeSql.Tests.MySqlConnector var t2 = g.mysql.DbFirst.GetTablesByDatabase(g.mysql.DbFirst.GetDatabases()[0]); } + + [Fact] + public void ExistsTable() + { + var fsql = g.mysql; + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("cccddd_mysqlconnector.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01", false)); + Assert.False(fsql.DbFirst.ExistsTable("cccddd_mysqlconnector.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01)); + Assert.True(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.True(fsql.DbFirst.ExistsTable("cccddd_mysqlconnector.test_existstb01")); + Assert.True(fsql.DbFirst.ExistsTable("Test_existstb01", false)); + Assert.True(fsql.DbFirst.ExistsTable("cccddd_mysqlconnector.Test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table test_existstb01"); + + Assert.False(fsql.DbFirst.ExistsTable("cccddd_mysqlconnector.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("cccddd_mysqlconnector.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01), "cccddd_mysqlconnector.test_existstb01"); + Assert.True(fsql.DbFirst.ExistsTable("cccddd_mysqlconnector.test_existstb01")); + Assert.True(fsql.DbFirst.ExistsTable("cccddd_mysqlconnector.Test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table cccddd_mysqlconnector.test_existstb01"); + } + class test_existstb01 + { + public Guid id { get; set; } + } } } diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/DamengDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/DamengDbFirstTest.cs index 7c40e69d..12dee40a 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/DamengDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/DamengDbFirstTest.cs @@ -21,5 +21,32 @@ namespace FreeSql.Tests.Odbc.Dameng var t2 = g.dameng.DbFirst.GetTablesByDatabase(); //var tb = g.dameng.Ado.ExecuteArray(System.Data.CommandType.Text, "select * from \"tb_dbfirst\""); } + + [Fact] + public void ExistsTable() + { + var fsql = g.dameng; + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("1user.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01", false)); + Assert.False(fsql.DbFirst.ExistsTable("1user.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01)); + Assert.True(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.True(fsql.DbFirst.ExistsTable("1user.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01", false)); + Assert.False(fsql.DbFirst.ExistsTable("1user.test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table test_existstb01"); + + Assert.False(fsql.DbFirst.ExistsTable("1user.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("1user.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01), "1user.test_existstb01"); + Assert.True(fsql.DbFirst.ExistsTable("1user.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("1user.test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table \"1USER\".test_existstb01"); + } + class test_existstb01 + { + public Guid id { get; set; } + } } } diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/KingbaseES/KingbaseESDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/KingbaseES/KingbaseESDbFirstTest.cs index eb3dc40b..0098989e 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/KingbaseES/KingbaseESDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/KingbaseES/KingbaseESDbFirstTest.cs @@ -18,5 +18,32 @@ namespace FreeSql.Tests.Odbc.KingbaseES var t2 = g.kingbaseES.DbFirst.GetTablesByDatabase(); //var tb = g.kingbaseES.Ado.ExecuteArray(System.Data.CommandType.Text, "select * from \"tb_dbfirst\""); } + + [Fact] + public void ExistsTable() + { + var fsql = g.kingbaseES; + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("public.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01", false)); + Assert.False(fsql.DbFirst.ExistsTable("public.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01)); + Assert.True(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.True(fsql.DbFirst.ExistsTable("public.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("Test_existstb01", false)); + Assert.False(fsql.DbFirst.ExistsTable("public.Test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table test_existstb01"); + + Assert.False(fsql.DbFirst.ExistsTable("tbexts.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("tbexts.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01), "tbexts.test_existstb01"); + Assert.True(fsql.DbFirst.ExistsTable("tbexts.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("tbexts.Test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table \"TBEXTS\".test_existstb01"); + } + class test_existstb01 + { + public Guid id { get; set; } + } } } diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/MySqlDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/MySqlDbFirstTest.cs index a12f5ab3..1a687cbc 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/MySqlDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/MySqlDbFirstTest.cs @@ -21,5 +21,32 @@ namespace FreeSql.Tests.Odbc.MySql var t2 = g.mysql.DbFirst.GetTablesByDatabase(g.mysql.DbFirst.GetDatabases()[0]); } + + [Fact] + public void ExistsTable() + { + var fsql = g.mysql; + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("cccddd_odbc.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01", false)); + Assert.False(fsql.DbFirst.ExistsTable("cccddd_odbc.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01)); + Assert.True(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.True(fsql.DbFirst.ExistsTable("cccddd_odbc.test_existstb01")); + Assert.True(fsql.DbFirst.ExistsTable("Test_existstb01", false)); + Assert.True(fsql.DbFirst.ExistsTable("cccddd_odbc.Test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table test_existstb01"); + + Assert.False(fsql.DbFirst.ExistsTable("cccddd_odbc.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("cccddd_odbc.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01), "cccddd_odbc.test_existstb01"); + Assert.True(fsql.DbFirst.ExistsTable("cccddd_odbc.test_existstb01")); + Assert.True(fsql.DbFirst.ExistsTable("cccddd_odbc.Test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table cccddd_odbc.test_existstb01"); + } + class test_existstb01 + { + public Guid id { get; set; } + } } } diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/OracleDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/OracleDbFirstTest.cs index 9b12a2c7..5012ceee 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/OracleDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/OracleDbFirstTest.cs @@ -21,5 +21,32 @@ namespace FreeSql.Tests.Odbc.Oracle var t2 = g.oracle.DbFirst.GetTablesByDatabase(); //var tb = g.oracle.Ado.ExecuteArray(System.Data.CommandType.Text, "select * from \"tb_dbfirst\""); } + + [Fact] + public void ExistsTable() + { + var fsql = g.oracle; + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("1odbc.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01", false)); + Assert.False(fsql.DbFirst.ExistsTable("1odbc.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01)); + Assert.True(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.True(fsql.DbFirst.ExistsTable("1odbc.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01", false)); + Assert.False(fsql.DbFirst.ExistsTable("11odbcuser.test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table test_existstb01"); + + Assert.False(fsql.DbFirst.ExistsTable("1odbc.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("1odbc.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01), "1odbc.test_existstb01"); + Assert.True(fsql.DbFirst.ExistsTable("1odbc.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("1odbc.test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table \"1ODBC\".test_existstb01"); + } + class test_existstb01 + { + public Guid id { get; set; } + } } } diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/PostgreSQLDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/PostgreSQLDbFirstTest.cs index 1abfd208..70892d7c 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/PostgreSQLDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/PostgreSQLDbFirstTest.cs @@ -25,5 +25,32 @@ namespace FreeSql.Tests.Odbc.PostgreSQL var tb_identity = t2.Where(a => a.Name == "test_new").FirstOrDefault(); } + + [Fact] + public void ExistsTable() + { + var fsql = g.pgsql; + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("public.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01", false)); + Assert.False(fsql.DbFirst.ExistsTable("public.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01)); + Assert.True(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.True(fsql.DbFirst.ExistsTable("public.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("Test_existstb01", false)); + Assert.False(fsql.DbFirst.ExistsTable("public.Test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table test_existstb01"); + + Assert.False(fsql.DbFirst.ExistsTable("tbexts.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("tbexts.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01), "tbexts.test_existstb01"); + Assert.True(fsql.DbFirst.ExistsTable("tbexts.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("tbexts.Test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table \"tbexts\".test_existstb01"); + } + class test_existstb01 + { + public Guid id { get; set; } + } } } diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/SqlServerDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/SqlServerDbFirstTest.cs index c52f6e28..90b3e2d8 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/SqlServerDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/SqlServerDbFirstTest.cs @@ -22,5 +22,32 @@ namespace FreeSql.Tests.Odbc.SqlServer var t2 = g.sqlserver.DbFirst.GetTablesByDatabase(); } + + [Fact] + public void ExistsTable() + { + var fsql = g.sqlserver; + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("dbo.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01", false)); + Assert.False(fsql.DbFirst.ExistsTable("dbo.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01)); + Assert.True(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.True(fsql.DbFirst.ExistsTable("dbo.test_existstb01")); + Assert.True(fsql.DbFirst.ExistsTable("Test_existstb01", false)); + Assert.True(fsql.DbFirst.ExistsTable("dbo.Test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table test_existstb01"); + + Assert.False(fsql.DbFirst.ExistsTable("xxxtb.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("xxxtb.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01), "xxxtb.test_existstb01"); + Assert.True(fsql.DbFirst.ExistsTable("xxxtb.test_existstb01")); + Assert.True(fsql.DbFirst.ExistsTable("xxxtb.Test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table xxxtb.test_existstb01"); + } + class test_existstb01 + { + public Guid id { get; set; } + } } } diff --git a/FreeSql.Tests/FreeSql.Tests/Dameng/DamengDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/Dameng/DamengDbFirstTest.cs index 833dff93..4e6698b9 100644 --- a/FreeSql.Tests/FreeSql.Tests/Dameng/DamengDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Dameng/DamengDbFirstTest.cs @@ -21,5 +21,32 @@ namespace FreeSql.Tests.Dameng var t2 = g.dameng.DbFirst.GetTablesByDatabase(); //var tb = g.dameng.Ado.ExecuteArray(System.Data.CommandType.Text, "select * from \"tb_dbfirst\""); } + + [Fact] + public void ExistsTable() + { + var fsql = g.dameng; + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("2user.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01", false)); + Assert.False(fsql.DbFirst.ExistsTable("2user.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01)); + Assert.True(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.True(fsql.DbFirst.ExistsTable("2user.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01", false)); + Assert.False(fsql.DbFirst.ExistsTable("2user.test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table test_existstb01"); + + Assert.False(fsql.DbFirst.ExistsTable("2user.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("2user.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01), "2user.test_existstb01"); + Assert.True(fsql.DbFirst.ExistsTable("2user.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("2user.test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table \"2USER\".test_existstb01"); + } + class test_existstb01 + { + public Guid id { get; set; } + } } } diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/MySqlDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/MySqlDbFirstTest.cs index fc0859ae..9e2fa376 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/MySqlDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/MySqlDbFirstTest.cs @@ -21,5 +21,32 @@ namespace FreeSql.Tests.MySql var t2 = g.mysql.DbFirst.GetTablesByDatabase(g.mysql.DbFirst.GetDatabases()[0]); } + + [Fact] + public void ExistsTable() + { + var fsql = g.mysql; + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("cccddd.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01", false)); + Assert.False(fsql.DbFirst.ExistsTable("cccddd.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01)); + Assert.True(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.True(fsql.DbFirst.ExistsTable("cccddd.test_existstb01")); + Assert.True(fsql.DbFirst.ExistsTable("Test_existstb01", false)); + Assert.True(fsql.DbFirst.ExistsTable("cccddd.Test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table test_existstb01"); + + Assert.False(fsql.DbFirst.ExistsTable("cccddd.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("cccddd.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01), "cccddd.test_existstb01"); + Assert.True(fsql.DbFirst.ExistsTable("cccddd.test_existstb01")); + Assert.True(fsql.DbFirst.ExistsTable("cccddd.Test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table cccddd.test_existstb01"); + } + class test_existstb01 + { + public Guid id { get; set; } + } } } diff --git a/FreeSql.Tests/FreeSql.Tests/Oracle/OracleDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/Oracle/OracleDbFirstTest.cs index 53bd72fb..19fc547d 100644 --- a/FreeSql.Tests/FreeSql.Tests/Oracle/OracleDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Oracle/OracleDbFirstTest.cs @@ -21,5 +21,32 @@ namespace FreeSql.Tests.Oracle var t2 = g.oracle.DbFirst.GetTablesByDatabase(); //var tb = g.oracle.Ado.ExecuteArray(System.Data.CommandType.Text, "select * from \"tb_dbfirst\""); } + + [Fact] + public void ExistsTable() + { + var fsql = g.oracle; + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("1user.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01", false)); + Assert.False(fsql.DbFirst.ExistsTable("1user.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01)); + Assert.True(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.True(fsql.DbFirst.ExistsTable("1user.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01", false)); + Assert.False(fsql.DbFirst.ExistsTable("1user.test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table test_existstb01"); + + Assert.False(fsql.DbFirst.ExistsTable("1user.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("1user.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01), "1user.test_existstb01"); + Assert.True(fsql.DbFirst.ExistsTable("1user.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("1user.test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table \"1USER\".test_existstb01"); + } + class test_existstb01 + { + public Guid id { get; set; } + } } } diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLDbFirstTest.cs index a41e6896..507694a5 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLDbFirstTest.cs @@ -26,5 +26,32 @@ namespace FreeSql.Tests.PostgreSQL var tb_identity = t2.Where(a => a.Name == "test_new").FirstOrDefault(); } + + [Fact] + public void ExistsTable() + { + var fsql = g.pgsql; + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("public.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01", false)); + Assert.False(fsql.DbFirst.ExistsTable("public.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01)); + Assert.True(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.True(fsql.DbFirst.ExistsTable("public.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("Test_existstb01", false)); + Assert.False(fsql.DbFirst.ExistsTable("public.Test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table test_existstb01"); + + Assert.False(fsql.DbFirst.ExistsTable("tbexts.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("tbexts.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01), "tbexts.test_existstb01"); + Assert.True(fsql.DbFirst.ExistsTable("tbexts.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("tbexts.Test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table \"tbexts\".test_existstb01"); + } + class test_existstb01 + { + public Guid id { get; set; } + } } } diff --git a/FreeSql.Tests/FreeSql.Tests/ShenTong/ShenTongDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/ShenTong/ShenTongDbFirstTest.cs index 12b7a897..bd26596a 100644 --- a/FreeSql.Tests/FreeSql.Tests/ShenTong/ShenTongDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/ShenTong/ShenTongDbFirstTest.cs @@ -21,5 +21,32 @@ namespace FreeSql.Tests.ShenTong var t2 = g.shentong.DbFirst.GetTablesByDatabase(g.shentong.DbFirst.GetDatabases()[0]); } + + [Fact] + public void ExistsTable() + { + var fsql = g.shentong; + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("public.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01", false)); + Assert.False(fsql.DbFirst.ExistsTable("public.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01)); + Assert.True(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.True(fsql.DbFirst.ExistsTable("public.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("Test_existstb01", false)); + Assert.False(fsql.DbFirst.ExistsTable("public.Test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table test_existstb01"); + + Assert.False(fsql.DbFirst.ExistsTable("tbexts.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("tbexts.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01), "tbexts.test_existstb01"); + Assert.True(fsql.DbFirst.ExistsTable("tbexts.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("tbexts.Test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table \"TBEXTS\".test_existstb01"); + } + class test_existstb01 + { + public Guid id { get; set; } + } } } diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerDbFirstTest.cs index c78eebe7..8a5b251a 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerDbFirstTest.cs @@ -31,5 +31,32 @@ namespace FreeSql.Tests.SqlServer var t2 = g.sqlserver.DbFirst.GetTablesByDatabase(); } + + [Fact] + public void ExistsTable() + { + var fsql = g.sqlserver; + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("dbo.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01", false)); + Assert.False(fsql.DbFirst.ExistsTable("dbo.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01)); + Assert.True(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.True(fsql.DbFirst.ExistsTable("dbo.test_existstb01")); + Assert.True(fsql.DbFirst.ExistsTable("Test_existstb01", false)); + Assert.True(fsql.DbFirst.ExistsTable("dbo.Test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table test_existstb01"); + + Assert.False(fsql.DbFirst.ExistsTable("xxxtb.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("xxxtb.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01), "xxxtb.test_existstb01"); + Assert.True(fsql.DbFirst.ExistsTable("xxxtb.test_existstb01")); + Assert.True(fsql.DbFirst.ExistsTable("xxxtb.Test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table xxxtb.test_existstb01"); + } + class test_existstb01 + { + public Guid id { get; set; } + } } } diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteDbFirstTest.cs index 8725e453..0f7d304d 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteDbFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteDbFirstTest.cs @@ -21,5 +21,32 @@ namespace FreeSql.Tests.Sqlite var t2 = g.sqlite.DbFirst.GetTablesByDatabase(); } + + [Fact] + public void ExistsTable() + { + var fsql = g.sqlite; + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("main.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01", false)); + Assert.False(fsql.DbFirst.ExistsTable("main.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01)); + Assert.True(fsql.DbFirst.ExistsTable("test_existstb01")); + Assert.True(fsql.DbFirst.ExistsTable("main.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("Test_existstb01", false)); + Assert.False(fsql.DbFirst.ExistsTable("main.Test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table test_existstb01"); + + Assert.False(fsql.DbFirst.ExistsTable("xxxtb.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("xxxtb.test_existstb01", false)); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01), "xxxtb.test_existstb01"); + Assert.True(fsql.DbFirst.ExistsTable("xxxtb.test_existstb01")); + Assert.False(fsql.DbFirst.ExistsTable("xxxtb.Test_existstb01", false)); + fsql.Ado.ExecuteNonQuery("drop table xxxtb.test_existstb01"); + } + class test_existstb01 + { + public Guid id { get; set; } + } } } diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index ea460a59..bc504527 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -3184,6 +3184,14 @@ + + + 判断表是否存在 + + 表名,如:dbo.table1 + 是否忽略大小写 + + 如果实体类有自增属性,分成两个 List,有值的Item1 merge,无值的Item2 insert diff --git a/FreeSql/Interface/IDbFirst.cs b/FreeSql/Interface/IDbFirst.cs index 1c444593..3a385384 100644 --- a/FreeSql/Interface/IDbFirst.cs +++ b/FreeSql/Interface/IDbFirst.cs @@ -75,5 +75,15 @@ 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 49c7ddfb..d3525e7c 100644 --- a/Providers/FreeSql.Provider.Dameng/DamengDbFirst.cs +++ b/Providers/FreeSql.Provider.Dameng/DamengDbFirst.cs @@ -212,6 +212,25 @@ namespace FreeSql.Dameng return ds.Select(a => a.FirstOrDefault()?.ToString()).ToList(); } + public bool ExistsTable(string name, bool ignoreCase) + { + if (string.IsNullOrEmpty(name)) return false; + var tbname = _commonUtils.SplitTableName(name); + if (tbname?.Length == 1) + { + var userId = (_orm.Ado.MasterPool as DamengConnectionPool)?.UserId; + if (string.IsNullOrEmpty(userId)) + using (var conn = _orm.Ado.MasterPool.Get()) + { + userId = DamengConnectionPool.GetUserId(conn.Value.ConnectionString); + } + tbname = new[] { userId, tbname[0] }; + } + if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray(); + var sql = $" select 1 from all_tab_comments where {(ignoreCase ? "lower(owner)" : "owner")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(table_name)" : "table_name")}={_commonUtils.FormatSql("{0}", tbname[1])}"; + return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; + } + public List GetTablesByDatabase(params string[] database2) { var loc1 = new List(); diff --git a/Providers/FreeSql.Provider.MySql/MySqlDbFirst.cs b/Providers/FreeSql.Provider.MySql/MySqlDbFirst.cs index 7253870b..03923720 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlDbFirst.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlDbFirst.cs @@ -148,6 +148,24 @@ namespace FreeSql.MySql return ds.Select(a => a.FirstOrDefault()?.ToString()).ToList(); } + public bool ExistsTable(string name, bool ignoreCase) + { + if (string.IsNullOrEmpty(name)) return false; + var tbname = _commonUtils.SplitTableName(name); + if (tbname?.Length == 1) + { + var database = ""; + using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5))) + { + database = conn.Value.Database; + } + tbname = new[] { database, tbname[0] }; + } + if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray(); + var sql = $" SELECT 1 FROM information_schema.TABLES WHERE {(ignoreCase ? "lower(table_schema)" : "table_schema")} = {_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(table_name)" : "table_name")} = {_commonUtils.FormatSql("{0}", tbname[1])}"; + return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; + } + public List GetTablesByDatabase(params string[] database2) { var loc1 = new List(); diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengDbFirst.cs b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengDbFirst.cs index e941e104..5b3d808f 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengDbFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengDbFirst.cs @@ -212,6 +212,25 @@ namespace FreeSql.Odbc.Dameng return ds.Select(a => a.FirstOrDefault()?.ToString()).ToList(); } + public bool ExistsTable(string name, bool ignoreCase) + { + if (string.IsNullOrEmpty(name)) return false; + var tbname = _commonUtils.SplitTableName(name); + if (tbname?.Length == 1) + { + var userId = (_orm.Ado.MasterPool as OdbcDamengConnectionPool)?.UserId; + if (string.IsNullOrEmpty(userId)) + using (var conn = _orm.Ado.MasterPool.Get()) + { + userId = OdbcDamengConnectionPool.GetUserId(conn.Value.ConnectionString); + } + tbname = new[] { userId, tbname[0] }; + } + if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray(); + var sql = $" select 1 from all_tab_comments where {(ignoreCase ? "lower(owner)" : "owner")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(table_name)" : "table_name")}={_commonUtils.FormatSql("{0}", tbname[1])}"; + return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; + } + public List GetTablesByDatabase(params string[] database2) { var loc1 = new List(); diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESDbFirst.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESDbFirst.cs index cd15ba6a..b7f0853f 100644 --- a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESDbFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESDbFirst.cs @@ -110,6 +110,16 @@ namespace FreeSql.Odbc.KingbaseES return ds.Select(a => a.FirstOrDefault()?.ToString()).ToList(); } + public bool ExistsTable(string name, bool ignoreCase) + { + if (string.IsNullOrEmpty(name)) return false; + 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])}"; + return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; + } + public List GetTablesByDatabase(params string[] database) { var olddatabase = ""; diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlDbFirst.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlDbFirst.cs index 66734859..07661662 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlDbFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlDbFirst.cs @@ -114,6 +114,24 @@ namespace FreeSql.Odbc.MySql return ds.Select(a => a.FirstOrDefault()?.ToString()).ToList(); } + public bool ExistsTable(string name, bool ignoreCase) + { + if (string.IsNullOrEmpty(name)) return false; + var tbname = _commonUtils.SplitTableName(name); + if (tbname?.Length == 1) + { + var database = ""; + using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5))) + { + database = conn.Value.Database; + } + tbname = new[] { database, tbname[0] }; + } + if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray(); + var sql = $" SELECT 1 FROM information_schema.TABLES WHERE {(ignoreCase ? "lower(table_schema)" : "table_schema")} = {_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(table_name)" : "table_name")} = {_commonUtils.FormatSql("{0}", tbname[1])}"; + return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; + } + public List GetTablesByDatabase(params string[] database2) { var loc1 = new List(); diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleDbFirst.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleDbFirst.cs index 23c409a4..f426d221 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleDbFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleDbFirst.cs @@ -166,6 +166,25 @@ namespace FreeSql.Odbc.Oracle return ds.Select(a => a.FirstOrDefault()?.ToString()).ToList(); } + public bool ExistsTable(string name, bool ignoreCase) + { + if (string.IsNullOrEmpty(name)) return false; + var tbname = _commonUtils.SplitTableName(name); + if (tbname?.Length == 1) + { + var userId = (_orm.Ado.MasterPool as OdbcOracleConnectionPool)?.UserId; + if (string.IsNullOrEmpty(userId)) + using (var conn = _orm.Ado.MasterPool.Get()) + { + userId = OdbcOracleConnectionPool.GetUserId(conn.Value.ConnectionString); + } + tbname = new[] { userId, tbname[0] }; + } + if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray(); + var sql = $" select 1 from all_tab_comments where {(ignoreCase ? "lower(owner)" : "owner")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(table_name)" : "table_name")}={_commonUtils.FormatSql("{0}", tbname[1])}"; + return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; + } + public List GetTablesByDatabase(params string[] database2) { var loc1 = new List(); diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLDbFirst.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLDbFirst.cs index 1da4d276..e3e66b20 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLDbFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLDbFirst.cs @@ -122,6 +122,16 @@ namespace FreeSql.Odbc.PostgreSQL return ds.Select(a => a.FirstOrDefault()?.ToString()).ToList(); } + public bool ExistsTable(string name, bool ignoreCase) + { + if (string.IsNullOrEmpty(name)) return false; + 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])}"; + return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; + } + public List GetTablesByDatabase(params string[] database) { var olddatabase = ""; diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerDbFirst.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerDbFirst.cs index 7c5eb871..d958b0bb 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerDbFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerDbFirst.cs @@ -107,6 +107,31 @@ namespace FreeSql.Odbc.SqlServer return ds.Select(a => a.FirstOrDefault()?.ToString()).ToList(); } + public bool ExistsTable(string name, bool ignoreCase) + { + if (string.IsNullOrEmpty(name)) return false; + var olddatabase = ""; + using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5))) + { + olddatabase = conn.Value.Database; + } + var tbname = _commonUtils.SplitTableName(name); + 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(); + var sql = $@" +use [{tbname[0]}]; +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])} +; +use [{olddatabase}]; +"; + return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; + } + public List GetTablesByDatabase(params string[] database) { var olddatabase = ""; diff --git a/Providers/FreeSql.Provider.Oracle/OracleDbFirst.cs b/Providers/FreeSql.Provider.Oracle/OracleDbFirst.cs index fb01732d..f8e7e3d1 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleDbFirst.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleDbFirst.cs @@ -166,6 +166,25 @@ namespace FreeSql.Oracle return ds.Select(a => a.FirstOrDefault()?.ToString()).ToList(); } + public bool ExistsTable(string name, bool ignoreCase) + { + if (string.IsNullOrEmpty(name)) return false; + var tbname = _commonUtils.SplitTableName(name); + if (tbname?.Length == 1) + { + var userId = (_orm.Ado.MasterPool as OracleConnectionPool)?.UserId; + if (string.IsNullOrEmpty(userId)) + using (var conn = _orm.Ado.MasterPool.Get()) + { + userId = OracleConnectionPool.GetUserId(conn.Value.ConnectionString); + } + tbname = new[] { userId, tbname[0] }; + } + if (ignoreCase) tbname = tbname.Select(a => a.ToLower()).ToArray(); + var sql = $" select 1 from all_tab_comments where {(ignoreCase ? "lower(owner)" : "owner")}={_commonUtils.FormatSql("{0}", tbname[0])} and {(ignoreCase ? "lower(table_name)" : "table_name")}={_commonUtils.FormatSql("{0}", tbname[1])}"; + return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; + } + public List GetTablesByDatabase(params string[] database2) { var loc1 = new List(); diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLDbFirst.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLDbFirst.cs index 6420a5c5..b5681333 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLDbFirst.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLDbFirst.cs @@ -232,6 +232,16 @@ namespace FreeSql.PostgreSQL return ds.Select(a => a.FirstOrDefault()?.ToString()).ToList(); } + public bool ExistsTable(string name, bool ignoreCase) + { + if (string.IsNullOrEmpty(name)) return false; + 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])}"; + return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; + } + public List GetTablesByDatabase(params string[] database) { var olddatabase = ""; diff --git a/Providers/FreeSql.Provider.ShenTong/ShenTongDbFirst.cs b/Providers/FreeSql.Provider.ShenTong/ShenTongDbFirst.cs index 99dacadf..1d573b84 100644 --- a/Providers/FreeSql.Provider.ShenTong/ShenTongDbFirst.cs +++ b/Providers/FreeSql.Provider.ShenTong/ShenTongDbFirst.cs @@ -123,6 +123,22 @@ namespace FreeSql.ShenTong return ds.Select(a => a.FirstOrDefault()?.ToString()).ToList(); } + public bool ExistsTable(string name, bool ignoreCase) + { + if (string.IsNullOrEmpty(name)) return false; + 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_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') +"; + return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; + } + public List GetTablesByDatabase(params string[] database) { var olddatabase = ""; diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerDbFirst.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerDbFirst.cs index ff0dd7e4..f376bf61 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerDbFirst.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerDbFirst.cs @@ -110,6 +110,31 @@ namespace FreeSql.SqlServer return ds.Select(a => a.FirstOrDefault()?.ToString()).ToList(); } + public bool ExistsTable(string name, bool ignoreCase) + { + if (string.IsNullOrEmpty(name)) return false; + var olddatabase = ""; + using (var conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5))) + { + olddatabase = conn.Value.Database; + } + var tbname = _commonUtils.SplitTableName(name); + 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(); + var sql = $@" +use [{tbname[0]}]; +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])} +; +use [{olddatabase}]; +"; + return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; + } + public List GetTablesByDatabase(params string[] database) { var olddatabase = ""; diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteDbFirst.cs b/Providers/FreeSql.Provider.Sqlite/SqliteDbFirst.cs index 38b64903..e3fe5077 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteDbFirst.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteDbFirst.cs @@ -149,6 +149,16 @@ namespace FreeSql.Sqlite return _orm.Ado.ExecuteArray("PRAGMA database_list").Select(a => string.Concat(a[1])).ToList(); } + public bool ExistsTable(string name, bool ignoreCase) + { + if (string.IsNullOrEmpty(name)) return false; + 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])}"; + return string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, sql)) == "1"; + } + public List GetTablesByDatabase(params string[] database2) { var loc1 = new List(); @@ -194,7 +204,8 @@ namespace FreeSql.Sqlite foreach (var db in database) { - var sql = $@"select + var sql = $@" +select '{db}.' || tbl_name, '{db}', tbl_name,