1. ホーム
  2. c#

[解決済み] Dapper.NETを使用してC#のリストをデータベースに挿入する方法

2023-01-12 11:46:34

質問

使用方法 ダッパー を挿入するには、どのようにすればよいのでしょうか? C# 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
}

を使ってデータを取得することはよく知られています。 ダッパー を使うことは知っていますが、今回初めて インサートクエリ .

私は以下のコードを試してみました。 Exceute を使ってみたのですが、ループしてしまいました。

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

アドバイスをお願いします。 ご参考までに。 私が使っているのは 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 });
}

EDITです。

Marc Gravellのコメントにより、Dapperにループをさせることも可能です。

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