Вопрос

Как я могу сохранить vb.net пользовательский объект в базе данных sql.Я не пытаюсь копировать свойства со столбцами.Я имею в виду что-то вроде преобразования или кодирования моего объекта в массив байтов, а затем сохранения этого в поле в базе данных.Например, когда вы сохраняете экземпляр объекта в сеансе, но мне нужна информация, которая сохранится после текущего сеанса.


@Орион Эдвардс

Дело не в позициях.Это потому, что однажды вы измените свой код.Затем вы попытаетесь десериализовать старый объект, и ВАША ПРОГРАММА ЗАВЕРШИТСЯ СБОЕМ.

Моя программа не будет "АВАРИЙНО завершать работу", она выдаст исключение.К счастью для меня, в .net есть целый набор классов, предназначенных для такого случая.В это время я обновлю свои устаревшие данные и помещу их обратно в базу данных.В этом суть данного поля (или позиции, в зависимости от обстоятельств).

Это было полезно?

Решение

Вы можете использовать сериализация - это позволяет вам хранить ваш объект как минимум в 3 формах:двоичный (подходит для больших двоичных объектов), XML (используйте преимущества XML-типа данных MSSQL) или просто обычный текст (сохраняйте в varchar или текстовом столбце).

Другие советы

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

http://thedailywtf.com/Articles/The-Mythical-Business -Layer.aspx

Сохранять объекты в базе данных не очень хорошая идея. Он убивает все хорошие вещи, для которых предназначена база данных.

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

XmlSerializer или DataContractSerializer в .net 3.x выполнят эту работу за вас.

@aku, lomaxx и bdukes - ваши решения - это то, что я искал.

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

Сериализовать

    #'res is my object to serialize
    Dim xml_serializer As System.Xml.Serialization.XmlSerializer
    Dim string_writer As New System.IO.StringWriter()
    xml_serializer = New System.Xml.Serialization.XmlSerializer(res.GetType)
    xml_serializer.Serialize(string_writer, res)

Десериализовать

    #'string_writer and xml_serializer from above
    Dim serialization As String = string_writer.ToString
    Dim string_reader As System.IO.StringReader
    string_reader = New System.IO.StringReader(serialization)
    Dim res2 As testsedie.EligibilityResponse
    res2 = xml_serializer.Deserialize(string_reader)

То, что вы хотите сделать, называется " Сериализация " ваш объект, и .Net имеет несколько разных способов сделать это. Одним из них является класс XmlSerializer в пространстве имен System.Xml.Serialization.

Другой находится в пространстве имен System.Runtime.Serialization. Здесь есть поддержка форматера SOAP, двоичного форматера и базового класса, который вы можете унаследовать, и который реализует общий интерфейс.

Для того, о чем вы говорите, предложенный ранее BinaryFormatter, вероятно, будет иметь лучшую производительность.

Я отвечаю за 1800. Информация об этом.
Сериализация объектов для длительного хранения никогда не была хорошей идеей.

  

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

Это не вопрос позиции. Это потому, что однажды вы измените свой код. Затем вы попытаетесь десериализовать старый объект, и ваша программа рухнет.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top