2009-10-23 18 views
1

Eh bien, tout d'abord désolé de cette question, il doit être assez simple pour vous les gars, mais je me bats sur lui, et je dois le faire fonctionner :( Eh bien, je suis en train d'utiliser DataSet sur ma demandeASP.NET MVC - System.Data.DataSet problème non référencé

et quand je le rends je suis arrivé:

The type 'System.Data.DataSet' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Data 

dans ma demande System.Data est déjà référencé à partir de C: \ Windows \ Microsoft .NET \ Framework \ v2.0.50727 \ System.Data.dll

et j'utilise sur mes clauses en utilisant aussi bien

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

Ce DataSet est une réponse d'un Webservice donc des idées sur la façon de résoudre ce problème?

PS. Je ne sais pas si ça aide, mais j'utilise nHaml pour rendre mon avis

Merci beaucoup


MISE À JOUR:

La seule solution que je trouve pour l'instant était de passage au lieu un ensemble de données au convertisseur de vue l'ensemble de données à un

<List<List<String>> 

et passer une boucle à travers l'ensemble de données de ce type

List<List<String>> myList = new List<List<String>>(); 

foreach (DataRow row in dsTrades.Tables[0].Rows) 
{ 
    List<String> myListColumns = new List<String>(); 

    for (var index = 0; index < dsTrades.Tables[0].Columns.Count; index ++) 
    { 
     myListColumns.Add(row[index].ToString()); 
    } 

    myList.Add(myListColumns); 
} 

// THIS SHOULD BE THE DATASET AND NOW 
// IT'S CONVERTED TO A LIST WITH STRINGS LIST INSIDE 
viewModel.Trades = myList; 

return View(viewModel); 

En fait, c'est complètement fou, n'est-ce pas?

Tout ce travail pourrait être facilement fait dans la vue si vous utilisez DataSet directement J'espère que quelqu'un peut me aider avec une manière plus simpliste de le faire

Merci :)


MISE À JOUR (SOLUTION)

La réponse de Simon était vraiment efficace et cela a fonctionné sur le premier essai après avoir ajouté des espaces de noms pour System.Data et System.Xml mais en même temps, la réponse de Josh présente une façon très sympa et sympa de travailler avec DataSets, qui selon moi fonctionne beaucoup mieux et je pense que je vais y aller maintenant.

Merci pour vous aider à

+0

est-ce que vous contrôlez le webservice? Si oui, j'essaierais de le changer pour être des classes dactylographiées à la place des jeux de données – Simon

Répondre

3

essayer d'ajouter une référence explicite à System.Data dans votre configuration nhaml

<?xml version="1.0"?> 

<configuration> 
... 
    <configSections> 
      <section name="nhaml" type="NHaml.Configuration.NHamlConfigurationSection, NHaml"/> 
    </configSections> 
... 
<nhaml autoRecompile="true"> 
      <assemblies> 
        <clear/> 
        ... 
        <add assembly="System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> 
      </assemblies> 
      <namespaces> 
        <clear/> 
        ... 
        <add namespace="System.Data"/> 
      </namespaces> 
    </nhaml> 

remplaçant évidemment "..." avec vos autres références et config

+0

Parfait Simon, cela a très bien fonctionné, après avoir ajouté cela, j'ai aussi dû ajouter des instructions pour System.Xml mais c'était exactement la même procédure. Cela a fonctionné, et a répondu à ma question, mais en fait j'aime vraiment la façon dont Josh a présenté une nouvelle solution pour passer DataSets à travers, donc Thumbs Up pour vous deux, merci pour votre aide! – zanona

1

La seule chose que je pouvais penser est que dans le contexte de la page, la référence System.Data n'est pas visible.

Essayez d'ajouter l'espace de noms dans votre web.config:

<pages> 
    <controls /> 
    <namespaces> 
     <add namespace="System.Data"/> 
    </namespaces> 
</pages> 

Je sais que ce n'est pas vraiment partie de votre question, mais je recommande la construction d'une classe remplie de propriétés représentant les champs de votre table de données. En utilisant Linq, vous pouvez facilement convertir vos lignes dans l'objet de classe et renvoyer une liste d'entre elles. Voici un code approximatif (et non compilé).

[Serializable] 
public class MyClass 
{ 
    public string Property1 { get; set; } 
    public string Property1 { get; set; } 
} 

Vous voulez qu'il soit sérialisable si votre service Web peut-il revenir au format XML ou JSON (mais vous le retournez). Le linq ressemblerait à ceci:

var result = from r in dataSet.Table[0].Rows.AsEnumerable() 
      select new MyClass() { 
       Property1 = r["Field1"].ToString() 
       Property2 = r["Field2"].ToString() 
      }; 

return result.ToList(); 

Dans mon expérience personnelle, les DataSets ont tendance à être des porcs de ressources. En outre, Linq sera plus efficace que vos boucles for.

Espérons que cela aide.

+0

Wow Josh, ce deuxième exemple vous montre que j'ai vraiment travaillé, et c'est beaucoup plus propre et bien organisé, j'aime beaucoup les choses comme ça. La seule chose est que j'ai dû supprimer la méthode AsEnumerable() pour le faire fonctionner. Mais maintenant fonctionne comme un charme! :) merci beaucoup pour cela, malheureusement l'exemple web.config n'a pas fonctionné, mais ne vous en souciez pas. merci encore – zanona

0

Supprimer le Reffrence (système .Data) ..et Ajouter encore la même réponse .. il pourrait être travail ..