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

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

 pjp19 авг. 2009 г., 13:49
Вы также можете сериализовать в XML, который будет проще проверять внутри БД, чем двоичные данные
 Ahmad Farid19 авг. 2009 г., 13:51
Нет, мне не нужно знать или запрашивать содержимое таблиц, хранящихся
 Paddy19 авг. 2009 г., 13:49
Это не отличный дизайн БД. Вам нужно будет запросить атрибуты объекта в любой момент? например получить все объекты, где object.Foo = 1.

Ответы на вопрос(5)

Решение Вопроса

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();

Марк

 Ahmad Farid19 авг. 2009 г., 14:06
Как я могу записать объект в поток памяти? не имея дело с жестким диском? Можете ли вы привести пример PLZ?
 marc_s19 авг. 2009 г., 14:00
Любой тип объекта может быть записан в MemoryStream и, таким образом, ему присвоено значение SqlParameter, которое затем запишет его в базу данных.
 Ahmad Farid19 авг. 2009 г., 13:50
но как я могу передать объект в тип VARBINARY?
 Ahmad Farid19 авг. 2009 г., 13:57
но это изображение читается из файла. Что делать, если у меня есть класс или объект, созданный во время выполнения. Ничего общего с файлами.
 AnotherParker31 янв. 2013 г., 16:10
А? Если вы передаете sw.Write () универсальный объект Object, он просто вызывает метод ToString этого объекта! Это не сериализует это!
 Ahmad Farid19 авг. 2009 г., 13:53
Но я не хочу сохранять его на жестком диске. Я просто хочу поместить это в базу данных.
 Marc Gravell♦19 авг. 2009 г., 14:11
BinaryFormatter являетсяочень плохой выбор для длительного хранения.

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

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

 Dan Cundy06 дек. 2016 г., 14:51
К сожалению, теперь у вас есть мертвые ссылки на этот сайт.jayrock.berlios.de
 Badaro31 янв. 2017 г., 20:56
Спасибо, ссылка обновлена.

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

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

длительное хранениене относится к вашему .NET-коду

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

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

            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();
 ppumkin28 авг. 2015 г., 14:20
Как вы возвращаете его обратно к объекту, который мы только что сохранили ... зная, что это был за оригинальный объект.
 Elton28 апр. 2017 г., 22:27
Сериализуемый класс должен быть помечен атрибутом Serializable.
 Ivo Stoyanov28 авг. 2015 г., 15:33
@ppumpkin. Я обновил свой ответ информацией о том, как десериализовать объект. Удачного кодирования :)

Ваш ответ на вопрос