web-dev-qa-db-ja.com

SQL Serverデータベースに「オブジェクト」を保存できますか?

オブジェクト(任意のタイプ)をSQL Server 2005のデータベースのフィールドに保存したいのですが、可能ですか?オブジェクトを、たとえばバイト配列などの何かに変換し、取得時にキャストし直す必要がありますか?

44
Ahmad Farid

必要に応じて、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();

マーク

30
marc_s

[〜#〜] json [〜#〜] を使用して、オブジェクトを文字列に変換し、それをVARCHARまたはTEXTフィールドに格納します。データは人間が読める形式で保存されるだけでなく、ほとんどすべての主流言語がJSONパーサーを利用できるため、さまざまな言語からも読み取ることができます。

私が投稿したリンクには、多くの言語のいくつかのライブラリ(C#を含む)へのリンクがあります。過去に数回 this one を使用しました。

23
Badaro

他の人が言ったように、ここではシリアル化が重要な場合があります(ORMを使用してプロパティをテーブルの列として格納したくない場合を想定しています)。

ただし、いくつかの注意事項があります。データベースは次のとおりです。

  • 長期保存庫
  • .NETコードとは関係ありません

そのため、プラットフォーム固有またはバージョン固有のシリアル化手法を使用したいnotを行います。永続性のために人々がBinaryFormatterに言及するのをよく目にしますが、これは上記のトラップの両方に該当します。プラットフォームを変更した場合、または 一部のプロパティを変更する を変更した場合でも、あなたはすくわれます。

実装に依存しないアプローチが必要です。最も簡単な(人間が読める機能も保持している)は、おそらくXmlSerializerまたはJson.NET([n]varchar(max)に格納されている)を介したxmlまたはjsonです。人間が読める形式を気にしない場合、「プロトコルバッファ」(高速/バイナリ)はうまく機能し(varbinary(max)に格納されます)、 ほとんどのプラットフォームで利用可能 ( C#/。NET/etc)。

12
Marc Gravell

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();
11
Ivo Stoyanov

これを行うには、オブジェクトをシリアル化する必要があります。ここで例を見ることができます:

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

1
Thinker