多陳述式操作

Dapper 多陳述式操作 QueryMultiple

  1. QueryMultiple():透過單一連線執行多筆SQL查詢,一次傳回多個結果集
  2. 多筆SQL陳述式請使用分號 ;做分隔。
  3. 傳回型別為 GridReader,呼叫 .Read<T>() 依照順序逐筆讀取各個資料表的內容。
  4. 優點:只建立一次資料庫連線,降低多次查詢帶來的網路額外負荷。

範例

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)
  1. 讀取順序必須和SQL順序完全一致
    先撰寫的SELECT一定要優先Read,順序錯亂就會發生錯誤。
  2. 不要執行超出SQL結果集數量的Read呼叫。
  3. MySQL需確認連線字串已開啟多陳述式支援(預設大多數情況已開啟)。
  4. 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)

多陳述式操作

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *