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

Pra*_*een 61 c# sql-server dapper

使用,我如何插入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
}
Run Code Online (Sandbox Code Playgroud)

我熟悉使用dapper获取数据,但这是我第一次尝试使用插入查询.

我尝试了以下代码,使用Exceute链接查询但坚持循环; 我认为使用dapper工具,不需要循环语句.

connection.Execute(processQuery ... );
Run Code Online (Sandbox Code Playgroud)

编辑:

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; }
    }
Run Code Online (Sandbox Code Playgroud)

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

Han*_*ney 113

你必须做一点不同的事情.在Dapper中,它匹配常规AKA属性或字段名称与SQL参数相同.所以,假设你有一个MyObject:

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

    public string B { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

假设processList = List<MyObject>,你想要这样做

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

请注意,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 });
}
Run Code Online (Sandbox Code Playgroud)

编辑:

Per Marc Gravell的评论,你也可以让Dapper为你做循环:

string processQuery = "INSERT INTO PROCESS_LOGS VALUES (@A, @B)";        
connection.Execute(processQuery, processList);
Run Code Online (Sandbox Code Playgroud)

  • 实际上,鲜为人知的事实是:dapper将为你重复*; 中间的一个可以是:`connection.Execute("INSERT INTO PROCESS_LOGS VALUES(@A,@ B)",processList);` (102认同)
  • 有没有办法用Dapper模拟`(@ a1,@ b1),(@ a2,@ b2)` 我正在尝试使用SQL Server`MERGE tble USING VALUES(('a1','b1'),('a2','b2'))AS foo(a,b)ON tble.a = foo.a WHEN相关...`.如果不是,我宁愿迭代并运行许多语句而不是使用临时表,但是Dapper创建我的括号列表会非常好.我怀疑它是特定于供应商的.虽然MySQL使用逗号分隔的括号来执行多行插入,所以可能不是吗?(`INS INTO tbl(a,b)VALUES(a1,b1),(a2,b2)`). (5认同)
  • 我的上帝,马克,你永远不会让我惊讶.现在我必须重新检查我在过去10天内编写的所有代码.(因为我决定尝试这个小宝石) (3认同)
  • @DavidH 我认为不需要循环? (2认同)
  • @Mackan dapper不会,但LINQ:使用`listOfChildren.Select(childId => new {A = parentId,B = childId})`作为arg (2认同)
  • 任何人都知道这是否会对 SQL Server 进行 n 次往返/执行,或者是否巧妙地创建 1 个具有多个插入的插入语句?当然,前者的效率会非常低,特别是如果列表很长的话?! (2认同)

Tha*_*oce 20

我相信批量插入比迭代列表并逐个插入更好.

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();
Run Code Online (Sandbox Code Playgroud)

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

  • 我不相信这是批量插入。单独的插入已完成。请参阅您提供的链接中的评论。 (4认同)