我试图调用以下查询(参数按字母顺序排列):
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
,数据库条目保持不变。
我已经将这个确切的模式用于其他数据库操作(INSERT
和SELECT
)而没有任何问题。
我能找到的唯一相关问题是通过对查询中的参数进行排序来解决的(我的已经排序)。
有没有人对这里发生的事情有任何见解,或者我如何调试这个?
继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>();
}
答案 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,请尝试在没有oledb的数据库中自己执行查询。 它可能是一个参数问题,其中where子句不会导致任何结果。 @ GRV,@ FontSeq和@SampleNo有哪些值? 如果没有记录与该组合匹配,显然没有任何反应