it-swarm.com.de

Einfügen einer C # -Liste in eine Datenbank mit Dapper.NET

Wie kann ich mit dapper einen C# List In die Datenbank einfügen? Zuvor ohne dapper habe ich den folgenden Code verwendet, um die Listenwerte in die Datenbank einfügen = .

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
}

Ich bin mit dem Abrufen der Daten mit dapper vertraut, aber dies ist mein erster Versuch mit insert query .

Ich habe den folgenden Code mit Exceute ausprobiert, der mit der Abfrage verknüpft ist, aber ich habe mich mit der Schleife aufgehalten. Ich denke, mit Dapper Tool gibt es keine Notwendigkeit für die Schleifenanweisung.

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

Bitte beraten Sie diesbezüglich. FYI: Ich verwende SQL Server 2008.

59
Praveen

Du müsstest es ein bisschen anders machen. In Dapper entspricht es der Konvention, dass AKA-Eigenschafts- oder -Feldnamen mit SQL-Parametern identisch sind. Angenommen, Sie hatten ein MyObject:

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

    public string B { get; set; }
}

Und unter der Annahme, processList = List<MyObject>, Du würdest das machen wollen

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

Beachten Sie, dass die MyObject -Eigenschaftsnamen A und B mit den SQL-Parameternamen @A und @B übereinstimmen.

Wenn Sie Objekte nicht umbenennen möchten, können Sie anonyme Typen anstelle konkreter Typen verwenden, um die Zuordnungen vorzunehmen:

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 Gravells Kommentar können Sie auch Dapper die Schleife für Sie machen lassen:

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

Ich glaube, die Masseneinfügung ist besser, als die Liste zu wiederholen und eine nach der anderen einzufügen.

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

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

13
Thalles Noce