我刚遇到一种情况,我必须将多条记录插入数据库。我的记录在通用列表中,现在我找到了两种插入多条记录的方法。
我只是像往常一样使用 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 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/