none
Хранение данных двумерных таблиц wpf RRS feed

  • Вопрос

  • Добрый день. В программе для хранения таких данных используется ms access. Как показала практика - почти все пользователи отказываются устанавливать ADODB для работы баз данных. Хочу переработать программу, что бы не требовалось дополнительных компонентов для установки, и работало все "из коробки". Почти все данные будут хранится на сервере. Остаются некоторые, которые необходимо хранить и изменять локально. Их не много. Таблица будет состоять из 50-200 строк и 7 колонок. 

    Вопрос. Как ее лучше хранить на ПЗУ для того, что бы в дальнейшем подгружать при запуске программы в класс структуру или в concurrentDictionary(String, String() ). Ключом является срока.


    • Изменено Siompc 15 апреля 2021 г. 6:20
    15 апреля 2021 г. 6:19

Ответы

  • Типично небольшое количество данных хранят в XML или JSON. Данные из этих файлов загружают в при старте приложения, например используя сериалайзер. Получается объект который можно использовать как источник данных в UI. При выходе из приложения (или в любой другой удобный момент) данные перезаписываются сохраняя изменения.

    Примеры использования сериализации тут:

    https://docs.microsoft.com/en-us/dotnet/standard/serialization/examples-of-xml-serialization

    В вашем случае можно определить объект который будет иметь все что нужно как то:

    class ЗаписьИзБывшейБазы {

    string Параметр  {get; set; }

    double Значение {get; set} 

    // И так далее как было тут: Параметр (Строка) ; Значение (Число) ; Умолчания (Число) ; Описание (Текст)

    }

    Далее сериализуется список данных объектов. 


    This posting is provided "AS IS" with no warranties, and confers no rights.

    • Помечено в качестве ответа Siompc 16 апреля 2021 г. 8:16
    15 апреля 2021 г. 19:07
    Модератор
  • То, что нужно )) Спасибо. Еще один момент на будущее. Есть способ проверить наличие параметров приложения? По типу My.Settings.Contains("Имя").

    На данный момент я проверяю через исключение на строке - My.Settings.Item("Имя")

    Используйте дизайнер для настроек, тогда доступ будет так: My.Settings.Имя. Ну а дальше можно проверить значение.

    Другой вариант - использовать ConfigurationManager.AppSetting и проверять то что возвращает индексер.

    https://docs.microsoft.com/en-us/dotnet/api/system.configuration.keyvalueconfigurationcollection.item?view=net-5.0


    This posting is provided "AS IS" with no warranties, and confers no rights.

    • Помечено в качестве ответа Siompc 16 апреля 2021 г. 8:16
    16 апреля 2021 г. 3:36
    Модератор

Все ответы

  • Да, и размер таблицы фиксированный. Количество записей не меняется.

    Я напишу как я думаю, а вы поправьте, если этот вариант плохой.

    Будет параметр в программе, в котором записывается строка. Она будет типа: ключ;колонка1;колонка2....колонка7.

    При загрузке это все переводится в нужную структуру данных и составляется concurrentDictionary с ключом и структурой. По закрытию программы данные обратно переводятся в строку и сохраняются в параметрах.

    15 апреля 2021 г. 7:10
  • Здравствуйте,

    Вы хотите сделать что-то, по типу этого: How to bind an 2D array bool[][] to a WPF DataGrid (one-way)? ?


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

    15 апреля 2021 г. 12:49
    Модератор
  • Не совсем. В программе была база данных Access, к которой она подключалась и брала параметры. Так-же она их изменяла соответственно. Пусть будет всего 50 параметров.

    Строка в базе данных выглядит так:

    Параметр (Строка) ; Значение (Число) ; Умолчания (Число) ; Описание (Текст)

    Так как для работы с базами данных требуется наличие дополнительных библиотек, которые нельзя подключить сразу в программу (что бы не требовалось дополнительного ПО для установки, и можно было бы запустить ее сразу), я думаю убрать вообще базу данных на клиентской машине, оставить только вычисления и хранение многих данных на сервере. А вот таблица параметров нужна на клиентской машине. Следовательно я хочу как-то удобно сохранить ее, что бы можно было при запуске приложения получить данные с нее.

    Если я добавлю в программу прямо на уровне кода эти данные, то изменения значений не сохранятся после выхода из нее.

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

    Получается нужно создать параметр приложения типа String в области "Пользователь" с именем, например, "ParamsTable". И в нем хранить строку, содержащую имена параметров, значения и другую информацию через разделитель. А после загрузки программы парсить ее и переводить в вид:

    ConcurrentDictionary(String, ConcurrentDictionary(String, Object))

    Где ключом является имя параметра, а значение - остальными его данные в виде еще коллекции пар-значений.

    При закрытии программы обратно переводить эти коллекции в строку и сохранять в параметре "ParamsTable".

    Таким образом получится и легко вести поиск по ключу, и позволит изменять значение параметров с сохранением при закрытии программы. Может есть способ лучше это реализовыать? Без установки дополнительного ПО



    • Изменено Siompc 15 апреля 2021 г. 13:29
    15 апреля 2021 г. 13:28
  • Типично небольшое количество данных хранят в XML или JSON. Данные из этих файлов загружают в при старте приложения, например используя сериалайзер. Получается объект который можно использовать как источник данных в UI. При выходе из приложения (или в любой другой удобный момент) данные перезаписываются сохраняя изменения.

    Примеры использования сериализации тут:

    https://docs.microsoft.com/en-us/dotnet/standard/serialization/examples-of-xml-serialization

    В вашем случае можно определить объект который будет иметь все что нужно как то:

    class ЗаписьИзБывшейБазы {

    string Параметр  {get; set; }

    double Значение {get; set} 

    // И так далее как было тут: Параметр (Строка) ; Значение (Число) ; Умолчания (Число) ; Описание (Текст)

    }

    Далее сериализуется список данных объектов. 


    This posting is provided "AS IS" with no warranties, and confers no rights.

    • Помечено в качестве ответа Siompc 16 апреля 2021 г. 8:16
    15 апреля 2021 г. 19:07
    Модератор
  • То, что нужно )) Спасибо. Еще один момент на будущее. Есть способ проверить наличие параметров приложения? По типу My.Settings.Contains("Имя").

    На данный момент я проверяю через исключение на строке - My.Settings.Item("Имя")

    15 апреля 2021 г. 21:04
  • То, что нужно )) Спасибо. Еще один момент на будущее. Есть способ проверить наличие параметров приложения? По типу My.Settings.Contains("Имя").

    На данный момент я проверяю через исключение на строке - My.Settings.Item("Имя")

    Используйте дизайнер для настроек, тогда доступ будет так: My.Settings.Имя. Ну а дальше можно проверить значение.

    Другой вариант - использовать ConfigurationManager.AppSetting и проверять то что возвращает индексер.

    https://docs.microsoft.com/en-us/dotnet/api/system.configuration.keyvalueconfigurationcollection.item?view=net-5.0


    This posting is provided "AS IS" with no warranties, and confers no rights.

    • Помечено в качестве ответа Siompc 16 апреля 2021 г. 8:16
    16 апреля 2021 г. 3:36
    Модератор