Dapper使用getschema获取表信息

本文旨在介绍Dapper中使用getschema获取表信息的方法和注意事项。

一、获取某张表的所有列信息

使用Dapper获取某张表信息,可以使用 `IDbConnection.GetSchema()` 方法。这个方法通过填写不同的参数,可以获取数据库架构信息、表信息、视图信息以及约束信息等。

针对获取一个表的所有列信息,可以通过以下代码实现:

    var connection = new SqlConnection("Data Source=(local);Initial Catalog=TestDb;Integrated Security=True");

    var columns = new List();

    connection.Open();

    var sqlCommand = connection.CreateCommand();
    sqlCommand.CommandText = "select * from TestTable where 1=0";
    var dataReader = sqlCommand.ExecuteReader();

    var schemaTable = dataReader.GetSchemaTable();
    foreach (DataRow row in schemaTable.Rows)
    {
        columns.Add(row.Field("ColumnName"));
    }
    dataReader.Close();

    connection.Close();

代码解释:

1. 创建SqlConnection对象,连接数据库;

2. 创建一个List集合存储列名;

3. 执行一条查询语句,但是不返回任何数据,这样就可以获取该表的列名;

4. 使用GetSchemaTable()方法获取数据;

5. 遍历取到的表中的所有行,将行中的ColumnName存储到之前创建的List集合当中;

6. 关闭数据库连接。

通过这个方法可以得到被检索表的所有列信息。

二、获取某张表的主键信息

获取指定表的主键,可以通过以下代码实现:

    var connection = new SqlConnection("Data Source=(local);Initial Catalog=TestDb;Integrated Security=True");
    var primaryKeyColumns = new List();

    connection.Open();
    var schema = connection.GetSchema("Indexes");
    var table = schema.Rows.Cast<DataRow>().Where(p => p["TABLE_NAME"].ToString().Equals("TestTable")).FirstOrDefault();

    if(table!=null)
    {
        var indexName = (string)table["INDEX_NAME"];
        var pkColumns = schema.Rows.Cast>DataRow<>()
                            .Where(p => p["INDEX_NAME"].ToString() == indexName && ((short)p["TYPE"] == 1 || (short)p["TYPE"] == 2))
                            .OrderBy(p => (short)p["TYPE"]).ThenBy(p => (int)p["ORDINAL_POSITION"]);

        primaryKeyColumns.AddRange(pkColumns.Select(p => (string)p["COLUMN_NAME"]));
    }

    connection.Close();

代码解释:

1. 创建SqlConnection对象,连接数据库;

2. 创建一个List集合存储主键;

3. 执行GetSchema(“Indexes”)方法获取索引信息;

4. 通过Linq表达式获取指定表的索引信息,并且包含其中的所有第一顺位索引、第二顺位索引,主键需要表现为数字1或数字2,而非唯一性约束所代表的数字3;

5. 将索引的列名存入List集合,并且关闭数据库连接。

三、获取某张表的唯一性约束信息

一些数据库表的列值是唯一的,为了保证这个唯一性,可以在表的列上添加唯一性约束。Dapper可以获取这些唯一性约束信息。以下是获取该信息的代码:

    var connection = new SqlConnection("Data Source=(local);Initial Catalog=TestDb;Integrated Security=True");
    var uniqueColumns = new List<string>();

    connection.Open();
    var schema = connection.GetSchema("Columns");
    var table = schema.Rows.Cast<DataRow>().Where(p => p["TABLE_NAME"].ToString().Equals("TestTable")).FirstOrDefault();

    if(table!=null)
    {
        uniqueColumns.AddRange(schema.Rows.Cast<DataRow>()
                                      .Where(p => p["TABLE_NAME"].ToString().Equals("TestTable") && ((bool)p["IsUnique"] == true))
                                      .Select(p => (string)p["COLUMN_NAME"]));
    }

    connection.Close();

代码解释:

1. 创建SqlConnection对象,连接数据库;

2. 创建一个List集合存储唯一性约束列名;

3. 执行GetSchema(“Columns”)方法获取列信息;

4. 用Linq表达式获取特定的表信息;

5. 将具有唯一性约束的列名存入List集合,关闭数据库连接。

四、获取某张表的所有约束信息

获取指定表的所有约束信息,可以使用下面的代码:

    var connection = new SqlConnection("Data Source=(local);Initial Catalog=TestDb;Integrated Security=True");
    var constraints = new List<string>();

    connection.Open();

    var schema = connection.GetSchema("ConstraintColumns");
    var constraintsTable = schema.Rows.Count > 0 ? schema.Rows.Cast<DataRow>().Where(p => p["TABLE_NAME"].ToString().Equals("TestTable")) : null;

    if (constraintsTable != null)
    {
        foreach (var constraint in constraintsTable)
        {
            var constraintName = (string)constraint["CONSTRAINT_NAME"];
            if (!constraints.Contains(constraintName))
                constraints.Add(constraintName);
        }
    }

    connection.Close();

代码解释:

1. 创建SqlConnection对象,连接数据库;

