Le stockage de C# structure de données dans une base de données SQL
Je suis nouveau dans le monde de ASP.NET et SQL server, donc veuillez pardonner mon ignorance ...
Si j'ai une structure de données en C# (par exemple, disons, un vecteur qui stocke des chaînes), est-il possible de stocker le contenu du vecteur dans la table SQL? Je veux faire cela pour que ce soit rapide pour convertir les données en arrière dans le vecteur forme aussi vite que possible sans avoir à construire de l'élément par élément. Presque comme écrire des données binaires dans un fichier, puis de le lire et de le copier à un alloués structure en C.
J'ai créé une table dans SQL Server 2008 pour lequel un champ est défini comme VARBINARY(MAX). Je pensais commencer avec ça.
Quelqu'un pourrait me montrer un exemple de comment je pourrais aller sur le stockage et la récupération d'un vecteur de, disons, 10 cordes, dans et à partir de ce champ? Est-ce même possible (je ne peux pas penser pourquoi pas)?
Merci!
OriginalL'auteur alienfluid | 2008-10-19
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, il est la voie la plus évidente de la simple création d'une structure relationnelle et de la cartographie de l'objet à champs dans la base de données.
Seconde, si vous avez un objet qui est sérialisable, vous pouvez le stocker dans SQL server. Je l'ai fait sur l'occasion, et ont utilisé le Texte de type de données dans SQL Server pour stocker le fichier XML.
Avis: je préfère stocker des objets sérialisés XML au lieu de données binaires. Pourquoi? Parce que vous pouvez réellement lire ce qui est là (pour le débogage), et dans SQL Server, vous pouvez utiliser XQuery pour sélectionner des données de l'objet sérialisé. De mon expérience, le gain de performances de l'utilisation de données binaires ne sera pas la peine par rapport à avoir des données est plus facile à déboguer et peut être utilisé dans une pseudo-relationnelle de la mode. Jetez un oeil à SQL Server XQuery capacités. Même si vous ne prévoyez pas de l'utiliser tout de suite, il n'y a pas de raison de vous mettre dans un coin.
Vous pouvez regarder quelques exemples d'utilisation de la NetDataContractSerializer.
Je crois que ce que vous appelez un vecteur est une Liste<> en C#. Prendre un coup d'oeil dans le Système.Les Collections.Génériques. Vous pouvez utiliser le NetDataContractSerializer pour sérialiser une Liste de 3 chaînes de caractères comme:
Cet exemple juste sérialise une liste, les sorties, la sérialisation de la console, puis prouve qu'il a été hydraté correctement sur le revers de la médaille. Je pense que vous pouvez voir ici, vous pouvez soit faire un dump de la mémoire de flux dans une chaîne et de l'écrire à la base de données, ou d'utiliser un autre type de flux que d'un flux de mémoire pour le faire.
N'oubliez pas de Système de référence.Moment de l'exécution.La sérialisation d'obtenir l'accès à la NetDataContractSerializer.
Jackson je suis d'accord avec vous, quand vous dites "je préfère stocker des objets sérialisés XML au lieu de données binaires", mais que si j'ai pour sérialiser les interfaces?
les interfaces ne sont pas sérialisables donc mis en œuvre les propriétés doivent être ignorés...méthode ci-dessus est très utile dans certains cas où vous avez beaucoup de temps des opérations sur les données de la structure de la création...je préfère utiliser JSON sérialiseur de cette façon, vous permettra d'économiser de la mémoire...
J'ai basculé sur XML vs JSON au cours des deux dernières années. Mon travail actuel est tout à fait unique des besoins de stockage de données qui a fait beaucoup de normalisé des structures de données et aussi beaucoup de one-offs qui nous avons l'habitude de les stocker dans une colonne nvarchar(max) sous forme de JSON. Dernièrement, nous avons été s'éloigne de NHibernate pour Dapper pour la performance et pour d'autres raisons et l'ai fait beaucoup plus pure SQL, et j'ai trouvé que XML m'a aidé un peu de temps parce que T-SQL XML construit en pour l'interrogation. Je pense qu'il peut devenir dangereux si galvaudé, mais il est dang utile.
OriginalL'auteur Jason Jackson
Si il vient de C alors un vecteur signifie probablement une Liste: en.wikipedia.org/wiki/Std::vector
OriginalL'auteur Vyrotek
En supposant que les objets sont marqués avec
[Serializable]
ou de mettre en œuvreISerializable
laBinaryFormatter
classe donne un moyen simple de faire cela.Si non, vous êtes en train de regarder (non trivial) de code personnalisé.
OriginalL'auteur Greg Beech
Si tu vas le faire (et je suppose que c'est techniquement possible), vous pourriez tout aussi bien utiliser un fichier plat: il n'y a pas de point à l'aide d'une base de données relationnelle.
Pourquoi ne pas utiliser une base de données? Il a certainement l'avantage d'être plus évolutif qu'un fichier plat. Et si vous utilisez une sérialisation XML format vous pouvez également effectuer une requête sur les données dans SQL Server à l'aide de XQuery.
Si vous êtes à la persistance d'un objet complexe à une base de données, chaque champ dans l'objet doit obtenir son propre colonne ou une table de sorte que vous pouvez rechercher et de requête sur le champ.
Je suis d'accord que l'utilisation d'une structure relationnelle de sens que dans la grande majorité des cas. Cette échoue lorsque vous avez des données est basée sur un modèle personnalisable. Si vous ne savez pas ce champs existent au moment de la conception, il est difficile de venir avec un normalisée structure de données dans la db.
Il est inutile de re-création de votre structure objet dans une base de données relationnelle, SAUF si vous avez absolument besoin de l'interroger. Et même alors, il est beaucoup plus simple et plus facile à soutenir si vous déposez vos objets en xpath-queryable xml.
OriginalL'auteur Joel Coehoorn
Voici une autre approche plus générale, pour les listes. Remarque, le type réel stockées dans la liste doit également être sérialisable
Ensuite dans le code client:
Un moyen de base pour le stockage/récupération de ce tableau d'octets pourrait être d'utilisation simple SQLClient objets:
OriginalL'auteur Ash
Il y a des raisons d'être flexible. Des règles ou des lignes directrices, pour la structure de base de données ne devraient pas être autorisés à entraver la créativité. Étant donné que le premier thread ici, je peux voir une approche hybride pour le stockage du sérialisé et en limitant les colonnes. De nombreux une application pourrait être grandement améliorée en gardant l'esprit ouvert aux possibilités.
De toute façon, j'ai apprécié les débutants point de vue sur la question. Nous maintient tous les frais..
OriginalL'auteur Chuck
J'ai plus d'expérience avec les bases de données relationnelles que c#, mais la sérialisation binaire est une façon acceptable d'aller, car il permet à l'ensemble de l'objet de l'état à être enregistré dans la base de données. La sérialisation XML est à peu près la même, bien que les types génériques ne sont pas autorisés.
OriginalL'auteur jle