La consulta de actualización no tiene nada

asp.net-mvc c# dapper ms-access orm

Pregunta

Estoy intentando llamar a la siguiente consulta (los parámetros están en orden alfabético):

public const string UpdateSample =
    @"UPDATE subReceivingQC
      SET Clerk=@Clerk, Comments=@Comments, CommentsProd=@CommentsProd, GRV=@GRV, 
          MassOff=@MassOff, PalletID=@PalletID, PalletSeq=@PalletSeq, PONo=@PONo, 
          QCDate=@QCDate, QtyInspected=@QtyInspected, SampleNo=@SampleNo, 
          StatusClerk=@StatusClerk, StatusSupervisor=@StatusSupervisor, Supervisor=@Supervisor
      WHERE GRV=@GRV AND PalletSeq=@PalletSeq AND SampleNo=@SampleNo;";

Usando este método:

internal int UpdateSample(Sample sample)
{
    using (var db = new OleDbConnection(ConnectionString))
    {
        var query = Constants.UpdateSample;
        return db.Execute(query, sample);
    }
}

El comando Execute() tiene éxito (en el sentido de que no aparecen excepciones), pero UpdateSample sigue UpdateSample 0 y la entrada de la base de datos permanece sin cambios.

He utilizado este patrón exacto para otras operaciones de DB ( INSERT y SELECT ) sin ningún problema.

Los únicos problemas relacionados que puedo encontrar se resolvieron ordenando los parámetros en la consulta (los míos ya clasificados).

¿Alguien tiene alguna idea de lo que está sucediendo aquí, o cómo puedo seguir depurando esto?

Siguiendo con el comentario de Steve, no he incluido ningún código para agregar parámetros al comando, ya que tengo la impresión de que se obtienen automáticamente del Model .


Propiedades disponibles en el modelo de Sample :

public class Sample : IGriddable
{
    public string[] ColumnHeaders { get; } = new string[] { "SampleNo", "QCDate", "StatusClerk", "StatusSupervisor" };
    public string RowLinkPrefix { get { return $"/receiving/{Pallet.Grv.GRVNo}/{Pallet.PalletSeq}/"; } }
    public bool Selectable { get; } = true;

    public Pallet Pallet { get; set; }

    public string Clerk { get; set; }
    public string MassOff { get; set; }
    public string CommentsProd { get; set; }
    public string QtyInspected { get; set; }
    public string Supervisor { get; set; }
    public string Comments { get; set; } 

    public string SampleNo { get; set; }
    public string StatusClerk { get; set; }
    public string StatusSupervisor { get; set; }
    public string ProductSpec { get; set; }

    // For required db params
    public string GRV { get; set; }
    public string PalletID { get; set; }
    public string PalletSeq { get; set; }
    public string PONo { get; set; }

    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
    public DateTime QCDate { get; set; }

    // Each defect status needs to be saved as a (DB)subQCItems item
    public List<QCItem> Defects { get; set; } = new List<QCItem>();
    public List<string> ImagePaths { get; set; } = new List<string>();
}

Respuesta aceptada

OleDb requiere que pase los parámetros en el mismo orden exacto en que los presenta en el texto de comando. Si no lo haces, entonces se podrían usar valores incorrectos para la declaración WHERE y, si no tienes suerte, podrías terminar para cambiar un registro incorrecto, o simplemente no actualizar nada.

Lamentablemente, Dapper no tiene en cuenta esto en sus algoritmos utilizados para preparar el comando. El servidor Sql y otros proveedores con parámetros nombrados y sin restricciones sobre el orden no tienen este problema. En cambio, agregar el código para crear y ordenar correctamente los parámetros en función de su texto de consulta podría ser muy costoso para las actuaciones.
Creo que pensaron que esto no valía la pena y que simplemente puedes resolver el problema definiéndote los parámetros.

Así que está solo en este punto y debería usar la versión de Execute que toma un parámetro DynamicParameters

using (var db = new OleDbConnection(ConnectionString))
{
    var query = Constants.UpdateSample;

    DynamicParameters pars = new DynamicParameters();
    pars.Add("@Clerk", sample.Clerk, DbType.String);
    // ... and so on for all parameters following the order of the placeholders

    // but end with ....
    pars.Add("@GRV", sample.GRV, DbType.String);
    pars.Add("@PalletSeq", sample.PalletSeq, DbType.String);
    pars.Add("@SampleNo", sample.SampleNo, DbType.String);

    return db.Execute(query, pars);
}

Respuesta popular

qué base de datos estás usando? si SQL Server, use el Analizador de SQL para averiguar la consulta exacta que se está ejecutando.

si no está utilizando SQL Server, intente ejecutar la consulta usted mismo en la base de datos sin oledb. Probablemente es un problema de parámetro en el que la cláusula where no da ningún resultado. ¿Qué valor tienen @GRV, @PalletSeq y @SampleNo? si no hay registros que coincidan con esa combinación, obviamente no pasa nada



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é