更新查询无效

时间:2017-05-06 20:50:26

标签: c# asp.net-mvc ms-access orm dapper

我试图调用以下查询(参数按字母顺序排列):

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

使用此方法:

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

Execute()命令成功(因为没有出现异常),但UpdateSample不断返回0,数据库条目保持不变。

我已经将这个确切的模式用于其他数据库操作(INSERTSELECT)而没有任何问题。

我能找到的唯一相关问题是通过对查询中的参数进行排序来解决的(我的已经排序)。

有没有人对这里发生的事情有任何见解,或者我如何调试这个?

继Steve的评论之后,我没有包含任何为命令添加参数的代码,因为我认为这些代码是从Model自动获得的。

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

2 个答案:

答案 0 :(得分:3)

OleDb要求您按照在命令文本中显示参数的相同顺序传递参数。如果你不这样做,那么错误的值可以用于WHERE语句,如果你运气不好,你可能会改变错误的记录,或者只是你不会更新任何东西。

不幸的是,Dapper在用于准备命令的算法中没有考虑到这一点。具有命名参数的Sql Server和其他提供程序没有关于命令的约束,不会出现此问题。而是根据查询文本添加代码来创建和正确排序参数,这对于演出来说可能是非常昂贵的 我相信他们认为这不值得付出努力,你可以简单地解决自己定义参数的问题。

所以你在这一点上是独立的,你应该使用带有DynamicParameters参数的Execute版本

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

答案 1 :(得分:1)

你正在使用哪个数据库? 如果是SQL Server,请使用SQL事件探查器找出正在执行的确切查询。

如果您不使用SQL Server,请尝试在没有oledb的数据库中自己执行查询。 它可能是一个参数问题,其中where子句不会导致任何结果。 @ GRV,@ FontSeq和@SampleNo有哪些值? 如果没有记录与该组合匹配,显然没有任何反应