J'utilise un service Web pour interroger des données à partir d'une table. Ensuite, je dois l'envoyer à un utilisateur qui le veut comme un DataTable. Puis-je sérialiser les données? Ou devrais-je l'envoyer en tant que DataSet. Je suis nouveau aux services Web, donc je ne suis pas sûr de la meilleure façon de le faire.Puis-je sérialiser un tableau de données ou un ensemble de données à transférer sur un service Web en C#?
Répondre
Vous pouvez transférer DataTable via un service Web. C'est probablement votre meilleure option, car c'est ce que le client a demandé.
Bien sûr. DataTable et DataSet sont tous deux sérialisables, et ils ont également des fonctions ReadXml() et WriteXml() que vous pouvez utiliser.
Si vous l'exposez comme DataSet
/DataTable
, il fera quand même sa propre sérialisation (via IXmlSerializable
, IIRC). Notez que DataSet
/DataTable
ne permettent pas d'obtenir de bons types de données sur les services Web si vous souhaitez que le service soit portable vers d'autres formes (par exemple, un client Java, etc.). Mais vous pouvez simplement l'exposer comme tel si vous voulez ...; .NET s'occupera de la traduction.
Voir this post par Richard Blewett pour des raisons pour lesquelles vous ne voudriez probablement pas faire cela.
EDIT: Pour résumer ce qui précède:
- L'utilisation
DataSet
n'est pas interopérable. Il utilise des annotations qui n'ont de sens que lorsque chaque extrémité du lien utilise la pile Microsoft. DataSet
est une classe assez inefficace pour l'envoi de données sur le réseau - elle contient également des données de suivi des modifications et des métadonnées.- Il introduit un couplage étroit - les modifications apportées au niveau du service, qui peuvent même ne pas être nécessaires pour le client, doivent également être prises en compte par le client.
lien ne fonctionne plus – betitall
sérieusement, un downvote parce qu'un lien vers un site externe posté il y a 4 ans a cessé de fonctionner? blog déplacé trouvé et lien mis à jour –
Désolé, je n'étais pas clair sur le protocole et la signification de downvoting. Je voulais seulement indiquer que le lien était brisé. Downvote supprimé. – betitall
Vous pouvez envoyer les données sous forme de chaîne XML à partir d'un ensemble de données par DataSet.GetXml()
Et que l'utilisateur peut désérialiser avec DataSet.ReadXml()
Et obtenir le datatable de l'ensemble de données par DataSet.Tables
Bonne chance
Le moyen le plus simple et le plus interopérable est de sérialiser le jeu de données en XML avec la méthode GetXml(), puis de passer comme une chaîne du service Web. Le client peut ensuite le désérialiser avec la méthode ReadXml().
Nous avons consommé un service qui l'a fait de cette façon, et cela a bien fonctionné.
L'alternative consiste à exposer la classe DataSet dans le service et à renvoyer l'objet de jeu de données. Mais cela va compliquer les choses, surtout si n'importe quel client devrait être non.NET.
DataTable sont sérialisables, mais certaines astuces existent pour renvoyer un DataTable non typé via WebService. Avant que la méthode de service Web ne renvoie le DataTable rempli (côté service), elle doit avoir une propriété TableName affectée à la propriété
Dans le cas où à l'intérieur de l'OperationContract DataTable reçoit la référence de DataTable typé la sérialisation échouera avec messaga comme "" Le serveur n'a pas fourni une réponse significative; Cela peut être dû à une incompatibilité de contrat, à une fermeture de session prématurée ou à une erreur interne du serveur. »
Cela signifie que vous devez remplir le DataTable créé, par exemple en utilisant la méthode Fusionner (ou manuellement). ;
DataTable IHorizonCLService.RetrieveChangeLog(int iId)
{
DataTable dt = new DataTable(); //create new DataTable to be returned by this web method
dt.Merge(HorMan.RetrieveChangeLog(iId)); //get typed DataTable and fills the DataTable
dt.TableName = "SurChangeLogHor"; //assigns name
return dt;
}
Juste une remarque intéressante de here
et, jamais, jamais, jamais envoyé une instance de System.Data.DataSet sur le fil n'a jamais été, est pas maintenant, et. ne sera jamais aucune raison d'envoyer jamais une instance de ce type partout. Il est au-delà de la masse et rend l'objet de transfert de données de 10 000 propriétés plus léger. Le fait que quelque chose soit sérialisable ne signifie pas qu'il devrait l'être.
- 1. Transférer ou sérialiser l'assemblage
- 2. C# Convertir un tableau bidimensionnel en un ensemble de données/datable
- 3. System.OutOfMemoryException utilisant C# sur un grand ensemble de données
- 4. Architecture: défi de pipeline de données basé sur un ensemble
- 5. Comment lier un ensemble de données à un sous-rapport
- 6. Comparer un ensemble de données ou une meilleure idée
- 7. mettre Custom Class Array dans un ensemble de données ou XML (C#)
- 8. Transférer des données dans un ModalPopupExtender
- 9. Collecte de données - service web ou application web hébergée?
- 10. XSLT - Sélectionnez un seul ensemble de données
- 11. Comment hacher un grand objet (ensemble de données) en Python?
- 12. Transfert de données MS Excel vers un site Web via un service Web
- 13. .NET - Utilisation d'un type personnalisé dans un ensemble de données
- 14. Obtient un ensemble de plages de dates/heures basées sur des données de base de données
- 15. Développement sur un service Web
- 16. Comment sérialiser DateTime nullable dans un service Web .net?
- 17. Pouvez-vous forcer un scalaire ou un tableau ref à être un tableau en Perl?
- 18. Conversion d'un ensemble de données imbriqué à un ensemble de données à plat, tout en conservant suffisamment de données pour la reconvertir en emboîtés mis
- 19. Les enregistrements de retour de base de données sont-ils un objet ou un tableau?
- 20. Comment consommer un service Web en Objective-C?
- 21. manipulation de champs dans un tableau de bits en C++
- 22. Exposition de grands ensembles de données de service Web à la consommation par Access ou Excel
- 23. Re-séquence un ensemble de données dans SQL Server
- 24. Comment rassembler des listes imbriquées en JSON en utilisant Jersey? Je reçois un tableau de zéros ou un tableau de dictionnaires à un élément contenant un tableau
- 25. Vérification des mots de passe contre la base de données de mots sur le serveur ou utiliser un service Web?
- 26. Liaison de données à un objet en C#
- 27. Pouvez-vous utiliser un ensemble de données SAS en tant que source de données SSIS?
- 28. ANTLR est-il un outil approprié pour sérialiser/désérialiser un format de données binaire?
- 29. Le moyen le plus rapide pour stocker un grand ensemble de données (C# ASP.net)
- 30. Comment configurer un tableau unique ou un dictionnaire pour une utilisation dans plusieurs sources de données?
Assurez-vous de définir le nom de la table ou l'erreur lors de la sérialisation. – tsilb