2013-06-17 15 views
39

Utilizzando , come è possibile inserire un database C# List nel database. Precedentemente senza dapper Ho utilizzato il codice seguente per inserire i valori di Elenco nel database.Come inserire un elenco C# nel database utilizzando 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 
    } 

ho familiarità con il recupero dei dati utilizzando azzimato ma questo è il mio primo tentativo utilizzando Query inserto.

Ho provato il codice seguente, utilizzando Exceute collegato alla query ma bloccato con il ciclo; Penso che usando lo strumento dapper, non ci sia bisogno di istruzioni di looping.

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

Si prega di consigli su questo. FYI: Sto usando SQL Server 2008

Grazie in anticipo.

risposta

73

Dovresti farlo in modo un po 'diverso. In Dapper, corrisponde alla convenzione AKA o ai nomi dei campi identici ai parametri SQL. Quindi, supponendo che hai avuto un MyObject:

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

    public string B { get; set; } 
} 

e assumendo processList = List<MyObject>, che ci si vuole fare questo

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

Si noti che i nomi di proprietà MyObject A e B partita i nomi dei parametri SQL @a e @B.

Se non si desidera rinominare gli oggetti, è possibile utilizzare i tipi anonimi per fare le mappature invece di tipi concreti:

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:

commento

Per Marc Gravell, si può anche aver Dapper fare il loop per voi:

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

In realtà, fatto poco noto: Dapper si iterare * per voi *; quello centrale può essere: 'connection.Execute (" INSERT INTO PROCESS_LOGS VALUES (@A, @B) ", processList);' –

+1

@DavidH Ho pensato che non ci sarebbe bisogno di cicli? – Praveen

+0

@MarcGravell - fantastico, non lo sapevo. Abbiamo creato un elegante wrapper su Dapper nel mio lavoro (che internamente chiamiamo DapperWrapper, haha) e offre operazioni CRUD. Non abbiamo avuto bisogno di inserimenti/aggiornamenti/ups in blocco, quindi non abbiamo mappato il metodo. Roba buona! – Haney

5

credo che l'inserimento di massa è meglio di iterare l'elenco e l'inserto uno per uno.

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

Riferimento: https://stackoverflow.com/a/12609410/1136277

Problemi correlati