Hi,
On a plugin i attempt to retrieve record in other CRM instance.
Here is the code:
namespace TES_CRM_PLUGIN { public class Class1 : IPlugin { string connstring = string.Empty; IOrganizationService _service; Guid fabercastel = Guid.Empty; string x; public void Execute(IServiceProvider ServiceProvider) { IPluginExecutionContext context = (IPluginExecutionContext)ServiceProvider.GetService(typeof(IPluginExecutionContext)); IOrganizationServiceFactory servicefactory = (IOrganizationServiceFactory)ServiceProvider.GetService(typeof(IOrganizationServiceFactory)); IOrganizationService service = servicefactory.CreateOrganizationService(context.UserId); if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity) { Entity ent = (Entity)context.InputParameters["Target"]; if (ent.LogicalName != "opportunity") return; //Getting id from new field during create process in CRM On-Premise string idnum = ent.GetAttributeValue<String>("new_id"); if (ent.Attributes.Contains("name")) { //Attempting to connect CRM Online connstring = @"Url=office.crm5.dynamics.com; Username=admin@office.onmicrosoft.com; Password=crmoffice; authtype=Office365"; CrmServiceClient conn = new Microsoft.Xrm.Tooling.Connector.CrmServiceClient(connstring); _service = (IOrganizationService)conn.OrganizationWebProxyClient != null ? (IOrganizationService)conn.OrganizationWebProxyClient : (IOrganizationService)conn.OrganizationServiceProxy; if (!string.IsNullOrEmpty(idnum)) { try{ //Getting record from CRM Online by matching the idnum QueryExpression query = new QueryExpression("opportunity"); string[] cols2 = { "new_presalesid", "name" }; query.Criteria = new FilterExpression(); query.Criteria.AddCondition("new_presalesid", ConditionOperator.Equal, idnum); query.ColumnSet = new ColumnSet(cols2); EntityCollection preid = _service.RetrieveMultiple(query); foreach (Entity cloudent in preid.Entities) { if (cloudent.Attributes.Contains("new_presalesid")) { x = cloudent.GetAttributeValue<String>("new_presalesid"); } } } catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault> ex) { throw new InvalidPluginExecutionException(ex.Message); } } // Fill the description field in the CRM On-premise, by value we were took from CRM Online if (!string.IsNullOrEmpty(x)) { ent["description"] = x; } else { ent["description"] = "FAK"; } } } } } }
The plugin throw an error like this:
Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=8.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: Error: Object reference not set to an instance of an object.Detail:<OrganizationServiceFault xmlns:i="www.w3.org/.../XMLSchema-instance" xmlns="schemas.microsoft.com/.../Contracts"><ActivityId>48b026df-da81-4eba-a075-d7f3b3b1bbc3</ActivityId><ErrorCode>-2147220891</ErrorCode><ErrorDetails xmlns:d2p1="schemas.datacontract.org/.../System.Collections.Generic"><KeyValuePairOfstringanyType><d2p1:key>OperationStatus</d2p1:key><d2p1:value xmlns:d4p1="www.w3.org/.../XMLSchema" i:type="d4p1:string">0</d2p1:value></KeyValuePairOfstringanyType><KeyValuePairOfstringanyType><d2p1:key>SubErrorCode</d2p1:key><d2p1:value xmlns:d4p1="www.w3.org/.../XMLSchema" i:type="d4p1:string">-2146233088</d2p1:value></KeyValuePairOfstringanyType></ErrorDetails><Message>Error: Object reference not set to an instance of an object.</Message><Timestamp>2017-02-22T03:44:48.8456384Z</Timestamp><ExceptionSource i:nil="true" /><InnerFault i:nil="true" /><OriginalException i:nil="true" /><TraceText> [TES CRM PLUGIN: TES_CRM_PLUGIN.Class1] [4b76457a-05f8-e611-80cb-000c2901c43a: TES_CRM_PLUGIN.Class1: Create of opportunity] Attempting to connect CRM ONline.. Trying to get account name </TraceText></OrganizationServiceFault>
The error is coming from this line:
QueryExpression query = new QueryExpression("opportunity"); string[] cols2 = { "new_presalesid", "name" }; query.Criteria = new FilterExpression(); query.Criteria.AddCondition("new_presalesid", ConditionOperator.Equal, idnum); query.ColumnSet = new ColumnSet(cols2); EntityCollection preid = _service.RetrieveMultiple(query);
There, i used _service to retrieve queryexpression. The _service is declare in this line:
_service = (IOrganizationService)conn.OrganizationWebProxyClient != null ? (IOrganizationService)conn.OrganizationWebProxyClient : (IOrganizationService)conn.OrganizationServiceProxy;
It's seem that _service is null. So it can't be used to retrieving data.
I have been searching on the internet how to solve this, but i am unable to find a way to solve it yet.