在進行數據庫操作時,我們經常需要對多個參數進行拼裝,尤其是在動態查詢語句中,這項工作會更加繁瑣和複雜。這時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