【问题标题】:Best Way to insert multiple records in Database在数据库中插入多条记录的最佳方法
【发布时间】:2019-05-08 20:40:49
【问题描述】:

我刚遇到一种情况,我必须将多条记录插入数据库。我的记录在通用列表中,现在我找到了两种插入多条记录的方法。

  1. 我只是像往常一样使用 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();
         }
        }
         }
    
  2. 我尝试使用 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


【解决方案1】:

使用 SQL Server 2008 中引入的 Table-Valued Parameters (TVP)。在 SQL Server 2008 之前,无法将存储过程中的表变量作为参数传递,在 SQL Server 之后我们现在可以传递 Table- Valued Parameter 将多行数据发送到存储过程或函数,而无需创建临时表或传递如此多的参数。看看下面的例子

CREATE TYPE UT_Employee AS TABLE  
(  
Emp_Id int NOT NULL,  
EmployeeName nvarchar(MAX),  
EmpSalary varchar(50),  
StateId varchar(50),  
CityId varchar(50)  
)  

CREATE PROCEDURE USP_Insert_Employee_Info
(
  @Employee_Details [UT_Employee] READONLY
)  
AS  
BEGIN  

INSERT INTO dbo.Employee  
(  
Emp_Id,  
EmployeeName,  
EmpSalary,  
StateId,  
CityId  
)  
SELECT * FROM @Employee_Details  
END 

将多个值插入到存储过程中,如下所示

DECLARE @Employee_Details AS UT_Employee
INSERT INTO @Employee_Details 
SELECT 1001,'Abcd',10000,101,21 UNION ALL
SELECT 1002,'dggg',20000,121,15 UNION ALL
SELECT 1003,'esse',22222,122,35 UNION ALL
SELECT 1004,'uyyy',44333,121,32 UNION ALL
SELECT 1005,'dghd',13233,656,87 

EXEC dbo.USP_Insert_Employee_Info @Employee_Details = @Employee_Details

【讨论】:

    【解决方案2】:

    我通常会为此使用表值参数。如何做到这一点的解释有点长,但请查看 Microsoft Docs 上的 Table-Valued Parameters 了解如何做到这一点。

    【讨论】:

    • 这很有帮助!!
    • 感谢分享。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    相关资源
    最近更新 更多