使用Dapper更新数据库

时间:2016-11-30 17:35:07

标签: c# ado.net dapper

我不知道是否可行。 假设我有这个课程:

public class Student
{
    public int Id{get;set;}
    public string FirstName{get;set;}
    public string LastName{get;set;}

    public int UpdateStudent(Student student)
    {
        string sql="Update Student set FirstName=@FirstName, LastName=@LastName where Id=@Id";
        Dapper.Execute(sql, student)
    }
}

现在,在调用代码上,我会有类似的东西:

Student student=new Student();
student.Id=1;
student.FirstName="abc";
student.UpdateStudent(student);

现在,如果我们要更新Student并仅提供IdFirstName,则会产生错误,我还需要提供LastName 。我正在寻找可以使用的解决方案,即使我没有指定Student.LastName,它仍然会进行更新,因为我没有指定LastName,{{1}将保持不变。

1 个答案:

答案 0 :(得分:0)

好的,这是一个快速而又脏的:

  

我没有编译或测试它,所以它可能有一个拼写错误

public static void UpdateFromItem(string tableName, object updatevalues, object selectorvalue)
  {
    string updateStr=new String();
    string whereStr=new String();

    foreach (PropertyInfo prop in updatevalues.GetType().GetProperties())
    {
        if (prop.GetValue(parms, null) != null)
          updateStr.AppendFormat(" %s=%s",prop.Name, prop.GetValue(parms, null));
    }

    foreach (PropertyInfo prop in selectorvalues.GetType().GetProperties())
    {
        if (prop.GetValue(parms, null) != null)
          updateStr.AppendFormat(" %s=%s",prop.Name, prop.GetValue(parms, null));
    }


    string sqlStmt=string.Format(@"UPDATE %s SET %s WHERE %s",tableName, updateStr,wherreStr);

    Drapper.Execute(sqlStmt);
  }

像这样称呼

  UpdateFromItem("Student", new { FirstName : "abc"}, new { Id : 1 });

我上面做了一个通用的解决方案,你也可以知道"关于学生对象的id字段,然后像这样的解决方案将起作用:

  public static void UpdateStudent(Student inobj)
  {
    string updateStr=new String();
    string whereStr=string.Format(@"Id=%s",inobj.Id);

    foreach (PropertyInfo prop in inobj.GetType().GetProperties())
    {
        if ((prop.GetValue(parms, null) != null) && (prop.Name != 'Id'))
          updateStr.AppendFormat(" %s=%s",prop.Name, prop.GetValue(parms, null));
    }

    string sqlStmt=string.Format(@"UPDATE %s SET %s WHERE %s",tableName, updateStr,wherreStr);

    Drapper.Execute(sqlStmt);
  }

人们会指出这是注射风险。这可以通过编写参数列表来解决 - 但我认为你明白了。基本上你需要一个循环。

这并不困难,你需要一个if语句,如下所示:

if (student.lastName.IsNullOrEmpty())
  Dapper.Execute("Update Student set FirstName=@FirstName where Id=@Id", student);
else
  Dapper.Execute("Update Student set FirstName=@FirstName, LastName=@LastName where Id=@Id", student);