如何使用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