深入理解DynamicParameters

在進行數據庫操作時,我們經常需要對多個參數進行拼裝,尤其是在動態查詢語句中,這項工作會更加繁瑣和複雜。這時DynamicParameters就能派上用場了。DynamicParameters是Dapper中的一個類,它能夠幫助我們輕鬆地構造參數,減少冗餘代碼的編寫,提高代碼的可讀性。

一、DynamicParameters的節點

DynamicParameters類位於Dapper命名空間下,我們需要在代碼中引入using Dapper;才能使用它。使用DynamicParameters,最基本的就是設置參數。我們可以通過以下代碼來設置參數:

DynamicParameters parameters = new DynamicParameters();
parameters.Add("userId", 1);
parameters.Add("userName", "admin");
parameters.Add("age", null);
parameters.Add("enable", true);

其中,Add方法的第一個參數是參數名,第二個參數是參數值。如果是空值,可以將參數值傳遞為null,如果是布爾類型,也可以直接傳遞true或false。如果我們需要手動指定一個參數的類型,可以使用Add方法的第三個參數:

DynamicParameters parameters = new DynamicParameters();
parameters.Add("userId", 1, DbType.Int32);
parameters.Add("userName", "admin", DbType.String);
parameters.Add("age", null, DbType.Int32);
parameters.Add("enable", true, DbType.Boolean);

在這個例子中,我們將userId參數指定為Int32類型,userName參數指定為字符串類型,age參數指定為Int32類型,enable參數指定為Boolean類型。但對於大多數情況來說,Dapper可以自動識別參數類型,我們不必手動指定。

二、DynamicParameters參數的類型

除了基本的參數類型,DynamicParameters還支持以下幾種類型的參數:

1. 動態參數

動態參數可以用來保存一系列鍵值對。如果我們想要查詢滿足一組特定條件的數據,就可以使用動態參數。下面是一個使用動態參數查詢的例子:

DynamicParameters parameters = new DynamicParameters();
parameters.AddDynamicParams(new { UserId = 1, UserName = "admin" });
var sql = "SELECT * FROM Users WHERE 1 = 1";
if (parameters != null && parameters.ParameterNames.Count() > 0)
{
    foreach (string name in parameters.ParameterNames)
    {
        sql += " AND " + name + "= @" + name;
    }
    var users = connection.Query<User>(sql, parameters);
}

在這個例子中,我們首先調用AddDynamicParams方法,將一個匿名類型對象添加到DynamicParameters實例中。然後,對於每一個參數名,我們都將其添加到查詢語句的where條件中,並將DynamicParameters實例傳遞給Query方法。最後,就可以得到我們想要的結果。我們可以將這種方式擴展到任何查詢語句中,從而實現更為複雜的動態查詢。

2. 支持數組參數

在查詢中,我們有時需要使用數組參數。比如,我們需要查詢某個部門中所有的員工信息,而部門編號是一個整型數組。Dapper支持使用數組參數,具體實現方式如下:

int[] departmentIds = { 1, 2, 3 };
var sql = "SELECT * FROM Employees WHERE DepartmentId IN @DepartmentIds";
var parameter = new DynamicParameters();
parameter.Add("DepartmentIds", departmentIds, DbType.Int32, ParameterDirection.Input);
var result = connection.Query<Employee>(sql, parameter);

在這個例子中,我們首先定義了一個整型數組departmentIds,然後在查詢語句中使用IN關鍵字查詢DepartmentId是否在departmentIds數組中。接着,我們創建了一個DynamicParameters實例,使用Add方法將數組參數DepartmentIds添加到DynamicParameters中,並指定了參數類型和方向。最後,我們可以將DynamicParameters實例傳遞給Query方法,得到我們想要的結果。

3. 動態參數支持DataTable類型

如果我們需要批量插入或更新數據,使用DataTable類型的數組會比較方便。Dapper提供了對DataTable類型的支持,可以將DataTable作為DynamicParameters的參數值進行傳遞。下面是一個使用DataTable批量插入數據的例子:

