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/zh-hk/n/374172.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
UMJBO的頭像UMJBO
上一篇 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

發表回復

登錄後才能評論