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

时间:2013-03-10 08:27:36

标签: 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.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选项)
      在Plugin.TaxCreator(IOrganizationService服务,Guid QPID)中的C:\ Users \ mycrm \ Desktop \ BMSD.QuoteProduct.Tax \ BMSD.QuoteProduct.Tax \ BMSD.QuoteProduct.Tax.cs:第62行       在插件.Execute(IServiceProvider serviceProvider)在C:\ Users \ mycrm \ Desktop \ BMSD.QuoteProduct.Tax \ BMSD.QuoteProduct.Tax \ BMSD.QuoteProduct.Tax.cs:第38行
      在Microsoft.Crm.Extensibility.V5PluginProxyStep.ExecuteInternal(PipelineExecutionContext context)
         在Microsoft.Crm.Extensibility.VersionedPluginProxyStepBase.Execute(PipelineExecutionContext context)
    InnerException:System.ServiceModel.FaultException          Message = System.InvalidCastException:Microsoft Dynamics CRM遇到错误。管理员或支持的参考编号:#BE061894
         来源= Microsoft.Crm.Extensibility
         堆栈跟踪:
              在Microsoft.Crm.Extensibility.OrganizationSdkServiceInternal.Execute(OrganizationRequest请求,CorrelationToken correlationToken,CallerOriginToken callerOriginToken,WebServiceType serviceType)
              在Microsoft.Crm.Extensibility.InprocessServiceProxy.ExecuteCore(OrganizationRequest请求)
              在Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.Execute(OrganizationRequest request)
              在Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.SaveChange(OrganizationRequest请求,IList`1结果)
         InnerException:

2 个答案:

答案 0 :(得分:4)

从堆栈跟踪中有一个System.InvalidCastException

这意味着某些属性的值具有不正确的类型。由于您只更改'tax'属性,因此其类型不正确。最有可能“税”是一个Money字段,所以我猜你应该为它分配decimal类型的变量,而不是double。尝试这样的事情:

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

答案 1 :(得分:1)

根据所提供的信息,当您转换为双倍时,它可能是转换问题。问题在于,默认情况下,CRM提供的reals精度高于您尝试将其加入的精度。

  • double 是8字节高并且保持15位数的重要性
  • 十进制高12个字节,保持28位数的重要性

因此,即使您正在处理的实际值适合其中任何一个(并且 double 是C#中非整数的事实上的标准),计算机会做出反应并给出警告你把某些东西(可能)放在一个(相对)小洞里。

您需要重新声明 tax ,如下所示。

//double tax;
decimal tax = QuoteProduct.BaseAmount 
  - QuoteProduct.ManualDiscountAmount.GetValueOrDefault() 
  - QuoteProduct.VolumeDiscountAmount.GetValueOrDefault();
QuoteProduct.Attributes["tax"] = tax / 20;

或者您可以使用内置转换类手动将十进制值转换为 double 。但是,鉴于您将结果放入一个字段(肯定会管理 decimal 类型),在我看来这是一个不必要的绕道。

您可以阅读不同类型by clicking here的更多内容。