Лучший способ вставить несколько записей в базу данных - PullRequest
4 голосов
/ 08 мая 2019

Я только что столкнулся с ситуацией, когда мне пришлось вставить несколько записей в базу данных.Записи, которые у меня были, были в общем списке, и теперь я нашел два способа вставить несколько записей.

  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();
            }
        }
    

Оба метода выполняют намеченную работу.Но я хочу знать, какой из них лучший.Если есть какой-то другой лучший способ сделать это, я открыт для предложений.

Ответы [ 2 ]

2 голосов
/ 08 мая 2019

Я бы обычно использовал для этого параметр с табличным значением. Объяснение того, как это сделать, немного длинно, но здесь вы можете посмотреть Табличные параметры в Microsoft Docs, как это сделать.

2 голосов
/ 08 мая 2019

Используйте параметры с табличными значениями (TVP), которые были введены в SQL Server 2008. До 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...