Dapper là một micro-ORM (Object-Relational Mapper) mạnh mẽ, giúp bạn tương tác với cơ sở dữ liệu một cách nhanh chóng và dễ dàng. Tuy nhiên, để đảm bảo an toàn và hiệu suất, việc sử dụng Dapper Parameters là vô cùng quan trọng. Bài viết này sẽ cung cấp cho bạn một hướng dẫn chi tiết về cách sử dụng các loại Dapper Parameters khác nhau, từ Dynamic Parameters đến Table-Valued Parameters, giúp bạn xây dựng các truy vấn an toàn và tối ưu. Tìm hiểu ngay để nâng cao kỹ năng truy vấn dữ liệu của bạn!
Sử dụng Dapper Parameters mang lại nhiều lợi ích quan trọng cho ứng dụng của bạn. Đầu tiên và quan trọng nhất, nó giúp ngăn chặn các cuộc tấn công SQL Injection, một trong những mối đe dọa bảo mật hàng đầu đối với các ứng dụng web. Thay vì ghép chuỗi trực tiếp các giá trị vào câu lệnh SQL, parameters cho phép bạn truyền các giá trị một cách an toàn, đảm bảo rằng chúng được xử lý đúng cách bởi trình quản lý cơ sở dữ liệu.
Ngoài ra, việc sử dụng parameters còn cải thiện hiệu suất của ứng dụng. Khi bạn sử dụng parameters, cơ sở dữ liệu có thể lưu trữ kế hoạch thực thi của truy vấn, giúp giảm thời gian phân tích và biên dịch truy vấn trong các lần thực thi sau. Điều này đặc biệt hữu ích đối với các truy vấn được thực hiện nhiều lần với các giá trị khác nhau. Hơn nữa, việc sử dụng parameters giúp mã nguồn của bạn trở nên dễ đọc và dễ bảo trì hơn, vì nó tách biệt logic truy vấn khỏi dữ liệu đầu vào.
Dapper Anonymous Parameters là một cách đơn giản để truyền các giá trị vào truy vấn SQL. Bạn tạo một đối tượng anonymous chứa các thuộc tính tương ứng với các tham số trong truy vấn của mình. Dapper sẽ tự động ánh xạ các thuộc tính này với các tham số có cùng tên trong câu lệnh SQL.
Ví dụ:
var parameters = new { UserName = username, Password = password };
var sql = "SELECT * from users where username = @UserName and password = @Password";
var result = connection.Query(sql, parameters);
Dapper Dynamic Parameters cung cấp một cách linh hoạt hơn để quản lý các tham số. Bạn có thể thêm, sửa đổi hoặc xóa các tham số một cách động. Điều này đặc biệt hữu ích khi bạn không biết trước số lượng tham số cần thiết hoặc khi bạn cần thay đổi các tham số dựa trên logic nghiệp vụ.
Để sử dụng DynamicParameters, bạn tạo một đối tượng `DynamicParameters` và sau đó sử dụng phương thức `Add` để thêm các tham số. Bạn có thể chỉ định tên, giá trị, kiểu dữ liệu, hướng và kích thước của từng tham số.
Ví dụ:
var parameters = new DynamicParameters();
parameters.Add("@CustomerId", customerId, DbType.String, ParameterDirection.Input, customerId.Length);
var sql = "SELECT * FROM customers WHERE CustomerId = @CustomerId";
var customer = connection.QuerySingle(sql, parameters);
Dapper String Parameters giúp bạn làm việc với các tham số chuỗi một cách an toàn và hiệu quả. Bạn có thể chỉ định các thuộc tính như `IsAnsi` và `IsFixedLength` để kiểm soát cách chuỗi được xử lý bởi cơ sở dữ liệu. Điều này giúp ngăn chặn các vấn đề liên quan đến mã hóa và độ dài chuỗi.
Ví dụ:
string sql = "SELECT * FROM Customers WHERE Email = @Email";
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
var dbParams = new DbString() { Value = Email, IsAnsi = true, IsFixedLength = true };
var customer = connection.Query(sql, new { Email = dbParams }).FirstOrDefault();
}
Khi bạn cần truy vấn dữ liệu dựa trên một danh sách các giá trị, Dapper WHERE IN Parameters là một lựa chọn tuyệt vời. Bạn có thể truyền một mảng hoặc danh sách các giá trị vào mệnh đề `WHERE IN` trong câu lệnh SQL của mình.
Ví dụ:
var ids = new[] { 3, 7, 12 };
var sql = "SELECT * FROM Products WHERE ProductId IN @Ids;";
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
var products = connection.Query(sql, new { Ids = ids }).ToList();
}
Dapper Table-Valued Parameters (TVP) cho phép bạn truyền một bảng dữ liệu từ ứng dụng của mình vào một stored procedure trong SQL Server. Điều này đặc biệt hữu ích khi bạn cần thực hiện các thao tác bulk insert hoặc update.
Để sử dụng TVP, bạn cần tạo một user-defined type trong cơ sở dữ liệu, sau đó tạo một danh sách các đối tượng C# tương ứng với type này. Cuối cùng, bạn truyền danh sách này như một tham số vào stored procedure.
Ví dụ:
// Tạo user-defined type trong SQL Server:
// CREATE TYPE TvpExampleType AS TABLE (ID INT, Name VARCHAR(50))
var tvpExampleType = new List();
tvpExampleType.Add(new TvpExampleType { ID = 1, Name = "John" });
tvpExampleType.Add(new TvpExampleType { ID = 2, Name = "Steve" });
var p = new DynamicParameters();
p.Add("TvpExampleType", tvpExampleType.AsTableValuedParameter("dbo.TvpExampleType"));
await connection.ExecuteAsync("dbo.MyStoredProc", p, commandType: CommandType.StoredProcedure);
Dapper Output Parameter cho phép bạn lấy dữ liệu trả về từ stored procedures thông qua các tham số output. Bạn có thể định nghĩa các tham số output và sau đó truy xuất giá trị của chúng sau khi thực thi stored procedure.
Ví dụ:
// Stored procedure:
// CREATE Procedure GetCustomerDetails @CustomerID INT, @Name NVARCHAR(Max) OUTPUT, @Description NVARCHAR(Max) OUTPUT AS ...
var p = new DynamicParameters();
p.Add("@CustomerID", 1002);
p.Add("@Name", null, dbType: DbType.String, direction: ParameterDirection.Output, 50);
p.Add("@Description", null, dbType: DbType.String, direction: ParameterDirection.Output, 50);
connection.Execute("GetCustomerDetails", p, commandType: CommandType.StoredProcedure);
var name = p.Get("@Name");
var description = p.Get("@Description");
Việc sử dụng Dapper Parameters là một phần quan trọng trong việc xây dựng các ứng dụng .NET an toàn và hiệu quả. Bằng cách hiểu và áp dụng các loại parameters khác nhau, bạn có thể ngăn chặn các cuộc tấn công SQL Injection, cải thiện hiệu suất và làm cho mã nguồn của bạn dễ bảo trì hơn. Hy vọng rằng hướng dẫn này đã cung cấp cho bạn một cái nhìn tổng quan toàn diện về cách sử dụng Dapper Parameters trong các dự án của bạn.
Bài viết liên quan