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

使用小巧 ,我怎样才能插入一个C# 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 } 

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

我尝试了下面的代码,使用Exceute链接查询,但坚持循环; 我觉得使用小巧工具,不需要循环语句。

 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

提前致谢。

你必须做一点不同的事情。 在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。

如果您不想重命名对象,则可以使用匿名types来执行映射,而不是使用具体的types:

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

编辑:

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

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

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