2013-06-17 5 views
39

Используя , как я могу вставить C# List в базу данных. Раньше без dapper Я использовал приведенный ниже код для Вставить значение «Список» в базу данных.Как вставить список C# в базу данных с помощью Dapper.NET

try 
    {     
     connection.Open(); 
      for (int i = 0; i < processList.Count; i++) 
      { 
       string processQuery = "INSERT INTO PROCESS_LOGS VALUES (@Id, @st_Time, @ed_Time, @td_Time)"; 
       command = new SqlCommand(processQuery, connection); 
       command.Parameters.Add("Id", SqlDbType.Int).Value = processList[i].ID; 
       command.Parameters.Add("st_Time", SqlDbType.DateTime).Value = processList[i].ST_TIME; 
       command.Parameters.Add("ed_Time", SqlDbType.DateTime).Value = processList[i].ED_TIME; 
       command.Parameters.Add("td_Time", SqlDbType.DateTime2).Value = processList[i].TD_TIME; 
       dataReader.Close(); 
       dataReader = command.ExecuteReader(); 
      } 
     connection.Close(); 
    } 
catch (SqlException ex) 
    { 
     //--Handle Exception 
    } 

Я знаком с выборки данных с использованием щеголеватый, но это моя первая попытка с помощью вставки запроса.

Я пробовал приведенный ниже код, используя Exceute, связанный с запросом, но зацикленный с циклом; Я думаю, что используя инструмент dapper, нет необходимости в формулировке цикла.

connection.Execute(processQuery ...); 

EDIT:

class ProcessLog 
    { 
     public int ID { get; set; } 
     public DateTime ST_TIME { get; set; } 
     public DateTime ED_TIME { get; set; } 
     public DateTime TD_TIME { get; set; } 
     public string frequency { get; set; } 
    } 

Пожалуйста, консультации по этому вопросу. FYI: Я использую SQL Server 2008

Заранее спасибо.

ответ

73

Вам нужно будет сделать это по-другому. В Dapper он соответствует атрибуту AKA или именам полей, идентичным параметрам SQL. Таким образом, если вы имели MyObject:

public class MyObject 
{ 
    public int A { get; set; } 

    public string B { get; set; } 
} 

И если предположить processList = List<MyObject>, Вы хотите сделать это

foreach (var item in processList) 
{ 
    string processQuery = "INSERT INTO PROCESS_LOGS VALUES (@A, @B)";   
    connection.Execute(processQuery, item); 
} 

Обратите внимание, что MyObject имена свойств A и B матч имена параметров SQL @a и @B.

Если вы не хотите переименовывать объекты, вы можете использовать анонимные типы, чтобы сделать отображение вместо конкретных типов:

foreach (var item in processList) 
{ 
    string processQuery = "INSERT INTO PROCESS_LOGS VALUES (@A, @B)";   
    connection.Execute(processQuery, new { A = item.A, B = item.B }); 
} 

EDIT:

комментария

Per Marc Gravell, вы можете также у вас есть Dapper do loop:

string processQuery = "INSERT INTO PROCESS_LOGS VALUES (@A, @B)";   
connection.Execute(processQuery, processList); 
+60

На самом деле, мало известный факт: щеголеватый будет перебирать * для вас *; средним может быть: 'connection.Execute (« INSERT INTO PROCESS_LOGS VALUES (@A, @B) », processList);' –

+1

@DavidH Я думал, что не будет необходимости в циклах? – Praveen

+0

@MarcGravell - удивительный, не знал этого. Мы создали причудливую обертку над Dapper на моей работе (которую мы внутренне называем DapperWrapper, ха-ха), и он предлагает операции CRUD. У нас не было необходимости в объемных вставках/обновлениях/upserts, поэтому мы не сопоставляли этот метод. Хорошая вещь! – Haney

5

Я считаю, что основная вставка лучше, чем повторение списка и вставка по одному.

SqlTransaction trans = connection.BeginTransaction(); 

connection.Execute(@" 
insert PROCESS_LOGS(Id, st_Time, ed_Time, td_Time) 
values(@Id, @st_Time, @ed_Time, @td_Time)", processList, transaction: trans); 

trans.Commit(); 

Ссылка: https://stackoverflow.com/a/12609410/1136277

Смежные вопросы