複数ステートメント操作

Dapper 複数ステートメント操作 QueryMultiple

  1. QueryMultiple():1つの接続で複数のSQLクエリを実行し、複数の結果セットをまとめて取得します。
  2. 複数のSQL文はセミコロン ;で区切ります。
  3. 戻り値の型は GridReader で、.Read<T>() を呼び出して記述順に各テーブルのデータを読み取ります。
  4. メリット:データベース接続が1回だけ確立され、複数回実行時のネットワークコストを抑えられます。

サンプル

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. 結果セットの数を超えてReadを呼び出さないでください。
  3. MySQLの場合、接続文字列で複文実行が有効になっているか確認してください(標準で有効の場合が多い)。
  4. QueryMultipleSELECTクエリに適しています。登録・更新・削除を混在させる場合は注意が必要で、トランザクションの利用を推奨します。

パラメータ付き複数文クエリ

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)

複数ステートメント操作

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です