2015-02-23 1 views
0

J'ai une procédure stockée que j'ai écrite. J'essaie de collecter plusieurs ensembles de résultats. Mais malheureusement, j'obtiens une erreurErreur lors de la collecte de plusieurs jeux de résultats à partir de la procédure stockée

Une exception de première occurrence du type 'System.Data.SqlClient.SqlException' s'est produite dans System.Data.dll.

Le message est l'erreur que je continue de voir.

J'ai essayé tout ce que je peux mais je ne sais pas si l'erreur est, j'ai testé ma procédure stockée cela fonctionne très bien.

procédure stockée:

CREATE PROCEDURE [dbo].[Collectcompanyservicewithpackages] 
    @CompanyID int  
AS 
    select * 
    from Serviceduration 
    where Client_CompanyID = @CompanyID; 

    select Serviceitem.* 
    from Serviceduration, Serviceitem 
    where Client_CompanyID = @CompanyID 
     and Serviceduration.ServicedurationID = Serviceitem.ServicedurationID; 

    select ServiceitemPackage.* 
    from Serviceduration, Serviceitem, ServiceitemPackage 
    where Client_CompanyID = @CompanyID 
     and Serviceduration.ServicedurationID = Serviceitem.ServicedurationID 
     and Serviceitem.ServiceitemID = ServiceitemPackage.ServiceitemID 

modules de base de données:

Snippet

public List<Serviceview> GetFirmServiceswithpackages_sp(int CompanyID) 
{ 
     List<Serviceview> allservices = null; 

     IEnumerable<Serviceduration> servicedurations = null; 

     IEnumerable<Serviceitem> serviceitems = null; 

     IEnumerable<ServiceitemPackage> serviceitempackages = null; 

     using(context){ 

      Debug.WriteLine("App got here for starters ........................."); 


      // If using Code First we need to make sure the model is built before we open the connection 
      // This isn't required for models created with the EF Designer 
      //context.Database.Initialize(force: false); 

      // Create a SQL command to execute the sproc 
      var cmd = context.Database.Connection.CreateCommand(); 
      cmd.CommandText = "Collectcompanyservicewithpackages @CompanyID"; 
      cmd.CommandType = CommandType.StoredProcedure; 

      DbParameter inputparameter = new SqlParameter(); 
      inputparameter.DbType = DbType.Int64; 
      inputparameter.ParameterName = "CompanyID"; 
      inputparameter.Value = CompanyID; 
      inputparameter.Direction = ParameterDirection.Input; 

      cmd.Parameters.Add(inputparameter); 

      try 
      { 
       // Run the sproc 
       context.Database.Connection.Open(); 
       var reader = cmd.ExecuteReader(); 

       // Read Blogs from the first result set 
       var durations = ((IObjectContextAdapter)context) 
        .ObjectContext 
        .Translate<Serviceduration>(reader, "Servicedurations", MergeOption.AppendOnly); 

       servicedurations = this.Extractdurations(durations); 

       Debug.WriteLine("No of duration "+servicedurations.Count()); 

       // Move to second result set and read Serviceitems in cart 
       reader.NextResult(); 

       var services4sale = ((IObjectContextAdapter)context) 
        .ObjectContext 
        .Translate<Serviceitem>(reader, "Serviceitems", MergeOption.AppendOnly); 

       serviceitems = this.Extractservices(services4sale); 

       Debug.WriteLine("No of services "+serviceitems.Count()); 

       // Move to second result set and read Serviceitems in cart 
       reader.NextResult(); 

       var packages = ((IObjectContextAdapter)context) 
        .ObjectContext 
        .Translate<ServiceitemPackage>(reader, "ServiceitemPackages", MergeOption.AppendOnly); 

       serviceitempackages = this.Extractpackages(packages); 

       Debug.WriteLine("No of packages ...."+ serviceitempackages.Count()); 

       allservices = this.ReturnServiceincart(servicedurations, serviceitems, serviceitempackages); 

      } 
      catch(SqlException e){ 

       Debug.WriteLine("Cause of the error "+e.InnerException.Message); 
      } 
      finally 
      { 
       context.Database.Connection.Close(); 
      } 
     } 

     return allservices; 
    } 

// Les méthodes suivantes sont utilisées pour extraire Enumerables de l'objet ResultSet. J'aimerais les appeler des méthodes helper

//This is the help method that would help us to do the final crafting of our stored procedure run around 
    private List<Serviceview> ReturnServiceincart(IEnumerable<Serviceduration> durations, IEnumerable<Serviceitem> services, IEnumerable<ServiceitemPackage> packages) 
    { 
     List<Serviceview> allservices = new List<Serviceview>(); 

     if(services != null){ 

      foreach(var service in services){ 

       Serviceview view = new Serviceview() 
       { 
        Name = service.Name, 
        Cost = service.Cost, 
        Description = service.Description, 
        Durationname = durations.Where(item=>item.ServicedurationID == service.ServicedurationID).Select(item=>item.Duration).SingleOrDefault<string>(), 
        IsVisible = service.IsVisible, 
        Packages = Returnpackages(service.ServiceitemID, packages) //Note we are not passing service.ServiceitemPackage, cos we are avoiding a lazy loading cos it already been returned in stored procedure. 
       }; 
      } 
     } 

     return allservices; 
    } 

    private IEnumerable<Serviceduration> Extractdurations(ObjectResult<Serviceduration> durations) 
    { 
     IEnumerable<Serviceduration> servicedurations = durations.AsEnumerable<Serviceduration>(); 

     return servicedurations; 
    } 

    private IEnumerable<Serviceitem> Extractservices(ObjectResult<Serviceitem> services4sale) 
    { 
     IEnumerable<Serviceitem> serviceitems = services4sale.AsEnumerable<Serviceitem>(); 

     return serviceitems; 
    } 

    private IEnumerable<ServiceitemPackage> Extractpackages(ObjectResult<ServiceitemPackage> packages) 
    { 
     IEnumerable<ServiceitemPackage> servicepackages = packages.AsEnumerable<ServiceitemPackage>(); 

     return servicepackages; 
    } 

    //Because the packages here would contain all packages for all company services we need to filter with a service ID 
    private List<string> Returnpackages(int ServiceitemID, IEnumerable<ServiceitemPackage> packageitems) 
    { 
     List<string> packages = new List<string>(); 

     foreach(var package in packageitems){ 
      if(package.ServiceitemID == ServiceitemID) 
       packages.Add(package.PackageName); 
     } 

     return packages; 
    } 

Les modifications apportées ci-dessous cmd.CommandText = "Collectcompanyservicewithpackages";

Après avoir apporté une modification à la requête. Je reçois le message d'erreur

Le résultat de la requête ne peut pas être énumérable plus d'une fois.

La nouvelle erreur est sur la ligne

allservices = this.ReturnServiceincart (servicedurations, serviceitems, serviceitempackages);

+0

Pourriez-vous s'il vous plaît formater le code un peu mieux, fournir les détails de l'exception, et fournir le reste du code Ado.Net? – rducom

+0

Avez-vous essayé "cmd.CommandText =" Collectcompanyservicewithpackages "; OR cmd.CommandText =" Collectcompanyservicewithpackages @CompanyID = @CompanyID "; –

+0

[Mauvaises habitudes à lancer: en utilisant les anciens JOINs] (http://sqlblog.com/blogs /aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) - que l'ancien style * séparé par des virgules * a été remplacé par * proper * La syntaxe ANSI 'JOIN' de la norme ANSI - ** 92 ** SQL Standard (** il y a plus de 20 ans **) et son utilisation est déconseillée –

Répondre

0

cmd.CommandText = "Collectcompanyservicewithpackages";

Cette ligne a résolu la magie. Après cela, j'ai fermé la commande et l'objet lecteur.

Cela fonctionne bien maintenant.