Truy vấn
Harness chạy SQL thuần. Bạn không bao giờ phải tham chiếu SqlParameter, NpgsqlParameter hay MySqlParameter.
Truy vấn scalar
Phần tiêu đề “Truy vấn scalar”var count = await harness.QueryScalarAsync<int>("SELECT COUNT(*) FROM orders");var newest = await harness.QueryScalarAsync<DateTimeOffset?>("SELECT MAX(placed_at) FROM orders");QueryScalarAsync<T> đọc cột đầu tiên của dòng đầu tiên. SQL NULL hoặc không có dòng nào cho ra default.
Nó hấp thụ sự khác biệt giữa các driver:
COUNT(*)làinttrên SQL Server vàbigintở nơi khác, và vẫn chuyển được sangint.- MySQL trả về
CHAR(36)còn SQL Server trả vềuniqueidentifier, và cả hai đều chuyển được sangGuid. DateTimechuyển được sangDateTimeOffset.- Kiểu đích nullable như
int?hoạt động bình thường.
Statement
Phần tiêu đề “Statement”ExecuteAsync chạy một statement và trả về số dòng bị ảnh hưởng:
var rows = await harness.ExecuteAsync( "DELETE FROM orders WHERE placed_at < @cutoff", [new DbParameterValue("@cutoff", DateTime.UtcNow.AddDays(-30))]);Tham số
Phần tiêu đề “Tham số”Truyền tham số dưới dạng danh sách DbParameterValue. Tên viết đúng như trong SQL, ví dụ @email. Cả ba driver cũng chấp nhận tên không có tiền tố @.
var count = await harness.QueryScalarAsync<int>( "SELECT COUNT(*) FROM customers WHERE email = @email", [new DbParameterValue("@email", "ada@example.test")]);Giá trị null được gửi đi dưới dạng SQL NULL.
DbParameterValue nằm trong namespace DbTest.Core.Engine.
Những nhu cầu phức tạp hơn
Phần tiêu đề “Những nhu cầu phức tạp hơn”Với reader, lời gọi stored procedure hoặc tính năng riêng của driver, hãy mở một connection:
await using var connection = await harness.OpenConnectionAsync();Mỗi helper tự mở và đóng connection của nó. OpenConnectionAsync() trả về một connection đã mở mà bạn tự dispose. CreateConnection() trả về connection chưa được mở.
Để chạy nhiều bước trên cùng một connection, dùng ExecuteOnConnectionAsync. Connection được đóng sau đó:
await harness.ExecuteOnConnectionAsync(async connection =>{ // work with the open connection here});Đọc catalog
Phần tiêu đề “Đọc catalog”harness.ListObjectsAsync() liệt kê mọi table, view và routine đúng như shape guard (bộ canh hình dạng schema) nhìn thấy: một SchemaObject gồm tên schema, tên, loại và tên các cột theo thứ tự.