データを部分的に更新する

c# dapper

質問

与えられたデータベーステーブルのユーザ、(名前、家族名、年齢、性別)。私は更新ステートメントを作成したいのですが、これらの列のいずれかがヌルになる可能性があります。クライアントはオブジェクト{名前、家族名、年齢、性別}を作成します。変更されたプロパティのみが入力されるので、基本的にはクエリの作成方法とデータの送信方法を推測する方法を探しています。

私はすべての行を取得し、クライアントから受け取ったオブジェクトとのデータをマージする以外に、この問題をどのように処理するかを知りません。これまでのところ私がやったことです:select> merge> update。

他の方法はありますか?

受け入れられた回答

あなたのUserクラスがこのようなものだとします

public class User
{
    public int UserID { get; set; }
    public string Name {get; set;}
    public string FamilyName {get;set;}
    public int? Age { get; set; }
    public string Sex { get; set; }

}

(対応するフィールドにヌル値を挿入できるようにするには、 Nullable<int>として定義されたintフィールドに注意してください)

今度は、ヌルプロパティのヌル値を反映するフィールドを設定するコードは、単に通常の更新と書くことができます。ヌル値をパラメータとして渡すために必要なものはすべて、Dapper内部で行われます

// Initialize just two fields and leave the other to their defaults
// (null for both strings and nullable ints)
User u = new User();
u.UserID = 1;
u.Name = "Steve";
bool ok = UpdateUser(u);
if(ok) ......


public UpdateUser(User info)
{
    using(SqlConnection cnn = new SqlConnection(@"Data Source=(LOCAL);
                                                Initial Catalog=TestDB;
                                                Integrated Security=True;"))
    {
        cnn.Open();

        // Prepare the parameters to pass to Dapper Execute 
        var pms = new
        {
           UserID = info.UserID   
           FirstName = info.Name,
           FamilyName = info.FamilyName,  // <- this is null
           Age = info.Age,                // <- this is null
           Sex = info.Sex                 // <- this is null
        };

        int rows = cnn.Execute(@"UPDATE [UserTable] 
                                 SET FirstName= @FirstName,
                                     LastName = @LastName, 
                                     Age = @Age, 
                                     Sex = @Sex
                                 WHERE UserID = @UserID",
                                 pms);
         return rows != 0;
    }
}


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow