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

本文关键字:未处理 异常 插件 CRM 2011 SaveChanges | 更新日期: 2023-09-27 18:03:06

我的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();

错误发生在保存更改行。错误详细信息如下:

Microsoft.Xrm.Sdk。SaveChangesException未被用户代码处理
消息=处理此请求时发生错误。
源= Microsoft.Xrm.Sdk
加:
在Microsoft.Xrm.Sdk.Client.OrganizationServiceContext。SaveChanges (SaveChangesOptions选项)
在插件。TaxCreator(IOrganizationService服务,Guid QPID) in C:'Users'mycrm'Desktop'BMSD.QuoteProduct.Tax'BMSD.QuoteProduct.Tax'BMSD.QuoteProduct.Tax 'BMSD.QuoteProduct.Tax:第62行
在插件。执行(IServiceProvider serviceProvider)在C:'Users'mycrm'Desktop'BMSD.QuoteProduct.Tax'BMSD.QuoteProduct.Tax'BMSD.QuoteProduct.Tax.cs:第38行
在Microsoft.Crm.Extensibility.V5PluginProxyStep。ExecuteInternal (PipelineExecutionContext上下文)
在Microsoft.Crm.Extensibility.VersionedPluginProxyStepBase。执行(PipelineExecutionContext上下文)
InnerException: System.ServiceModel.FaultException消息=系统。InvalidCastException: Microsoft Dynamics CRM出现错误。管理员或支持的参考编号:#BE061894
源= Microsoft.Crm.Extensibility
加:
在Microsoft.Crm.Extensibility.OrganizationSdkServiceInternal。Execute(OrganizationRequest request, CorrelationToken CorrelationToken, CallerOriginToken CallerOriginToken, WebServiceType serviceType)
在Microsoft.Crm.Extensibility.InprocessServiceProxy。ExecuteCore (OrganizationRequest请求)
在Microsoft.Xrm.Sdk.Client.OrganizationServiceContext。执行(OrganizationRequest请求)
在Microsoft.Xrm.Sdk.Client.OrganizationServiceContext。SaveChange(OrganizationRequest请求,list1结果)
InnerException:

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

在你的堆栈跟踪中有一个System.InvalidCastException

表示某个属性的值类型不正确。由于您只更改了"tax"属性,因此其类型是不正确的。最有可能的"tax"是一个Money字段,所以我猜你应该给它分配类型为decimal的变量,而不是double。试试这样做:

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

根据所提供的信息,可能是在强制转换为double时出现的转换问题。问题是CRM在默认情况下呈现的真实值比您试图将其框入的要高。

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

或者您可以使用内置转换类手动将十进制值转换为双精度。然而,考虑到您将结果放入一个字段(这肯定管理十进制类型),在我看来,这是一个不必要的弯路。

你可以点击这里阅读更多关于不同类型的信息