Comment insérer une liste C # dans la base de données à l'aide de Dapper.NET

c# dapper sql-server

Question

En utilisant , comment puis-je insérer une liste C# List dans la base de données? Auparavant, sans dapper, j'ai utilisé le code ci-dessous pour insérer les valeurs de la liste dans la base de données .

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
}

Je suis familier avec l'extraction des données à l'aide de dapper, mais ceci est mon premier essai en utilisant la requête d'insertion .

J'ai essayé le code ci-dessous, en utilisant Exceute lié à la requête mais collé avec le bouclage; Je pense en utilisant l'outil Dapper, il n'y a pas besoin de déclaration en boucle.

connection.Execute(processQuery ... );

MODIFIER:

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

S'il vous plaît des conseils à ce sujet. FYI: J'utilise SQL Server 2008 .

Réponse acceptée

Vous devriez le faire un peu différemment. Dans Dapper, les noms de champs ou de propriétés AKA conventionnels sont identiques aux paramètres SQL. Donc, en supposant que vous avez un MyObject :

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

    public string B { get; set; }
}

Et en supposant que processList = List<MyObject> , vous voulez le faire

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

Notez que les noms de propriétés MyObject A et B correspondent aux noms de paramètres SQL @A et @B.

Si vous ne souhaitez pas renommer d'objets, vous pouvez utiliser des types anonymes pour effectuer les mappages au lieu de types concrets:

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

MODIFIER:

Selon le commentaire de Marc Gravell, Dapper peut également faire la boucle pour vous:

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

Réponse populaire

Je crois que l'insertion en bloc est préférable à l'itération de la liste et à l'insertion un par un.

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

Référence: https://stackoverflow.com/a/12609410/1136277



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi