dapper を使用して、C# List
をデータベースに挿入するにはどうすればよいですか。以前はdapperなしで、以下のコードを使用してにデータベースにリスト値を挿入しました。
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 query。
クエリにリンクされたExceute
を使用して以下のコードを試しましたが、ループが発生しました。 dapperツールを使用すると、ステートメントをループする必要はないと思います。
connection.Execute(processQuery ... );
編集:
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
を使用しています。
少し違ったやり方をしなければなりません。 Dapperでは、慣習上、プロパティまたはフィールド名が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 });
}
編集:
Marc Gravellのコメントごとに、Dapperにループを実行させることもできます。
string processQuery = "INSERT INTO PROCESS_LOGS VALUES (@A, @B)";
connection.Execute(processQuery, processList);
一括挿入は、リストを繰り返して1つずつ挿入するよりも優れていると思います。
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();