Dapper 複数ステートメント操作 QueryMultiple
QueryMultiple():1つの接続で複数のSQLクエリを実行し、複数の結果セットをまとめて取得します。- 複数のSQL文はセミコロン
;で区切ります。 - 戻り値の型は
GridReaderで、.Read<T>()を呼び出して記述順に各テーブルのデータを読み取ります。 - メリット:データベース接続が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)
- 読み取り順はSQLの順番と厳密に一致させる必要があります
先に記述したSELECTからReadしなければならず、順番が狂うとエラーが発生します。 - 結果セットの数を超えてReadを呼び出さないでください。
- MySQLの場合、接続文字列で複文実行が有効になっているか確認してください(標準で有効の場合が多い)。
QueryMultipleはSELECTクエリに適しています。登録・更新・削除を混在させる場合は注意が必要で、トランザクションの利用を推奨します。
パラメータ付き複数文クエリ
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 による複数テーブル結合クエリ