多语句操作

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. 不要多次Read超出SQL结果集数量。
  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)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注