Как вставить список С# в базу данных с помощью Dapper.NET
Использование dapper, как я могу вставьте C# List
в базу данных. Ранее без dapper я использовал приведенный ниже код для вставки значений List в базу данных.
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
}
Я знаком с извлечением данных с помощью dapper, но это моя первая попытка с помощью запроса insert.
Я попробовал приведенный ниже код, используя 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
Спасибо заранее.
Ответы
Ответ 1
Вам придется сделать это по-другому. В 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 для цикла:
string processQuery = "INSERT INTO PROCESS_LOGS VALUES (@A, @B)";
connection.Execute(processQuery, processList);
Ответ 2
Я считаю, что основная вставка лучше, чем повторять список и вставлять один за другим.
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();
Ссылка: fooobar.com/info/100819/...