我可以在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)。
要做到这一点,你需要序列化你的对象。 你可以看看这里的例子: