Dapper 多陳述式操作 QueryMultiple
QueryMultiple():透過單一連線執行多筆SQL查詢,一次傳回多個結果集。- 多筆SQL陳述式請使用分號
;做分隔。 - 傳回型別為
GridReader,呼叫.Read<T>()依照順序逐筆讀取各個資料表的內容。 - 優點:只建立一次資料庫連線,降低多次查詢帶來的網路額外負荷。
範例
using System;
using System.Collections.Generic;
using System.Data;
using MySql.Data.MySqlClient;
using Dapper;
using System.Configuration;
namespace ConsoleApp4
{
public class Customers
{
public int CustomerID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
}
public class Book
{
public string Title { get; set; }
}
class Program
{
static void Main(string[] args)
{
var connStr = ConfigurationManager.ConnectionStrings["CustomerConnection"].ConnectionString;
using (IDbConnection db = new MySqlConnection(connStr))
{
// 多筆SQL使用分號隔開
string sql = "SELECT * FROM Customers; SELECT * FROM Book;";
// 取得多結果讀取器
var multiReader = db.QueryMultiple(sql);
// 依照SQL撰寫順序依序讀取
IEnumerable<Customers> customerList = multiReader.Read<Customers>();
IEnumerable<Book> bookList = multiReader.Read<Book>();
multiReader.Dispose(); // 釋放讀取器資源
}
Console.ReadKey();
}
}
}Code language: C# (cs)
- 讀取順序必須和SQL順序完全一致
先撰寫的SELECT一定要優先Read,順序錯亂就會發生錯誤。 - 不要執行超出SQL結果集數量的Read呼叫。
- MySQL需確認連線字串已開啟多陳述式支援(預設大多數情況已開啟)。
QueryMultiple僅適用SELECT查詢;混和增刪改的SQL要謹慎使用,建議改用交易機制。
帶參數的多陳述式查詢
string sql = "SELECT * FROM student WHERE Id=@id; SELECT * FROM book WHERE Id=@id;";
using var multiReader = db.QueryMultiple(sql, new { id = 1 });
var stu = multiReader.ReadFirstOrDefault<Student>();
var book = multiReader.ReadFirstOrDefault<Book>();Code language: C# (cs)
多陳述式操作
Previous: IN 查詢
Next: JOIN 多資料表關聯查詢