【问题标题】:Unhandled exception on SaveChanges CRM 2011 pluginSaveChanges CRM 2011 插件上未处理的异常
【发布时间】:2013-03-10 08:27:35
【问题描述】:

我的 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 未被用户代码处理
Message=处理此请求时发生错误。
来源=Microsoft.Xrm.Sdk
堆栈跟踪:
在 Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.SaveChanges(SaveChangesOptions 选项)
在 C:\Users\mycrm\Desktop\BMSD.QuoteProduct.Tax\BMSD.QuoteProduct.Tax\BMSD.QuoteProduct.Tax.cs:line 62 中的 Plugin.TaxCreator(IOrganizationService 服务,Guid QPID) 在 C:\Users\mycrm\Desktop\BMSD.QuoteProduct.Tax\BMSD.QuoteProduct.Tax\BMSD.QuoteProduct.Tax.cs:line 38 中的 Plugin.Execute(IServiceProvider serviceProvider) 在 Microsoft.Crm.Extensibility.V5PluginProxyStep.ExecuteInternal(PipelineExecutionContext 上下文)
在 Microsoft.Crm.Extensibility.VersionedPluginProxyStepBase.Execute(PipelineExecutionContext 上下文)
内部异常:System.ServiceModel.FaultException Message=System.InvalidCastException:Microsoft Dynamics CRM 遇到错误。管理员或支持的参考编号:#BE061894
来源=Microsoft.Crm.Extensibility
堆栈跟踪:
在 Microsoft.Crm.Extensibility.OrganizationSdkServiceInternal.Execute(组织请求请求、CorrelationToken 相关令牌、CallerOriginToken callerOriginToken、WebServiceType 服务类型)
在 Microsoft.Crm.Extensibility.InprocessServiceProxy.ExecuteCore(组织请求请求)
在 Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.Execute(组织请求请求)
在 Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.SaveChange(OrganizationRequest 请求,IList`1 结果)
内部异常:

【问题讨论】:

    标签: c# plugins dynamics-crm-2011


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常感谢谢尔盖。由于我是这些科目的新手,我的问题可能看起来很愚蠢!
    • @PaymanBiukaghazadeh 不,它没有。您可能会考虑在您的问题中改进的唯一一件事是格式。这次我已经为您完成了,但是如果您将问题格式化得很漂亮,将来您可能会得到更好的答复。编码愉快!
    【解决方案2】:

    根据提供的信息,当您转换为 double 时,可能是转换问题。问题是 CRM 默认情况下呈现的真实值比您尝试将其装入的精度更高。

    • double 高 8 个字节,意义为 15 位
    • 十进制 高 12 个字节,具有 28 位意义

    因此,即使您正在处理的实际值适合它们中的任何一个(并且 double 是 C# 中非整数的事实上的标准),计算机也会做出反应并向您发出警告您正在(可能)将非常大的东西放入(相对)小孔中。

    您需要重新申报,如下所示。

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

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

    您可以阅读更多关于不同类型的by clicking here

    【讨论】:

      猜你喜欢
      • 2013-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多