2015-12-08 1 views
0

J'ai un problème lors de l'utilisation de l'agrégat storedproc lumenize https://github.com/lmaccherone/documentdb-lumenize avec le client .net. Je reçois une erreur lorsque j'essaie de passer le paramètre et la requête dans le fichier storedproc. Ci-dessous mon codeBesoin d'aide pour utiliser documentdb-lumenize sur .net documentdb client sdk

public async static void QuerySP()  { 
      using (client = new DocumentClient(new Uri(endpointUrl), authorizationKey)) 
      { 
       //Get the Database 
       var database = client.CreateDatabaseQuery().Where(db => db.Id == databaseId).ToArray().FirstOrDefault(); 

       //Get the Document Collection 
       var collection = client.CreateDocumentCollectionQuery(database.SelfLink).Where(c => c.Id == collectionId).ToArray().FirstOrDefault(); 

       StoredProcedure storedProc = client.CreateStoredProcedureQuery(collection.StoredProceduresLink).Where(sp => sp.Id == "cube").ToArray().FirstOrDefault();    


       dynamic result = await client.ExecuteStoredProcedureAsync<dynamic>(storedProc.SelfLink, "{cubeConfig: {groupBy: 'publication', field: 'pid', f: 'count'}, filterQuery: 'SELECT pid, publication FROM c'}"); 
       Console.WriteLine("Result from script: {0}\r\n", result.Response); 
      } 
} 

Je reçois l'erreur suivante lors de l'exécution du code

Message: {"Errors":["Encountered exception while executing Javascript. Exception = Error: cubeConfig or savedCube required\r\nStack trace: Error: cubeConfig or savedCube required\n at fn (cube.js:1803:7)\n at __docDbMain (cube.js:1844:5)\n at Unknown script code (cube.js:1:2)"]}

Je ne sais pas ce que je l'avais fait mal. J'apprécierais vraiment l'aide. Merci.

+0

Je suppose que le problème est que la configuration est envoyé sous forme de chaîne. Je ne suis pas un développeur .NET mais j'ai une machine virtuelle Windows et j'essaierai de vous renvoyer le code. En attendant, si vous savez comment créer des objets simples, essayez-le et faites le moi savoir. –

Répondre

1

Vous l'avez presque. Le problème est que vous envoyez le cubeConfig en tant que chaîne. Il doit être un objet. Voici le code qui fait que:

string cubeConfigString = @"{ 
    cubeConfig: { 
     groupBy: 'publication', 
     field: 'pid', 
     f: 'count' 
    }, 
    filterQuery: 'SELECT * FROM c' 
}"; 

Object cubeConfig = JsonConvert.DeserializeObject<Object>(cubeConfigString); 
Console.WriteLine(cubeConfig); 

dynamic result = await client.ExecuteStoredProcedureAsync<dynamic>("dbs/dev-test-database/colls/dev-test-collection/sprocs/cube", cubeConfig); 

Console.WriteLine(result.Response); 
+0

BTW, j'ai chargé le cube sproc manuellement en utilisant l'application console Azure. Avez-vous du code qui lit à partir d'un fichier et charge la chaîne dans ce fichier en tant que sproc? Si oui, j'aimerais le voir. Aussi, mon email est larry @ at @ maccherone .dot. com, pour envoyer un code ou si vous avez d'autres questions. Je vous enverrai mon numéro Skype et/ou mon numéro de téléphone si vous m'envoyez un email. Bonne chance! –

+0

Salut Larry, merci pour votre aide. Le code ci-dessus fonctionne bien. Pour le sproc, j'avais déjà sauvegardé le sproc dans documentdb, donc j'utilise juste le code ci-dessus pour récupérer le sproc. Je sais que l'exemple Microsoft charger le fichier et télécharger et enregistrer le sproc dans documentdb https://github.com/Azure/azure-documentdb-dotnet/blob/master/samples/code-samples/ServerSideScripts/Program.cs – Teo

+0

I avoir une autre question. Quand j'utilise le code, il génère la continuation, dois-je faire une boucle while jusqu'à continuation = null et résumer tout le compte? Et pour continuer, est-ce que je viens d'ajouter dans le cubeConfig d'origine comme suit? chaîne cubeConfigString = @ "{ cubeConfig: { groupBy: 'publication', terrain: 'pid', f: 'count' }, filterQuery: 'SELECT * FROM c', suite: 'xxxxxxx' } "; Merci. – Teo

1

mon code de travail

public async static Task QuerySP2() 
    { 
     using (client = new DocumentClient(new Uri(endpointUrl), authorizationKey)) 
     { 
      //Get the Database 
      var database = client.CreateDatabaseQuery().Where(db => db.Id == databaseId).ToArray().FirstOrDefault(); 

      //Get the Document Collection 
      var collection = client.CreateDocumentCollectionQuery(database.SelfLink).Where(c => c.Id == collectionId).ToArray().FirstOrDefault(); 

      StoredProcedure storedProc = client.CreateStoredProcedureQuery(collection.StoredProceduresLink).Where(sp => sp.Id == "cube").ToArray().FirstOrDefault(); 

      string filterQuery = string.Format(@"SELECT * from c"); 

      string cubeConfigString = @"{ 
       cubeConfig: { 
        groupBy: 'publication', 
        field: 'id', 
        f: 'count' 
       }, 
       filterQuery: '" + filterQuery + "'}"; 

      dynamic cubeConfig = JsonConvert.DeserializeObject<dynamic>(cubeConfigString); 
      Console.WriteLine(cubeConfig); 

      string continuationToken = null; 

      dynamic result=null; 
      do 
      { 


       var queryDone = false; 
       while (!queryDone) 
       { 
        try 
        { 
         result = await client.ExecuteStoredProcedureAsync<dynamic>(storedProc.SelfLink, cubeConfig); 
         cubeConfig = result.Response; 
         continuationToken = cubeConfig.continuation; 
         queryDone = true; 
        } 
        catch (DocumentClientException documentClientException) 
        { 
         var statusCode = (int)documentClientException.StatusCode; 
         if (statusCode == 429 || statusCode == 503) 
          System.Threading.Thread.Sleep(documentClientException.RetryAfter); 
         else 
          throw; 
        } 
        catch (AggregateException aggregateException) 
        { 
         if (aggregateException.InnerException.GetType() == typeof(DocumentClientException)) 
         { 

          var docExcep = aggregateException.InnerException as DocumentClientException; 
          var statusCode = (int)docExcep.StatusCode; 
          if (statusCode == 429 || statusCode == 503) 
           System.Threading.Thread.Sleep(docExcep.RetryAfter); 
          else 
           throw; 
         } 
        } 
       } 



      } while (continuationToken != null); 

      Console.WriteLine("Result from script: {0}\r\n", result.Response); 


     } 


    } 
+0

Cool. Par curiosité (à partir d'un .NET Noob), est-ce OK d'avoir du code asynchrone dans une boucle while? Ma solution utilise la récursivité mais cette préférence de style peut provenir de mon arrière-plan node.js. –

+0

En outre, je ne savais pas que 503 erreurs étaient possibles. Où voyez-vous cela dans les docs? –

+0

BTW, je vous ai emprunté 429 retry code et mis à jour mon exemple sur GitHub. Merci pour ça. –