我想将一个对象(任何类型)保存到SQL Server 2005数据库中的字段中。这是否可能?我需要将对象转换为类似字节数组的东西,并在检索时将其转换回来吗?
我想将一个对象(任何类型)保存到SQL Server 2005数据库中的字段中。这是否可能?我需要将对象转换为类似字节数组的东西,并在检索时将其转换回来吗?
如果需要的话,您可以在 SQL Server 中使用 VARBINARY(MAX)
字段类型。您可以在其中存储任何类型的对象,最大大小为 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();
Marc
如果您正在使用实体框架(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将属性存储为表中的列,这似乎更直接)。
但是要注意以下几点:数据库是:
因此,您不希望使用任何特定于平台或版本的序列化技术。您经常会看到人们提到BinaryFormatter
用于持久性,但这会陷入上述两个陷阱。如果您改变了平台甚至只是更改一些属性,您就会受挫。
您需要一种独立于实现的方法;最简单的方法(也保留了可读性)是xml或json,可能通过XmlSerializer
或Json.NET进行(存储在[n]varchar(max)
中)。如果您不关心可读性,则“协议缓冲区”(快速/二进制)也很好(存储在varbinary(max)
中),并且可用于大多数平台(包括C#/.NET等)。
要做到这一点,您需要对对象进行序列化。 您可以在此处查看示例: