[gelöst] Generic SQL error beim Speichern

3. Mai 2012 11:33

Moin,

folgenden COode benutze ich um bei der Erstellung eines Produkt alle Abhängigen Produkte mit zu erstellen
Code:
        public void Execute(IServiceProvider serviceProvider)
        {
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            ITracingService tracer = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
            Entity targetEntity = null;  // CRM 2011: Microsoft.Crm.Sdk.DynamicEntity -> Microsoft.Xrm.Sdk.Entity
            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
            {
                targetEntity = (Entity)context.InputParameters["Target"];
                if (targetEntity.LogicalName != "product")
                {
                    return;
                }
            }
            else
            {
                return;
            }
            if (!targetEntity.Contains("new_allgemeinesproduktid"))
            {
                throw new InvalidPluginExecutionException("kein Allgemeines Produkt angegeben");
            }
            IOrganizationService service = factory.CreateOrganizationService(context.UserId);
            EntityCollection result1 = findMyProductEntities(service, targetEntity);
            Entity member;
            if (!targetEntity.Contains("name"))
            {
                member = service.Retrieve("new_produktallgemein", ((EntityReference)targetEntity["new_allgemeinesproduktid"]).Id, new ColumnSet(true));
                targetEntity.Attributes.Add("name", setName(member, targetEntity));
            }
            foreach (var item in result1.Entities)
            {
                member = service.Retrieve("new_produktallgemein", (Guid)item["new_produktallgemeinidtwo"], new ColumnSet(true));
                createProduct(targetEntity, member, service);
            }
        }

        private void createProduct(Entity target, Entity vorlage, IOrganizationService service)
        {
            Product pro = new Product();
            pro.Name = setName(vorlage, target);
            pro.IsKit = (bool)target["iskit"];
            pro.new_allgemeinesProduktId = vorlage.ToEntityReference();
            pro.new_von = (DateTime)target["new_von"];
            pro.new_bis = (DateTime)target["new_bis"];
            pro.ProductNumber = (string)target["productnumber"] + (string)vorlage["new_idnummer"];
            pro.DefaultUoMScheduleId = (EntityReference)vorlage["new_einheitengruppe"];
            pro.DefaultUoMId = (EntityReference)vorlage["new_standardeinheit"];
            pro.QuantityDecimal = (int)target["quantitydecimal"];
            service.Create(pro);
        }

Soweit ist alles Gut, er geht auch schon durch bis alle Abhängigkeiten erstellt wurden.
(Pro 1->Pro 2->Pro 3), doch wenn er aus der Create Methode zurück kommt bei Pro 1 kommt es zu einen Generice SQl error.
Aus den Tracefiles werde ich nicht unbedingt schlauer, da ich nicht genau weis wo nach ich suchen muss.

das ist der Ihalt der Fehlermeldung die der User zu sehen bekommt
Code:
Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: Generic SQL error.Detail:
<OrganizationServiceFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/xrm/2011/Contracts">
  <ErrorCode>-2147204784</ErrorCode>
  <ErrorDetails xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic">
    <KeyValuePairOfstringanyType>
      <d2p1:key>CallStack</d2p1:key>
      <d2p1:value xmlns:d4p1="http://www.w3.org/2001/XMLSchema" i:type="d4p1:string">   bei Microsoft.Crm.Extensibility.VersionedPluginProxyStepBase.Execute(PipelineExecutionContext context)
   bei Microsoft.Crm.Extensibility.Pipeline.Execute(PipelineExecutionContext context)
   bei Microsoft.Crm.Extensibility.MessageProcessor.Execute(PipelineExecutionContext context)
   bei Microsoft.Crm.Extensibility.InternalMessageDispatcher.Execute(PipelineExecutionContext context)
   bei Microsoft.Crm.Extensibility.ExternalMessageDispatcher.ExecuteInternal(IInProcessOrganizationServiceFactory serviceFactory, IPlatformMessageDispatcherFactory dispatcherFactory, String messageName, String requestName, Int32 primaryObjectTypeCode, Int32 secondaryObjectTypeCode, ParameterCollection fields, CorrelationToken correlationToken, CallerOriginToken originToken, UserAuth userAuth, Guid callerId, Guid transactionContextId, Int32 invocationSource, Nullable`1 requestId, Version endpointVersion)
   bei Microsoft.Crm.Extensibility.OrganizationSdkServiceInternal.ExecuteRequest(OrganizationRequest request, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType)
   bei Microsoft.Crm.Extensibility.OrganizationSdkServiceInternal.Create(Entity entity, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType)</d2p1:value>
    </KeyValuePairOfstringanyType>
  </ErrorDetails>
  <Message>Generic SQL error.</Message>
  <Timestamp>2012-05-03T09:30:36.6631056Z</Timestamp>
  <InnerFault i:nil="true" />
  </OrganizationServiceFault>
Zuletzt geändert von rene87 am 7. Mai 2012 09:06, insgesamt 2-mal geändert.

Re: Generic SQL error beim Speichern

3. Mai 2012 14:43

Hallo,

das sieht so aus, als wenn ein Wert bzw. eine Beziehung nicht mehr richtig gefüllt ist. Kann es sein, das dir zwischenzeitlich eine Variable gelöscht wird?

Re: Generic SQL error beim Speichern

4. Mai 2012 08:41

wo könnte ich das den nachsehen, weil wen ich in einzell schritfolgen durch den Code gehe sehe ich immer noch alles.

Re: Generic SQL error beim Speichern

4. Mai 2012 09:41

das heißt, vor dem Befehl "service.Create(pro);" sind alle Variablen gefüllt und es gibt noch keinen Datensatz mit diesen Daten?

Re: Generic SQL error beim Speichern

4. Mai 2012 10:14

alles was ich reinschreibe ist auch noch drin, Dinge wie CreatedBy die schreibgeschützt sind kann ich nicht setzten. In der Datenbank sind auch keine Produkte.
Der Fehler tritt übrignes nicht auf wenn ich ein Produkt erstelle was keine Abhängigkeiten hat.

MfG René

Re: Generic SQL error beim Speichern

4. Mai 2012 10:57

dann müsste man jetzt weiter den Code analysieren, das sprengt aber den Rahmen eines Forums.

Re: Generic SQL error beim Speichern

4. Mai 2012 11:38

Ok ich konnte jetzt soweit mit F11 rein gehen das ich feststellen musste das der Fehler von der Entity Klasse kommt, weil das was der SQL Profiler auspuckt sieht auch gut aus.
Gibt es eine Möglichkeit an die Debug files für das SDK ranzu kommen.

MfG René

Re: Generic SQL error beim Speichern

4. Mai 2012 12:19

Hallo René,

wenn du das Tracing eingeschaltet hast werden auch die Fehler des SDK mit ausgegeben.

Re: Generic SQL error beim Speichern

4. Mai 2012 15:41

so nachdem ich mir die Tracefiles angeschaut habe, sind mir diese Zeilen ins Auge gefallen.
Code:
insert into [ProductBase]([DefaultUoMScheduleId], [OrganizationId], [ProductId], [ModifiedOnBehalfBy], [StateCode], [StatusCode], [CreatedBy], [ProductNumber], [TimeZoneRuleVersionNumber], [IsStockItem], [DefaultUoMId], [ModifiedOn], [QuantityDecimal], [ModifiedBy], [ProductTypeCode], [CreatedOn], [Name], [UTCConversionTimeZoneCode], [IsKit]) values ('a1b11bb0-aa87-e111-8709-00155d019a00', '509c0aa1-f2ad-474e-828c-0f4bb382fe69', '28636f65-eb95-e111-8630-00155d019a00', NULL, 0, 1, 'f44cbb9d-8384-e111-bf63-00155d019a00', '270-513', 0, 0, 'a2b11bb0-aa87-e111-8709-00155d019a00', '05/04/2012 13:16:45', 2, 'f44cbb9d-8384-e111-bf63-00155d019a00', 1, '05/04/2012 13:16:45', 'TS: Windows Communication Foundation Development with Microsoft .NET Framework 4 01.05.2012 04.05.2012', 110, 0);
insert into [ProductExtensionBase]([ProductId], [new_allgemeinesProduktId], [new_bis], [new_von]) values ('28636f65-eb95-e111-8630-00155d019a00', 'ec465ec2-9788-e111-8dba-00155d019a00', '05/03/2012 22:00:00', '04/30/2012 22:00:00')
[...]
Die INSERT-Anweisung steht in Konflikt mit der FOREIGN KEY-Einschränkung 'FK_ProductExtensionBase_ProductBase'. Der Konflikt trat in der CRM2011DBSN_MSCRM-Datenbank, Tabelle 'dbo.ProductBase', column 'ProductId' auf.


Wenn ich die Konstelation habe Kurs 1-> Prüfung 1 tritt der Fehler bei Prüfung 1 auf (wie oben),
wenn ich jetzt aber Kurs A-> Kurs 1-> Prüfung 1 habe kommt der Fehler mal bei Kurs 1 und mal bei Prüfung 1,
wenn ich Kurs A-> Kurs 1->Prüfung 1 und Kurs A->Kurs 2->Prüfung 2 habe tritt der fehler bisher immer bei Kurs 2 auf,
wenn ich nur Prüfung 1 habe kommt der Fehler nie

Re: Generic SQL error beim Speichern

4. Mai 2012 16:55

Hallo,

Die INSERT-Anweisung steht in Konflikt mit der FOREIGN KEY-Einschränkung 'FK_ProductExtensionBase_ProductBase'. Der Konflikt trat in der CRM2011DBSN_MSCRM-Datenbank, Tabelle 'dbo.ProductBase', column 'ProductId' auf.

die Fehlermeldung ist doch eindeutig. Du versuchst ein Produkt mit einer GUID anzulegen die es bereits für ein anderes Produkt gibt.

Re: Generic SQL error beim Speichern

7. Mai 2012 09:05

So das Problem ist gelöst.

Es gab beim erstellen der 'dbo.ProductBase' ein Problem mit der länge des Namens, der teilweise länger als die Standardmäßigen 100 Zeichen wurde, des wegen wurde die Zeile nicht eingefügt.
Die Fehlermeldung FOREIGN KEY-Einschränkung kommt deswegen, weil in der 'dbo.ProductExtensionBase' auf einen Key verwiesen werden soll der nicht existiert.

MfG René