不切实际的烦人“标准表达式中的无效数据类型”
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);
现在MassOff
和PackOut
都是double 类型,两者的Access 数据类型如下所示:
这里的奇怪之处在于代码完美地适用于属性MassOff
,但是在添加PackOut
的行之后,我得到了
条件表达式中的数据类型无效
我尝试更改参数DbType.Decimal
和DbType.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],而不是实际数据