public void BulkInsert(DataTable table)
{
    using IDbConnection connection = new MySqlConnection(Configuration.GetValue<string>("ConnectionString"));
    IDbTransaction transaction = null;
    try
    {
        connection.Open();
        transaction = connection.BeginTransaction();
        connection.Execute("CREATE TEMPORARY TABLE IF NOT EXISTS TempTable (Id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(50), Age INT)");
        connection.Execute("INSERT INTO TempTable (Id, Name, Age) VALUES(0, '', 0)");
        connection.Execute("DELETE FROM TempTable WHERE Id=0");
        using (var bulkCopy = new MySqlBulkCopy((MySqlConnection)connection, transaction))
        {
            bulkCopy.BatchSize = 1000;
            bulkCopy.DestinationTableName = "TempTable";
            foreach (DataColumn column in table.Columns)
            {
                bulkCopy.ColumnMappings.Add(column.ColumnName, column.ColumnName);
            }
            bulkCopy.WriteToServer(table);
        }
        connection.Execute("INSERT INTO Users (Name, Age) SELECT Name, Age FROM TempTable");
        transaction.Commit();
    }
    catch (Exception ex)
    {
        transaction.Rollback();
        throw ex;
    }
}

在這個例子中,我們首先定義了一個BulkInsert方法,它接受一個DataTable類型的參數table。接着,我們使用MySqlBulkCopy進行批量插入操作。首先,我們創建了一個臨時表TempTable,並在其中插入一條空記錄,然後刪除該記錄。接着,我們使用MySqlBulkCopy的ColumnMappings屬性指定每個列名稱的映射關係,並將table對象寫入到數據庫中。最後,我們在Users表中插入由TempTable生成的數據。如果出現異常,則回滾事務。

三、總結

DynamicParameters類可以幫助我們輕鬆地構造參數,減少冗餘代碼的編寫,提高代碼的可讀性。除了基本的參數類型,DynamicParameters還支持動態參數、數組參數和DataTable類型的參數。它使我們能夠更方便地使用Dapper進行數據庫操作,並且可以幫助我們完成更為複雜和高效的操作。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/270015.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-16 13:35
下一篇 2024-12-16 13:35

相關推薦

  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、位元組與比特 在討論byte轉int之前,我們需要了解位元組和比特的概念。位元組是計算機存儲單位的一種,通常表示8個比特(bit),即1位元組=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • 深入了解scala-maven-plugin

    一、簡介 Scala-maven-plugin 是一個創造和管理 Scala 項目的maven插件,它可以自動生成基本項目結構、依賴配置、Scala文件等。使用它可以使我們專註於代…

    編程 2025-04-25
  • 深入了解LaTeX的腳註(latexfootnote)

    一、基本介紹 LaTeX作為一種排版軟件,具有各種各樣的功能,其中腳註(footnote)是一個十分重要的功能之一。在LaTeX中,腳註是用命令latexfootnote來實現的。…

    編程 2025-04-25
  • 深入剖析MapStruct未生成實現類問題

    一、MapStruct簡介 MapStruct是一個Java bean映射器,它通過註解和代碼生成來在Java bean之間轉換成本類代碼,實現類型安全,簡單而不失靈活。 作為一個…

    編程 2025-04-25
  • 深入理解Python字符串r

    一、r字符串的基本概念 r字符串(raw字符串)是指在Python中,以字母r為前綴的字符串。r字符串中的反斜杠(\)不會被轉義,而是被當作普通字符處理,這使得r字符串可以非常方便…

    編程 2025-04-25
  • 深入探討馮諾依曼原理

    一、原理概述 馮諾依曼原理,又稱「存儲程序控制原理」,是指計算機的程序和數據都存儲在同一個存儲器中,並且通過一個統一的總線來傳輸數據。這個原理的提出,是計算機科學發展中的重大進展,…

    編程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一個程序就是一個模塊,而一個模塊可以引入另一個模塊,這樣就形成了包。包就是有多個模塊組成的一個大模塊,也可以看做是一個文件夾。包可以有效地組織代碼和數據…

    編程 2025-04-25

發表回復

登錄後才能評論