Actualización de la base de datos usando Dapper

ado.net c# dapper

Pregunta

No sé si esto es posible en . Digamos que tengo esta clase:

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

Ahora, en el código de llamada, tendré algo como esto:

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

Ahora, si vamos a actualizar el Student y solo proporcionamos Id y FirstName , arrojará un error que también deberá proporcionar el LastName . Busco a una solución que puede ser el uso que, aunque si no se especifica la Student.LastName , todavía va a hacer la actualización y ya que no se especifica el LastName , el Student.LastName seguirá siendo el mismo.

Respuesta popular

Ok aquí es un rápido y sucio:

No compilé ni probé esto, así que podría tener un error tipográfico

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

Llámalo así

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

Hice una solución genérica anterior, también podría "saber" sobre el campo de identificación para el objeto del estudiante específicamente, entonces una solución como esta funcionaría:

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

La gente señalará que esto tiene riesgo de inyección. Eso se puede resolver componiendo una lista de parámetros, pero creo que entiendes la idea. Básicamente, necesitas un bucle.



Esto no es difícil. Necesitarás una declaración if, algo como esto:

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


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué