【发布时间】:2019-05-08 20:40:49
【问题描述】:
我刚遇到一种情况,我必须将多条记录插入数据库。我的记录在通用列表中,现在我找到了两种插入多条记录的方法。
-
我只是像往常一样使用 ExecuteNonQuery 并使用 foreach 循环逐个插入每条记录(我认为这不是最好的方法,因为这种方式会多次访问数据库以插入记录)。
using (SqlCommand cmd = new SqlCommand() { using (SqlConnection conn = new SqlConnection() { cmd.Connection = conn; foreach (var entry in entries) { cmd.CommandText = "INSERT INTO Employees(id, name) VALUES (@id,@name);"; cmd.Parameters.AddWithValue("@id", entry.Id); cmd.Parameters.AddWithValue("@name", entry.Name); cmd.ExecuteNonQuery(); } } } -
我尝试使用 SqlBulkCopy 类,我将通用列表转换为 DataTable 并使用了 SqlBulkCopy。
using (SqlConnection con = new SqlConnection(consString)) { using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con)) { sqlBulkCopy.DestinationTableName = "Employees"; con.Open(); sqlBulkCopy.WriteToServer(dt); con.Close(); } }
这两种方法都完成了预期的工作。但我想知道哪种方法最好。如果有任何其他更好的方法可以做到这一点,我愿意接受建议。
【问题讨论】:
-
批量复制是目前最快的,但如果出现错误,它将导致整个批处理失败。当操作变得丑陋时,使用纯 SQL(首选)会给您更大的灵活性,并且会在每次插入时触发触发器(如果有),与基于集合的插入和如果您正在使用交易,也可以使用。
-
我强烈建议您考虑使用 ORM(如 Entity 或 NHibernate),特别是如果您计划在 C# 上处理许多不同的表,包括更新、插入或删除。它们可能不是最快的(尽管足够快),但在 C# 中处理数据会容易得多。
-
实际上我有 4 个表,我必须为其插入批量数据。实体可能会做我认为的工作。我从来没有想过。非常感谢。
-
不要使用addwithvalue
-
@SMor 不知道 addwithvalue 背后的邪恶,'command.Parameters.Add()' 应该是好的!!
标签: c# sql-server