我可以在SQL Server数据库中保存“对象”吗?

我想将一个对象(任何types)保存到SQL Server 2005数据库中的一个字段中。是否有可能? 我是否必须将该对象转换为某个东西,比如说像一个字节数组,然后在取回时将其转换回来?

如果您愿意,可以在SQL Server中使用VARBINARY(MAX)字段types。 您可以在其中存储任何types的对象,最多2 GB。

要访问它,你可以使用ADO.NET – 如下所示:

 object yourMysteryObject = (whatever you like it to be); MemoryStream memStream = new MemoryStream(); StreamWriter sw = new StreamWriter(memStream); 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(); 

渣子

我将使用JSON将对象转换为string,并将其存储在VARCHAR或TEXT字段中。 不仅数据以人类可读的格式存储,而且也可以从不同的语言读取,因为几乎所有的主stream语言都提供了JSONparsing器。

我发布的链接有多种语言(包括C#)的几个库的链接,过去我曾经使用过这个链接 。

这里是一个例子,如果你正在使用entity framework(EF):

  using (DbContext db = new DbContext()) { // The object that you want to serialize. In this case it is just an empty instance YourObject objectToSerialize = new YourObject(); IFormatter formatter = new BinaryFormatter(); using (MemoryStream stream = new MemoryStream()) { formatter.Serialize(stream, objectToSerialize); // EF model. In one of its properties you store the serialized object YourModel modelObject = new YourModel(); // In your model 'SerializedObject' should be of type byte[]. In the database it should be of type varbinary(MAX) modelObject.SerializedObject = stream.ToArray(); db.YourModel.Add(modelObject); db.SaveChanges(); } } 

这是如何反序列化对象:

 // De-serialize IFormatter formatter = new BinaryFormatter(); Stream stream = new MemoryStream(serializedObject); YourObject deserializedYourObject = (YourObject)formatter.Deserialize(stream); stream.Close(); 

正如其他人所说,序列化可能是这里的关键(假设您不想使用ORM将属性存储为表中的列,这似乎更直接)。

一些警告,但; 一个数据库是:

  • 长期储存
  • 与您的.NET代码无关

因此,您希望使用任何平台特定或版本特定的序列化技术。 你会经常看到有人提到了BinaryFormatter的持久性,但是这个陷入了两个陷阱。 如果你改变了平台,或者即使你改变了一些属性 ,你也会受到伤害。

您需要独立于实施的方法; 最简单的(它也保留了人类可读的能力)是xml或json,可能是通过XmlSerializer或Json.NET(存储在[n]varchar(max) )。 如果你不关心人类可读性,“协议缓冲区”(快速/二进制)将会很好(存储在varbinary(max) ),并且可用于大多数平台 (包括C#/ .NET / etc)。

要做到这一点,你需要序列化你的对象。 你可以看看这里的例子:

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