オブジェクト(任意のタイプ)を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();
マーク
[〜#〜] json [〜#〜] を使用して、オブジェクトを文字列に変換し、それをVARCHARまたはTEXTフィールドに格納します。データは人間が読める形式で保存されるだけでなく、ほとんどすべての主流言語がJSONパーサーを利用できるため、さまざまな言語からも読み取ることができます。
私が投稿したリンクには、多くの言語のいくつかのライブラリ(C#を含む)へのリンクがあります。過去に数回 this one を使用しました。
他の人が言ったように、ここではシリアル化が重要な場合があります(ORMを使用してプロパティをテーブルの列として格納したくない場合を想定しています)。
ただし、いくつかの注意事項があります。データベースは次のとおりです。
そのため、プラットフォーム固有またはバージョン固有のシリアル化手法を使用したいnotを行います。永続性のために人々がBinaryFormatter
に言及するのをよく目にしますが、これは上記のトラップの両方に該当します。プラットフォームを変更した場合、または 一部のプロパティを変更する を変更した場合でも、あなたはすくわれます。
実装に依存しないアプローチが必要です。最も簡単な(人間が読める機能も保持している)は、おそらくXmlSerializer
またはJson.NET([n]varchar(max)
に格納されている)を介したxmlまたはjsonです。人間が読める形式を気にしない場合、「プロトコルバッファ」(高速/バイナリ)はうまく機能し(varbinary(max)
に格納されます)、 ほとんどのプラットフォームで利用可能 ( C#/。NET/etc)。
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();
これを行うには、オブジェクトをシリアル化する必要があります。ここで例を見ることができます: