如何使用Dapper.NET将C#列表插入数据库


75

使用 ,如何插入C# List数据库。以前没有dapper,我使用下面的代码将List值插入数据库

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提取数据,但这是我第一次尝试使用insert query

我尝试了下面的代码,使用Exceute链接查询,但陷入了循环;我认为使用dapper工具不需要循环语句。

connection.Execute(processQuery ... );

编辑:

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; }
    }

请对此提出建议。 仅供参考:我正在使用SQL Server 2008

Answers:


134

您必须做一些不同的事情。在Dapper中,它与约定的AKA属性或与SQL参数相同的字段名称匹配。因此,假设您有MyObject

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

    public string B { get; set; }
}

并假设processList = List<MyObject>,您要执行此操作

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

请注意,MyObject属性名称A和B与SQL参数名称@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 });
}

编辑:

根据Marc Gravell的评论,您还可以让Dapper为您完成循环:

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

141
实际上,鲜为人知的事实是:dapper会为您进行迭代;中间connection.Execute("INSERT INTO PROCESS_LOGS VALUES (@A, @B)", processList);
人物

1
@DavidH我以为不需要循环?
Praveen 2013年

4
我的天哪,马克,您永远不会停止惊叹我。现在,我必须重新检查过去10天内编写的所有代码。(因为我决定尝试使用这种小宝石)
史蒂夫·

6
有什么方法可以(@a1, @b1),(@a2, @b2)用Dapper模拟吗?我正在尝试使用SQL Server MERGE tble USING VALUES (('a1', 'b1'),('a2','b2')) AS foo(a,b) ON tble.a=foo.a WHEN MATCHED...。如果不是这样,我宁愿迭代并运行许多语句而不是使用临时表,但是Dapper创建方括号列表将非常好。我认为这是特定于供应商的,这令人怀疑。尽管MySQL使用逗号分隔的括号来进行多行插入,所以也许不是吗?(INS INTO tbl (a,b) VALUES (a1,b1),(a2,b2))。
克里斯

2
@Mackan dapper不会,但是LINQ:listOfChildren.Select(childId => new { A = parentId, B = childId})用作arg
Marc Gravell

21

我相信批量插入比迭代列表并一一插入要好。

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();

参考:https : //stackoverflow.com/a/12609410/1136277


3
我不认为这是一个大问题。个别插入完成。请参阅您提供的链接中的评论。
鲍勃·霍恩

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.