Cómo insertar una lista C # en la base de datos usando Dapper.NET

c# dapper sql-server

Pregunta

Usando , ¿cómo puedo insertar una C# List en la base de datos? Anteriormente, sin dapper , utilicé el siguiente código para insertar los valores de la Lista en la base de datos .

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
}

Estoy familiarizado con la obtención de datos utilizando dapper, pero esta es mi primera prueba usando Insertar consulta .

Intenté el siguiente código, usando Exceute vinculado a la consulta, pero metido en el bucle; Creo que con la herramienta dapper, no hay necesidad de declaración de bucle.

connection.Execute(processQuery ... );

EDITAR:

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

Por favor, consejos sobre esto. FYI: estoy usando SQL Server 2008 .

Respuesta aceptada

Tendrás que hacerlo un poco diferente. En Dapper, coincide con la convención AKA propiedad o los nombres de campo que son idénticos a los parámetros de SQL. Entonces, suponiendo que tengas un MyObject :

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

    public string B { get; set; }
}

Y asumiendo processList = List<MyObject> , querrías hacer esto

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

Tenga en cuenta que los nombres de propiedad MyObject A y B coinciden con los nombres de los parámetros SQL @A y @B.

Si no desea cambiar el nombre de los objetos, puede usar tipos anónimos para realizar las asignaciones en lugar de los tipos concretos:

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

EDITAR:

Por el comentario de Marc Gravell, también puedes hacer que Dapper te haga un bucle:

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

Respuesta popular

Creo que la inserción masiva es mejor que repetir la lista e insertar una por una.

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

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



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow