不切实际的烦人“标准表达式中的无效数据类型”

Posted

技术标签:

【中文标题】不切实际的烦人“标准表达式中的无效数据类型”【英文标题】:Unrealistically Annoying 'Invalid Data Type in Criteria Expression' 【发布时间】:2018-10-16 05:43:44 【问题描述】:

我有以下问题

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

并使用此代码插入项目

// Update sample
query = DatabaseConstants.UpdateSample;
args = new DynamicParameters();

args.Add("@Clerk", sample.Clerk, DbType.String);
args.Add("@Comments", sample.Comments, DbType.String);
args.Add("@CommentsProd", sample.CommentsProd, DbType.String);
args.Add("@MassOff", sample.MassOff, DbType.String);
args.Add("@PackOut", sample.PackOut, DbType.String);
args.Add("@PalletID", sample.PalletID, DbType.String);
args.Add("@QCDate", sample.QCDate, DbType.Date);
args.Add("@QtyInspected ", sample.QtyInspected, DbType.Decimal);
args.Add("@StatusClerk", sample.StatusClerk, DbType.String);
args.Add("@StatusSupervisor", sample.StatusSupervisor, DbType.String);
args.Add("@Supervisor", sample.Supervisor, DbType.String);
args.Add("@GRV", sample.GRV, DbType.Int64);
args.Add("@PalletSeq", sample.PalletSeq, DbType.Int16);
args.Add("@SampleNo", sample.SampleNo, DbType.Int16);

using (var db = new OleDbConnection(connectionString))

    output += db.Execute(query, args);

现在MassOffPackOut 都是double 类型,两者的Access 数据类型如下所示:

这里的奇怪之处在于代码完美地适用于属性MassOff,但是在添加PackOut 的行之后,我得到了

条件表达式中的数据类型无效

我尝试更改参数DbType.DecimalDbType.Double,但没有任何区别。

我的查询中的所有参数都与它们在数据库中出现的顺序不同,所以我认为这不是原因,因为如果没有 PackOut 值,我会看到同样的问题。

例如,当我尝试传入这些值时:

MassOff:9.5 PackOut:70.5

它适用于MassOff,但不适用于PackOut

以上帝的名义,这怎么可能?


示例类

public class Sample :
    QCObject, IGriddable

    private string imagesPath = ConfigurationManager.AppSettings["ImagesPath"];

    private string[] columnHeaders;
    public string[] ColumnHeaders 
        get
        
            if(columnHeaders.IsNullOrEmpty())
            
                return new string[]  "SampleNo", "Date", /*"QCDate",*/ "StatusClerk", "StatusSupervisor" ;
            
            else
            
                return columnHeaders;
            
        
        set  columnHeaders = value;   


    private string rowLinkPrefix;
    public string RowLinkPrefix 
    get
    
        if(string.IsNullOrWhiteSpace(rowLinkPrefix))
        
            return $"/receiving/GRV/Pallet.PalletSeq/";
        
        else
        
            return rowLinkPrefix;
        
    
    set  rowLinkPrefix = value;   

    public bool Selectable  get;  = true;

    public Pallet Pallet  get; set; 

    // Should be 100 - (massoff/qtinspected) but building this manually 
    // at the moment due to lack of data integrity
    [DisplayName("Pack Out")]
    public double PackOut  get; set; 
    [DisplayName("Pack Out Percentage")]
    public double PackoutPerc  get; set; 
    [DisplayName("Percentage")]
    public double Perc  get; set; 
    [DisplayName("Mass Off")]
    public double MassOff  get; set; 
    [DisplayName("Production Comments")]
    public string CommentsProd  get; set; 
    [DisplayName("Technical Comments")]
    public string Comments  get; set; 
    [DisplayName("Quantity Inspected")]
    public double QtyInspected  get; set; 
    [DisplayName("Sample Number")]
    public int SampleNo  get; set; 
    [DisplayName("Status Clerk")]
    public string StatusClerk  get; set; 
    [DisplayName("Status Supervisor")]
    public string StatusSupervisor  get; set; 
    [DisplayName("Product Spec")]
    public string ProductSpec  get; set; 
    [DisplayName("PO Container")]
    public string POContainer  get; set; 

    public string Supervisor  get; set; 
    public string Clerk  get; set; 

    // For required db params
    public string GRV  get; set; 
    public string PalletID  get; set; 
    [DisplayName("Pallet")]
    public string PalletSeq  get; set; 

    [DisplayName("Date")]
    [DisplayFormat(DataFormatString = "0:dd/MM/yyyy", ApplyFormatInEditMode = true)]
    public DateTime QCDate  get; set; 
    public string Date  get  return QCDate.ToString("dd/MM/yyyy");   // My generic WebGrid solution does not alllow me to change thed ate formats, so use this instead

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

    public Sample()
    
        var access = new Access();
        Users = access.GetUsers();
    

    public IEnumerable<string> Images
    
        get
        
            string physicalDir;
            var dir = Path.Combine(imagesPath, $@"Pallet.Grv.GRVNo\Pallet.PalletSeq\SampleNo\");
            physicalDir = dir;

            if (Path.IsPathRooted(dir))
            
                physicalDir = dir;
            
            else
            
                physicalDir = HttpContext.Current.Server.MapPath(dir);
            

            if (!Directory.Exists(physicalDir))
                Directory.CreateDirectory(physicalDir);

            foreach (var filePath in Directory.GetFiles(physicalDir).Where(f => f != null))
            
                yield return Path.Combine(dir, Path.GetFileName(filePath));
            
        
    



    public void SaveImages(IEnumerable<HttpPostedFileBase> files)
    
        foreach (var file in files.Where(f => f != null))
        
            var dir = $@"imagesPath/Pallet.Grv.GRVNo/Pallet.PalletSeq/SampleNo";
            var physicalDir = HttpContext.Current.Server.MapPath(dir);

            var imageDirInfo = Directory.CreateDirectory(physicalDir);
            var counter = imageDirInfo.EnumerateFiles().Count() + 1;

            var path = Path.Combine($@"physicalDir", $"counterPath.GetExtension(file.FileName)");
            file.SaveAs(path);
            counter++;
        
    

【问题讨论】:

内部有异常吗? 能否请您出示班级sample @vasily.sib 没有内部异常 args.Add 参数的顺序与它们在UPDATE 语句中出现的顺序相同。 @HansUp,这实际上是你的解决方案,所以添加这个作为答案,OP会接受它:) 【参考方案1】:

OLEDB 忽略参数名称。 args.Add 参数的顺序与它们在UPDATE 语句中出现的顺序相同

args.Add("@Clerk", sample.Clerk, DbType.String);
args.Add("@Comments", sample.Comments, DbType.String);
args.Add("@CommentsProd", sample.CommentsProd, DbType.String);
args.Add("@MassOff", sample.MassOff, DbType.String);
args.Add("@PalletID", sample.PalletID, DbType.String);
args.Add("@QCDate", sample.QCDate, DbType.Date);
args.Add("@QtyInspected ", sample.QtyInspected, DbType.Decimal);
args.Add("@StatusClerk", sample.StatusClerk, DbType.String);
args.Add("@StatusSupervisor", sample.StatusSupervisor, DbType.String);
args.Add("@Supervisor", sample.Supervisor, DbType.String);
args.Add("@PackOut", sample.PackOut, DbType.String);
args.Add("@GRV", sample.GRV, DbType.Int64);
args.Add("@PalletSeq", sample.PalletSeq, DbType.Int16);
args.Add("@SampleNo", sample.SampleNo, DbType.Int16);

【讨论】:

以上是关于不切实际的烦人“标准表达式中的无效数据类型”的主要内容,如果未能解决你的问题,请参考以下文章

烦人的软件版本控制,还是只有我一个人? [关闭]

excel工作簿出现“此工作簿包含一个或多个可能不安全的外部源的链接”,请问怎么取消这烦人的提示?

创建数组并将对象推入数组后,对象是[Object],而不是实际数据

如何在eclipse中禁用编辑器左侧的烦人栏

添加新元素时,一个 ArrayList 的所有元素都会改变吗? [复制]

.NET 字典中的重复键?