2. 创建一个List集合存储约束的名称;

3. 执行GetSchema(“ConstraintColumns”)方法获取约束信息;

4. 使用Linq表达式存储指定表的约束信息;

5. 将特定表中所有约束的名称存入List集合,并且关闭数据库连接。

五、获取某张表的所有外键信息

获取指定表的所有外键信息,可以使用下面的代码:

    var connection = new SqlConnection("Data Source=(local);Initial Catalog=TestDb;Integrated Security=True");

    connection.Open();
    var schema = connection.GetSchema("Foreign Keys", new[] { null, null, "TestTable" });

    var foreignKeys = new List<ForeignKey>();

    foreach(DataRow item in schema.Rows)
    {
        foreignKeys.Add(new ForeignKey
        {
            Name = item["CONSTRAINT_NAME"].ToString(),
            FromTableName = item["TABLE_NAME"].ToString(),
            FromColumnName = item["COLUMN_NAME"].ToString(),
            ToTableName = item["REFERENCED_TABLE_NAME"].ToString(),
            ToColumnName = item["REFERENCED_COLUMN_NAME"].ToString()
        });
    }

    connection.Close();

代码解释:

1. 创建SqlConnection对象,连接数据库;

2. 执行GetSchema(“Foreign Keys”)方法获取外键信息;

3. 创建一个列表存储ForeignKey对象;

4. 将表中的所有外键存储到列表中,并且关闭数据库连接。

六、总结

dapper 的 GetSchema 方法可以方便的获取表和数据库的架构信息。在这篇文章中,我们讨论了如何使用它来获取表中的列、主键、列的约束以及外键信息。这个技术可以在开发过程中方便的用来生成代码,进行表比较和同步、校验和更新表等等。

原创文章,作者:UMJBO,如若转载,请注明出处:https://www.506064.com/n/374172.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
UMJBOUMJBO
上一篇 2025-04-27 15:27
下一篇 2025-04-27 15:27

相关推荐

  • Java 监控接口返回信息报错信息怎么处理

    本文将从多个方面对 Java 监控接口返回信息报错信息的处理方法进行详细的阐述,其中包括如何捕获异常、如何使用日志输出错误信息、以及如何通过异常处理机制解决报错问题等等。以下是详细…

    编程 2025-04-29
  • 使用Python爬虫获取电影信息的实现方法

    本文将介绍如何使用Python编写爬虫程序,来获取和处理电影数据。需要了解基本的Python编程语言知识,并使用BeautifulSoup库和Requests库进行爬取。 一、准备…

    编程 2025-04-28
  • Python爬取网页信息

    本文将从多个方面对Python爬取网页信息做详细的阐述。 一、爬虫介绍 爬虫是一种自动化程序,可以模拟人对网页进行访问获取信息的行为。通过编写代码,我们可以指定要获取的信息,将其从…

    编程 2025-04-28
  • 如何使用Python执行Shell命令并获取执行过程信息

    本文将介绍如何使用Python执行Shell命令并获取执行过程信息。我们将从以下几个方面进行阐述: 一、执行Shell命令 Python内置的subprocess模块可以方便地执行…

    编程 2025-04-28
  • Python实现身份信息模拟生成与查验

    本文将从以下几个方面对Python实现身份信息模拟生成与查验进行详细阐述: 一、身份信息生成 身份信息生成是指通过代码生成符合身份信息规范的虚假数据。Python中,我们可以使用f…

    编程 2025-04-27
  • 通过提交信息搜索-使用git

    本篇文章重点讲解如何使用git通过提交信息来搜索。我们将从多个方面介绍如何使用git来搜索提交信息,并提供相应的代码示例以供参考。 一、搜索方式 Git提供了三种搜索方式,分别为:…

    编程 2025-04-27
  • 已装备我军的空中信息化作战平台

    本文将会从多个方面详细阐述已装备我军的空中信息化作战平台。 一、平台概述 已装备我军的空中信息化作战平台是一个全新的作战系统,具备实时数据采集、处理、分析、共享的能力。它可以在不同…

    编程 2025-04-27
  • Linux查看系统信息

    一、CPU信息 Linux系统下,查看CPU的信息最常用的命令是lscpu。该命令可以显示CPU架构、核心数量、线程数、缓存大小、CPU频率等信息。例如: lscpu 该命令会输出…

    编程 2025-04-24
  • 软考 信息安全工程师

    软考 信息安全工程师是一项技能型国家级资格认证考试,主要测试考生在信息安全领域的理论知识和实践技能,是证明个人信息安全能力的重要证书。本文将从多个方面对软考 信息安全工程师做详细的…

    编程 2025-04-23
  • 信息处理技术员初级职称好考吗?

    一、考试难度是否适中 信息处理技术员初级职称考试难度并不高,但也不是每个人都能轻松通过的,需要一定的学习时间和技能积累。首先,考试的科目涵盖了计算机基础知识、应用软件使用、编程语言…

    编程 2025-04-12

发表回复

登录后才能评论