C# SaveChanges CRM 2011插件上未处理的异常

C# SaveChanges CRM 2011插件上未处理的异常,c#,plugins,dynamics-crm-2011,C#,Plugins,Dynamics Crm 2011,我的CRM 2011插件有问题 var QuoteProduct = crm.QuoteDetailSet.Where(c => c.QuoteDetailId == QPID).First(); double Tax = (double)( (QuoteProduct.BaseAmount - QuoteProduct.ManualDiscountAmount.GetValueOrDefault() - QuoteProduct.VolumeDiscount

我的CRM 2011插件有问题

var QuoteProduct = crm.QuoteDetailSet.Where(c 
  => c.QuoteDetailId == QPID).First();
double Tax = (double)(
  (QuoteProduct.BaseAmount 
    - QuoteProduct.ManualDiscountAmount.GetValueOrDefault() 
    - QuoteProduct.VolumeDiscountAmount.GetValueOrDefault()) / 20);
QuoteProduct.Attributes["tax"] = Tax;
crm.UpdateObject(QuoteProduct);
crm.SaveChanges();
错误发生在“保存更改”行上。错误详细信息如下所示

//double tax;
decimal tax = QuoteProduct.BaseAmount 
  - QuoteProduct.ManualDiscountAmount.GetValueOrDefault() 
  - QuoteProduct.VolumeDiscountAmount.GetValueOrDefault();
QuoteProduct.Attributes["tax"] = tax / 20;
Microsoft.Xrm.Sdk.SaveChangesException未由用户代码处理
消息=处理此请求时出错。
Source=Microsoft.Xrm.Sdk
StackTrace:
在Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.SaveChanges(SaveChangesOptions)上
在C:\Users\mycrm\Desktop\BMSD.QuoteProduct.Tax\BMSD.QuoteProduct.Tax\BMSD.QuoteProduct.Tax\BMSD.QuoteProduct.Tax.cs中的Plugin.TaxCreator(IOOrganizationService,Guid QPID)处:第62行
在C:\Users\mycrm\Desktop\BMSD.QuoteProduct.Tax\BMSD.QuoteProduct.Tax\BMSD.QuoteProduct.Tax\BMSD.quoteprovider.Tax.cs中的Plugin.Execute(IServiceProvider服务提供者):第38行
在Microsoft.Crm.Extensibility.V5PluginProxyStep.ExecuteInternal(PipelineExecutionContext上下文)
位于Microsoft.Crm.Extensibility.VersionedPluginProxyStepBase.Execute(PipelineExecutionContext)
InnerException:System.ServiceModel.FaultException Message=System.InvalidCastException:Microsoft Dynamics CRM遇到错误。管理员或支持人员的参考号:#BE061894
Source=Microsoft.Crm.Extensibility
StackTrace:
在Microsoft.Crm.Extensibility.OrganizationSdkServiceInternal.Execute(OrganizationRequest请求,CorrelationToken CorrelationToken,CallerOrigingToken CallerOrigingToken,WebServiceType服务类型)
位于Microsoft.Crm.Extensibility.InputProcessServiceProxy.ExecuteCore(OrganizationRequest请求)
在Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.Execute(OrganizationRequest请求)中执行
在Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.SaveChange(OrganizationRequest请求,IList`1结果)
内部异常:


从堆栈跟踪中有一个
系统。InvalidCastException

这意味着某些属性的值的类型不正确。由于只更改“tax”属性,因此其类型不正确。“tax”很可能是一个Money字段,所以我想您应该为它指定
decimal
类型的变量,而不是
double
。试着这样做:

decimal Tax = (decimal)((QuoteProduct.BaseAmount 
  - QuoteProduct.ManualDiscountAmount.GetValueOrDefault() 
  - QuoteProduct.VolumeDiscountAmount.GetValueOrDefault()) / 20);

根据提供的信息,当您转换为double时,可能是转换问题。问题在于,CRM在默认情况下呈现Real的精度高于您试图将其装箱的精度

  • double是8个字节高,具有15位的意义
  • decimal的长度为12字节,具有28位的重要性
因此,即使您处理的实际值适合其中任何一个(double实际上是C#中非整数的标准值),计算机也会做出反应,并向您发出警告,表示您正在(潜在地)将一些非常大的东西放入一个(相对)较小的孔中

你需要按如下方式重新申报税款

//double tax;
decimal tax = QuoteProduct.BaseAmount 
  - QuoteProduct.ManualDiscountAmount.GetValueOrDefault() 
  - QuoteProduct.VolumeDiscountAmount.GetValueOrDefault();
QuoteProduct.Attributes["tax"] = tax / 20;
或者可以使用内置的转换类手动将十进制值转换为双精度值。然而,考虑到您将结果放入一个字段(该字段肯定管理十进制类型),我认为这是一个不必要的迂回


您可以阅读更多关于不同类型的信息。

非常感谢Sergey。因为我是这些学科的新手,所以我的问题可能看起来很愚蠢@PaymanBiukaghazadeh不,没有。在你的问题中,你唯一可以考虑改进的是格式化。这一次我已经为你做了,但是如果你把问题编排得很好,你将来可能会得到更好的回答。快乐编码!