使用dapper执行部分数据库更新

时间:2016-06-26 12:45:39

标签: c# dapper

给定数据库表用户,(姓名,姓氏,年龄和性别)。 我想创建一个更新语句,而这些列中的任何一个都可以为null - 不会编辑/来自某种类型的客户端。 客户端创建一个对象User {Name,FamilyName,Age,Sex},它只会填充已更改的属性,所以基本上我正在寻找一种方法来猜测如何构建查询以及如何将数据发送给它。 / p>

除了获取整行并将其与客户端收到的对象合并后,我根本不知道如何处理这个问题。到目前为止,这是我所做的:选择>合并>更新

还有其他办法吗?

1 个答案:

答案 0 :(得分:-1)

假设您的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字段允许在相应的字段中插入空值)

现在,设置字段的代码(反映null属性的空值)可以简单地写为普通更新。将空值作为参数传递所需的所有内容都由Dapper internals

完成
// 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;
    }
}