首页 / .NET / 正文

[Dapper].NET/C#程序开发中使用Dapper批量插入数据集合的方法应该如何实现?

10698 发布于: 2018-02-03 读完约需7分钟

问题描述

使用Dapper如何向数据库中批量插入数据或者说使用Dapper如何插入一个集合(List<T>),在没有使用Dapper(使用Ado.net)的情况下,我们通常的实现方式如下:

try
    {
        connection.Open();
            for (int i = 0; i < processList.Count; i++)
            {
                string processQuery = "INSERT INTO PROCESS_LOGS VALUES (@Id, @st_Time, @ed_Time, @td_Time)";
                command = new SqlCommand(processQuery, connection);
                command.Parameters.Add("Id", SqlDbType.Int).Value = processList[i].ID;
                command.Parameters.Add("st_Time", SqlDbType.DateTime).Value = processList[i].ST_TIME;
                command.Parameters.Add("ed_Time", SqlDbType.DateTime).Value = processList[i].ED_TIME;
                command.Parameters.Add("td_Time", SqlDbType.DateTime2).Value = processList[i].TD_TIME;
                dataReader.Close();
                dataReader = command.ExecuteReader();
            }
        connection.Close();
    }
catch (SqlException ex)
    {
        //--Handle Exception
    }

Dapper中,是否有一种方式,可以批量向数据库中写入一个数据集合,而不需要进行循环就可以完成,比如这样的:

connection.Execute(processQuery ... );

示例涉及到的实体类:

ProcessLog.cs

class ProcessLog
    {
        public int ID { get; set; }
        public DateTime ST_TIME { get; set; }
        public DateTime ED_TIME { get; set; }
        public DateTime TD_TIME { get; set; }
        public string frequency { get; set; }
    }

方案一

创建一个实体类:

public class MyObject
{
    public int A { get; set; }

    public string B { get; set; }
}

然后,循环调用DapperExecute方法:

foreach (var item in processList)
{
    string processQuery = "INSERT INTO PROCESS_LOGS VALUES (@A, @B)";
    connection.Execute(processQuery, item);
}

以上的参数@A,@B 需要与实体类的属性一一对应,如果不想重命名参数,你也可以这样:

foreach (var item in processList)
{
    string processQuery = "INSERT INTO PROCESS_LOGS VALUES (@A, @B)";
    connection.Execute(processQuery, new { A = item.A, B = item.B });
}

当然,以上实现只是常规的方式,你也可以使用Dapper的批量插入方法,在Execute(...)方法的第二个参数中传入集合即可,如:

string processQuery = "INSERT INTO PROCESS_LOGS VALUES (@A, @B)";
connection.Execute(processQuery, processList);

方案二

使用事务处理和执行集合参数:

SqlTransaction trans = connection.BeginTransaction();

connection.Execute(@"
insert PROCESS_LOGS(Id, st_Time, ed_Time, td_Time)
values(@Id, @st_Time, @ed_Time, @td_Time)", processList, transaction: trans);

trans.Commit();

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: [Dapper].NET/C#程序开发中使用Dapper如何将查询的结果集映射到一个字典中?

下一篇: [Linq].NET/C#程序开发中使用Linq在不创建新对象的情况下如何修改集合元素中的某个指定属性的值?

本文永久链接码友网 » [Dapper].NET/C#程序开发中使用Dapper批量插入数据集合的方法应该如何实现?

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册