From a264578764cdbc43198c691f6833b86556788b92 Mon Sep 17 00:00:00 2001 From: "bob.li" Date: Thu, 6 Apr 2023 13:00:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=99=9A=E8=B0=B7dbfirst?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UnitDbFirst.cs | 11 +- FreeSql/FreeSql.xml | 183 ++++++++++++++++++ .../FreeSql.Provider.Xugu/XuguDbFirst.cs | 37 +++- 3 files changed, 218 insertions(+), 13 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Xugu/UnitDbFirst.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Xugu/UnitDbFirst.cs index 7ff09887..188add87 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Xugu/UnitDbFirst.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Xugu/UnitDbFirst.cs @@ -22,15 +22,20 @@ namespace FreeSql.Tests.Provider.Xugu public void GetTableByName() { var fsql = g.xugu; - var t1 = fsql.DbFirst.GetTableByName("GENERAL.system_log"); - Assert.NotNull(t1); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01)); + var t1 = fsql.DbFirst.GetTableByName("test_existstb01"); + Assert.NotNull(t1); + Assert.True(t1.Columns.Count > 0); + var t3 = fsql.DbFirst.GetTableByName("notexists_tb"); + Assert.Null(t3); + fsql.Ado.ExecuteNonQuery("drop table test_existstb01"); } [Fact] public void ExistsTable() { var fsql = g.xugu; - Assert.False(fsql.DbFirst.ExistsTable("GENERAL.system_log")); + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01")); fsql.CodeFirst.SyncStructure(typeof(test_existstb01)); Assert.True(fsql.DbFirst.ExistsTable("test_existstb01")); fsql.Ado.ExecuteNonQuery("drop table test_existstb01"); diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 1973f9b2..5323d7da 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -3519,6 +3519,177 @@ + + + 测试数据库是否连接正确,本方法执行如下命令: + MySql/SqlServer/PostgreSQL/达梦/人大金仓/神通: SELECT 1 + Oracle: SELECT 1 FROM dual + + 命令超时设置(秒) + + true: 成功, false: 失败 + + + + 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 + + + + + + + + + + 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 查询 + + + + + + + + + 查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 查询 + + + + + + + + + 查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 查询 + + + + + + + + + 查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 在【主库】执行 + + + + + + + + + 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 在【主库】执行 + + + + + + + + + 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 }) + + + + + + + + + + + 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + + 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 }) + + + + + + + + + + + + 执行SQL返回对象集合,Query<User, Address>("select * from user where age > @age; select * from address", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + 可自定义解析表达式 @@ -4509,6 +4680,12 @@ 超时 + + + 获取资源 + + + 使用完毕后,归还资源 @@ -4584,6 +4761,12 @@ 资源对象 + + + 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 + + 资源对象 + 归还对象给对象池的时候触发 diff --git a/Providers/FreeSql.Provider.Xugu/XuguDbFirst.cs b/Providers/FreeSql.Provider.Xugu/XuguDbFirst.cs index b040d8fd..b58e90e7 100644 --- a/Providers/FreeSql.Provider.Xugu/XuguDbFirst.cs +++ b/Providers/FreeSql.Provider.Xugu/XuguDbFirst.cs @@ -442,14 +442,15 @@ where IS_SYS=false and {loc8.ToString().Replace("a.table_name", "ns.SCHEMA_NAME { sql = $@" select -schema_name || '.' || b.table_name as table_id, -cons_name as FKId, -cons_type, -define +c.schema_name || '.' || b.table_name as table_id, +a.cons_name as FKId, +a.cons_type, +a.define, +(select c2.schema_name || '.' || b2.table_name from all_tables as b2 left join all_SCHEMAS as c2 on b2.SCHEMA_ID=c2.SCHEMA_ID where b2.TABLE_id=b.table_id) as ref_table_id from all_constraints as a left join all_tables as b on a.Table_ID=b.Table_ID left Join all_SCHEMAS AS c on b.SCHEMA_ID=c.SCHEMA_ID -where IS_SYS=false AND {loc8.ToString().Replace("a.table_name", "schema_name || '.' || b.table_name")} +where IS_SYS=false AND a.cons_type='F' AND {loc8.ToString().Replace("a.table_name", "schema_name || '.' || b.table_name")} "; ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -458,15 +459,31 @@ where IS_SYS=false AND {loc8.ToString().Replace("a.table_name", "schema_name || foreach (object[] row in ds) { var table_id = string.Concat(row[0]); - var column = row[3] as string[]; + var ref_table_id = string.Concat(row[4]); + //var ref_table_id = row[4] as long?; + //if (!ref_table_id.HasValue || ref_table_id < 1) + // continue; + + //loc2 是所有表信息 + + if (!string.IsNullOrWhiteSpace(ref_table_id) || loc2.ContainsKey(ref_table_id?.ToString()) == false) continue; + + + var column_temps = (row[3] as string) + .Replace(")(", "|") + .Replace("\"","") + .Replace("(", "") + .Replace(")", "") + .Split('|'); + var column = column_temps[0].Split(','); var fk_id = string.Concat(row[1]); - var ref_table_id = string.Concat(row[0]); - var is_foreign_key = string.Concat(row[2]) == "F"; - var referenced_column = row[5] as string[]; + + //var is_foreign_key = string.Concat(row[2]) == "F"; + var referenced_column = column_temps[1].Split(','); //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;