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 ?
Réponses
Trop de publicités?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
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é.
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).