Сохранение/чтение данных DataTable

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Сохранение/чтение данных DataTable

Сообщение viter.alex » 03.11.2009 (Вт) 18:13

Использую DataTable для отображения данных в DataGridView. Не могу понять, как сохранять накопленные за время работы данные, чтобы можно было их прочитать при следующей загрузке.
Пишу данные так:
Код: Выделить всё
      Dim xmlwrtr As Xml.XmlWriter = Xml.XmlWriter.Create(My.Settings.dbFile)
      dtStatistic.WriteXml(xmlwrtr)
      xmlwrtr.Close()

Пытаюсь читать:
Код: Выделить всё
    With My.Settings
      …
      If File.Exists(.dbFile) Then
        dtStatistic = New DataTable
        dtStatistic.ReadXml(Xml.XmlReader.Create(My.Settings.dbFile))
      Else
        CreateNewDataTable(dtStatistic)
      End If

    End With

Но пишет ошибку:
System.InvalidOperationException was unhandled
Message="DataTable не поддерживает выведение схемы из Xml."
Source="System.Data"


Как это не поддерживает? А зачем тогда ReadXML?
Лучше день потерять — потом за пять минут долететь!

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Сохранение/чтение данных DataTable

Сообщение MIT » 04.11.2009 (Ср) 0:11

Код: Выделить всё
                    Dim bs As New Runtime.Serialization.Formatters.Binary.BinaryFormatter
                    Dim ms As New MemoryStream
                    bs.Serialize(ms, ds.Tables(0))
не?
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Сохранение/чтение данных DataTable

Сообщение viter.alex » 04.11.2009 (Ср) 0:38

Ничего не понял. Сказал «а», говори и «б»
Лучше день потерять — потом за пять минут долететь!

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Сохранение/чтение данных DataTable

Сообщение MIT » 04.11.2009 (Ср) 12:38

До "б" и сам бы смог догадаться, коль заинтересован. Это альтернатива твоему подходу - сохранение данных при помощи бинарной сериализации.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Сохранение/чтение данных DataTable

Сообщение viter.alex » 04.11.2009 (Ср) 13:09

Спасибо, но я очень слабо пока представляю себе работу с потоками. Записать или прочитать файл — это я еще смогу при помощи StreamReader и StreamWriter, а вот как этот MemoryStream вывести в файл, я не могу понять.
Но неужели нет методов для DataTable или DataGridView, чтобы писать и читать в файлы?
Лучше день потерять — потом за пять минут долететь!

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Сохранение/чтение данных DataTable

Сообщение viter.alex » 04.11.2009 (Ср) 14:01

Прошу сильно не ругаться. С грехом пополам записал в файл такой процедурой:
Код: Выделить всё
  Public Sub SaveDB(ByVal dt As DataTable, ByVal path As String)
    Dim bs As New Runtime.Serialization.Formatters.Binary.BinaryFormatter 'Сериализатор
    Dim ms As New MemoryStream 'Поток для таблицы данных
    Dim fs As New FileStream(path, FileMode.Create, FileAccess.Write) 'поток для записи в файл
    bs.Serialize(ms, dt) 'Сериализация
    ms.Seek(0, SeekOrigin.Begin) 'Ставим поток на начало
    Dim content(ms.Length - 4) As Byte 'Массив для потока
    ms.Read(content, 0, content.Length) 'Читаем поток в массив
    Dim strw As New StreamWriter(fs) 'поток записи в файл
    strw.Write(UnicodeEncoding.Unicode.GetString(content)) 'пишем в файл
    strw.Close() : fs.Close() : ms.Close()
  End Sub

А дальше? Как теперь это прочитать назад в таблицу?
Лучше день потерять — потом за пять минут долететь!

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Сохранение/чтение данных DataTable

Сообщение MIT » 04.11.2009 (Ср) 15:14

Процедуре Serialize (и Deserialize соответственно) в качестве параметра надо передавать поток. Класс Stream абстрактный, т.е. не важно какой поток передавать, все зависит от конкретной ситуации: надо тебе писать в файл - передавай FileStraem, надо в оперативку - MemoryStream.
Код: Выделить всё
Dim bs As New Runtime.Serialization.Formatters.Binary.BinaryFormatter
Dim fs As New FileStream(path, FileMode.Create, FileAccess.Write)
bs.Serialize(fs, ds.Tables(0))
fs.Close : fs.Dispose
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Сохранение/чтение данных DataTable

Сообщение viter.alex » 04.11.2009 (Ср) 15:48

Спасибо. Все получилось. Вот так и думал, когда городил эти потоки друг на друга, что всё гораздо проще
Код: Выделить всё
  Public Sub SaveDB(ByVal dt As DataTable, ByVal path As String)
    Dim bs As New Runtime.Serialization.Formatters.Binary.BinaryFormatter 'Сериализатор
    Dim fs As New FileStream(path, FileMode.Create, FileAccess.Write) 'поток для записи в файл
    bs.Serialize(fs, dt) 'Сериализация
    fs.Close() : fs.Dispose()
  End Sub

  Public Sub ReadDB(ByRef dt As DataTable, ByVal path As String)
    Dim bs As New Runtime.Serialization.Formatters.Binary.BinaryFormatter
    Dim fs As New FileStream(path, FileMode.Open, FileAccess.Read)
    dt = bs.Deserialize(fs)
    fs.Close() : fs.Dispose()
  End Sub
Лучше день потерять — потом за пять минут долететь!


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 85

    TopList  
cron