Подтвердить что ты не робот

Могу ли я сохранить "Объект" в базе данных SQL Server?

Я хочу сохранить объект (любого типа) в поле в базе данных в SQL Server 2005. Возможно ли это? Должен ли я преобразовать объект во что-то, например массив байтов, и отбрасывать его при извлечении?

4b9b3361

Ответ 1

Вы можете использовать тип поля VARBINARY(MAX) в SQL Server, если хотите. Вы можете хранить там любые типы объектов размером до 2 ГБ.

Чтобы получить доступ к нему, вы можете использовать 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();

Марк

Ответ 2

Я бы использовал JSON для преобразования объекта в строку и сохранения его в поле VARCHAR или TEXT. Данные хранятся не только в удобочитаемом для человека формате, но также и для чтения с разных языков, поскольку практически во всех основных языках имеется анализатор JSON.

Ссылка, которую я разместил, содержит ссылки на несколько библиотек на многих языках (включая С#), я использовал эту пару раз в прошлом.

Ответ 3

Как говорили другие, сериализация может быть ключевым здесь (предполагая, что вы не хотите использовать ORM для хранения свойств в виде столбцов в таблице, что кажется гораздо более прямым).

Некоторые предостережения; база данных:

  • долгосрочное хранение
  • не связан с вашим кодом .NET

Таким образом, вы не хотите использовать любой метод сериализации, специфичный для платформы или для конкретной версии. Вы часто увидите, что люди упоминают BinaryFormatter для стойкости, но это относится к обоим вышеперечисленным ловушкам. Если вы когда-либо изменили платформу, вы были бы перегружены, или даже если вы просто измените некоторые свойства.

Вам нужен независимый от реализации подход; самый простой (который также сохраняет способность быть читаемым человеком) - это xml или json, возможно, через XmlSerializer или Json.NET(хранится в [n]varchar(max)). Если вам неинтересно читать по-человечески, "протокольные буферы" (fast/binary) будут хорошо (сохранены в varbinary(max)) и доступны для большинство платформ (включая С#/. NET/etc).

Ответ 4

Вот пример, если вы используете 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();