c# - 在数据库中插入多条记录的最佳方法

标签 c# sql-server

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

  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 Server 2008 中引入的表值参数 (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

关于c# - 在数据库中插入多条记录的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56040349/

相关文章:

c# - 以拳击般的方式召集委托(delegate)

SQL Server Select 使用 IN() 查询并按相同顺序排序

SQL Server 根据返回的数据动态更改 SELECT 中的 WHERE 子句

sql - where子句中的位域

sql - 用计算表达式更新 sql 临时表列

c# - 使用 Writeline 创建批处理文件

c# - C# 中枚举值名称的别名

c# - RegistryView.Registry64 从 32 位 View 返回

c# - 如何在gridview右侧移动自动生成删除按钮

sql-server - Insert Update触发器如何判断是插入还是更新