53 votes

Puis-je sauvegarder un "objet" dans une base de données SQL Server ?

Je veux enregistrer un objet (de n'importe quel type) dans un champ d'une base de données en SQL Server 2005. Est-ce possible ? Dois-je convertir l'objet en quelque chose, comme un tableau d'octets par exemple, et le retransférer lors de sa récupération ?

35voto

marc_s Points 321990

Vous pouvez utiliser le VARBINARY(MAX) type de champ dans SQL Server, si vous le souhaitez. Vous pouvez y stocker tout type d'objet, d'une taille maximale de 2 Go.

Pour y accéder, vous pouvez utiliser ADO.NET - quelque chose comme ceci :

object yourMysteryObject = (whatever you like it to be);

MemoryStream memStream = new MemoryStream();
StreamWriter sw = new StreamWriter(memStm);

sw.Write(yourMysteryObject);

SqlCommand sqlCmd = new SqlCommand("INSERT INTO TableName(VarBinaryColumn) VALUES (@VarBinary)", sqlConnection);

sqlCmd.Parameters.Add("@VarBinary", SqlDbType.VarBinary, Int32.MaxValue);

sqlCmd.Parameters["@VarBinary"].Value = memStream.GetBuffer();

sqlCmd.ExecuteNonQuery();

Marc

31voto

Badaro Points 1746

J'utiliserais JSON pour convertir l'objet en une chaîne de caractères et la stocker dans un champ VARCHAR ou TEXT. Non seulement les données sont stockées dans un format lisible par l'homme, mais elles sont également lisibles à partir de différents langages, puisque pratiquement tous les langages courants disposent d'un analyseur JSON.

Le lien que j'ai posté contient des liens vers plusieurs bibliothèques dans de nombreux langages (y compris C#), j'ai utilisé celui-ci à plusieurs reprises dans le passé.

13voto

Marc Gravell Points 482669

Comme d'autres l'ont dit, la sérialisation peut être la clé ici (en supposant que vous ne voulez pas utiliser l'ORM pour stocker les propriétés comme des colonnes dans une table, ce qui semble beaucoup plus direct).

Quelques mises en garde toutefois : une base de données est :

  • le stockage à long terme
  • sans rapport avec votre code .NET

En tant que tel, vous no Vous ne voulez pas utiliser une technique de sérialisation spécifique à une plate-forme ou à une version. Vous verrez souvent des personnes mentionner BinaryFormatter pour la persistance, mais cela tombe dans les deux pièges ci-dessus. Vous vous retrouveriez dans l'impasse si vous changiez de plateforme, ou même si vous ne faisiez que changer certaines propriétés .

Vous avez besoin d'une approche indépendante de l'implémentation ; la plus simple (qui conserve également la possibilité d'être lisible par l'homme) est le xml ou le json, peut-être par l'intermédiaire de XmlSerializer ou Json.NET (stocké dans un [n]varchar(max) ). Si vous ne vous souciez pas de la lisibilité humaine, des "tampons de protocole" (rapides/binaires) feraient l'affaire (stockés dans un fichier varbinary(max) ), et est disponible pour la plupart des plateformes (y compris C#/.NET/etc).

1voto

Thinker Points 7239

Pour ce faire, vous devez sérialiser votre objet. Vous pouvez regarder ici des exemples :

http://www.c-sharpcorner.com/UploadFile/bipinjoshi/serializingObjectsinCS11102005234746PM/serializingObjectsinCS.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X