Аватар для DjSens
5 / 7 / 0
Регистрация: 19.09.2019
Сообщений: 94
Записей в блоге: 3

Как перейти от INI файлов к Базе Данных?

18.06.2022, 23:43. Показов 2676. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В очередном проекте решил хранить накапливаемые программой данные в БД, чтоб не переживать за размер и скорость работы.
Раньше применял INI файлы, было удобно: читаешь ReadString('indexNNN', 'FieldXXX', '') - если прочиталась пустая строка - то ничего не записывалось раньше, ну и записывать можно было в каждую секцию любое число любых полей с любыми данными. Попробовал БД Microsoft Access - там одни ошибки валятся, при чтении отсутствующего поля, или при записи в отсутствующее поле. Как проверять наличие поля - непонятно, и если поле создал программно - оно для всех строк таблицы создаётся ?

Существуют ли какие-то БД, с которыми так-же удобно работать как с INI файлами ? и чтоб в каждой строчке таблицы можно было лепить разное число произвольных полей
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.06.2022, 23:43
Ответы с готовыми решениями:

Как в INI файле перейти к нужному разделу?
Наверняка вопрос простой - как в INI файле перейти к нужному разделу?

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

Чтение данных теста из INI Файлов
В чем может быть проблема? При нажатии на кнопку для открытия первого теста все работает отлично, а если выбрать второй тест то вообще...

34
пофигист широкого профиля
4770 / 3206 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
19.06.2022, 00:19
Цитата Сообщение от DjSens Посмотреть сообщение
и чтоб в каждой строчке таблицы можно было лепить разное число произвольных полей
Такого не было, нет и не будет никогда в БД.
0
Модератор
 Аватар для D1973
9929 / 6467 / 2457
Регистрация: 21.01.2014
Сообщений: 27,426
Записей в блоге: 3
19.06.2022, 04:43
Цитата Сообщение от DjSens Посмотреть сообщение
чтоб в каждой строчке таблицы можно было лепить разное число произвольных полей
Нет, если в понятие "Базы данных" Вы вкладываете смысл "реляционные БД"... Тогда с утверждением
Цитата Сообщение от northener Посмотреть сообщение
Такого не было, нет и не будет никогда
можно согласиться... Но ведь все многообразие видов БД не ограничивается только двумерными таблицами. Если уровень позволяет - можете кубы попробовать... ( господи, о чем это я, человек с Access разобраться не может)
DjSens, или вот - иерархические БД! Самая известная иерархическая БД - реестр Windows. А чем работа с реестром принципиально отличается от работы с INI? Да почти ничем! Тот факт, что требуются повышенные права и можно систему положить на раз - пока оставляем в стороне.
0
371 / 337 / 83
Регистрация: 17.04.2022
Сообщений: 1,131
Записей в блоге: 8
19.06.2022, 05:32
Цитата Сообщение от DjSens Посмотреть сообщение
Существуют ли какие-то БД, с которыми так-же удобно работать как с INI файлами ? и чтоб в каждой строчке таблицы можно было лепить разное число произвольных полей
sqlite3 позволяет работать с json
sqlite4 добавлено хранилище key-value

Добавлено через 2 минуты
Цитата Сообщение от sqltd1 Посмотреть сообщение
можно было лепить разное число произвольных полей
в одном текстовом поле хранится json-объект, к полям которого можно получить доступ с пом. встроенных функций
0
 Аватар для DjSens
5 / 7 / 0
Регистрация: 19.09.2019
Сообщений: 94
Записей в блоге: 3
19.06.2022, 08:06  [ТС]
спасибо, похоже MongoDB - то что нужно, правда официальный сайт не открывается - пишет ошибку 403, из-за санкций наверно, т.к. через анонимайзер сайт открылся
0
408 / 242 / 88
Регистрация: 28.04.2022
Сообщений: 1,207
19.06.2022, 08:33
Цитата Сообщение от northener Посмотреть сообщение
Такого не было, нет и не будет никогда в БД.
Скажем так - в реляционной БД. По идее, автору подойдёт какая-нибудь NoSQL СУБД (хотя это из пушки по воробьям). Но судя по его энтузиазму, он ещё больше запутается.

Цитата Сообщение от DjSens Посмотреть сообщение
Как проверять наличие поля - непонятно, и если поле создал программно - оно для всех строк таблицы создаётся ?
Вы прежде чем что-то начинаете осваивать, изучит азы, т.к. букварь. Поле создаётся в принципе, неважно, "программно" или нет.
0
 Аватар для Пытливый
3763 / 2271 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
19.06.2022, 10:17
То что вы хотите легко реализуется и в любой реляционной БД, том же Акцесе, надо просто таблицу правильной структуры сделать. Содержимое любого Ini-файла помещается всего в одну таблицу с полями. Section,Ident,Value. Любой метод чтения данных из TIniFile мог бы и натолкнуть на такую мысль. Для Акцеса структура будет такая:

Доступ к такой таблице легко реализуется примерно так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Type
  TIniBase = class
  private
    FDataset: TDataset;
  public
    constructor Create(ADataset: TDataSet);
    procedure WriteValue(const Section, Ident, Value: Variant);
    function ReadValue(const Section, Ident: string; Default: Variant): Variant;
  public
    property Dataset: TDataset read FDataset write FDataset;
  end;
 
implementation
 
constructor TIniBase.Create(ADataset: TDataSet);
begin
  FDataset := ADataset;
  if not FDataset.Active then FDataset.Open;
end;
 
function TIniBase.ReadValue(const Section, Ident: string; Default: Variant): Variant;
begin
  Result := Default;
  if not FDataset.Active then Exit;
  if FDataset.Locate('Section;Ident',VarArrayOf([Section,Ident]),[])
  then Result := FDataset['Value'];
end;
 
procedure TIniBase.WriteValue(const Section, Ident, Value: Variant);
begin
  if not FDataset.Active then Exit;
  if FDataset.Locate('Section;Ident',VarArrayOf([Section,Ident]),[])
  then FDataset.Edit
  else FDataset.Append;
  FDataset['Section'] := Section;
  FDataset['Ident'] := Ident;
  FDataset['Value'] := Value;
  FDataset.Post;
end;
И работать можно как и с TIniFiles:
Delphi
1
2
3
4
5
6
7
8
  var IniBase := TIniBase.Create(ADOTable1);
  IniBase.WriteValue('Demo','Date',Now);
  IniBase.WriteValue('Demo','String','Строка');
  IniBase.WriteValue('Demo','Int',1);
  IniBase.WriteValue('Demo','Float',1.0);
  IniBase.WriteValue('Demo','Bool',True);
  if IniBase.ReadValue('Demo','Bool',False)
  then ShowMessage('');
1
 Аватар для volodin661
6806 / 2305 / 349
Регистрация: 10.12.2013
Сообщений: 7,932
19.06.2022, 12:04
---
1
371 / 337 / 83
Регистрация: 17.04.2022
Сообщений: 1,131
Записей в блоге: 8
19.06.2022, 12:20
Хех. Я вчера на хакерньюз ткнулся видимо одним из первых по ссылке (комментариев еще не было) https://news.ycombinator.com/item?id=31785170 , бегло пробежался по тексту и подумал вот ребята молодцы. Сейчас смотрю на появившиеся там комментарии, о том что проект закрыт. кто-то хорошо пошутил.

volodin661, спасибо за замечание. Я бы так и пребывал в уверенности, что пора переходить на новый релиз -)

Добавлено через 9 минут
странно. куда-то пропало текст от volodin661, на который я отвечал
0
 Аватар для volodin661
6806 / 2305 / 349
Регистрация: 10.12.2013
Сообщений: 7,932
19.06.2022, 13:28
Цитата Сообщение от DjSens Посмотреть сообщение
Существуют ли какие-то БД, с которыми так-же удобно работать как с INI файлами ? и чтоб в каждой строчке таблицы можно было лепить разное число произвольных полей
Code
1
2
3
set ^ABC(3)=456
set ^ABC(8,"width")=12.7
set ^ABC("total")=45
язык М;
начало разработки: 1967
актуальное состояние: активная разработка
( Caché, GT.M, MiniM, YottaDB )

В примере выше переменная ^ABC обладает свойством persistent ( т.е, сразу сохраняется в Базу Данных) из-за добавления перед именем переменной символа ^ (циркумфлекс) ; В некотором смысле эта переменная и есть База Данных;

Добавлено через 1 минуту
Цитата Сообщение от sqltd1 Посмотреть сообщение
странно. куда-то пропало текст от volodin661, на который я отвечал

у меня он тоже пропал ))
0
 Аватар для DjSens
5 / 7 / 0
Регистрация: 19.09.2019
Сообщений: 94
Записей в блоге: 3
19.06.2022, 20:59  [ТС]
Пытливый, спасибо, попробую ваш вариант когда до компа доберусь

Добавлено через 3 часа 35 минут
Пытливый, посмотрел внимательнее - таким способом конечно увеличивается расход памяти на повторы названий секций в каждой строке, по сравнению с INI файлом, но расход можно минимизировать - просто применять числа от 1 до N вместо названий секций, ну и держать отдельную таблицу, в которой задано соответствие что же означает каждое число.
Буду пробовать такой способ
0
Модератор
4149 / 2360 / 812
Регистрация: 15.11.2015
Сообщений: 9,462
19.06.2022, 21:04
DjSens, там что, миллион настроек, чтобы так сильно экономить память?
0
 Аватар для DjSens
5 / 7 / 0
Регистрация: 19.09.2019
Сообщений: 94
Записей в блоге: 3
19.06.2022, 21:29  [ТС]
AzAtom, я раньше базы данных пихал в ini, теперь пришла пора пихать данные в базу данных
0
 Аватар для Пытливый
3763 / 2271 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
19.06.2022, 21:46
Ну можно завести справочную таблицу для названий секций, но это неоправданно усложнит код. Можете просто задать в базе длину полей для Sections и Ident в 50 символов, а для Value уже можно по максимуму 255 оставить. Даже если у вас будет на одну секцию 1000 параметров, то расход памяти будет крайне мал и смысла в такой экономии нет.

Добавлено через 2 минуты
Есть еще один момент. В текущей реализации вы можете в одной базе держать несколько таких ini-таблиц и легко переключаться между ними, а вот если сделать справочник, то тут возможны неожиданные сюрпризы.
0
 Аватар для DjSens
5 / 7 / 0
Регистрация: 19.09.2019
Сообщений: 94
Записей в блоге: 3
19.06.2022, 21:47  [ТС]
Пытливый, как 255 ? Опять облом, мне надо больше... Тогда остаётся на mongo переходить...
0
408 / 242 / 88
Регистрация: 28.04.2022
Сообщений: 1,207
19.06.2022, 21:48
Цитата Сообщение от Пытливый Посмотреть сообщение
То что вы хотите легко реализуется и в любой реляционной БД
ТС не умеет в SQL и вряд ли вообще слышал про него. Достаточно функции в пять строчек, которая будет возвращать нужное значение по секции и ключу, делая простейший запрос к БД.
0
 Аватар для Пытливый
3763 / 2271 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
19.06.2022, 21:58
Можно и больше 255, но тогда используйте уже новую версию базы Акцес, там текстовые поля уже существенно больше до 64к, а если у вас XE версия Delphi, я бы вместо Акцеса использовал SQLite
0
пофигист широкого профиля
4770 / 3206 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
20.06.2022, 01:37
Цитата Сообщение от DjSens Посмотреть сообщение
В очередном проекте решил хранить накапливаемые программой данные в БД, чтоб не переживать за размер и скорость работы.
А стоило ли переживать?
Например о размере. Размер хранимых данных в общем случае никак не оптимизируется местом и способом их хранения.
Скорость работы... Ну тут вряд ли вам помогут какие-то готовые инструменты. В конце концов скорость определяется поиском данных в некоем/некоих файле/ах. А это самая времязатратная операция.

Цитата Сообщение от DjSens Посмотреть сообщение
AzAtom, я раньше базы данных пихал в ini, теперь пришла пора пихать данные в базу данных
Таки пришла пора тщательно подумать что, зачем и почему нужно изменить.

Добавлено через 10 минут
P.S. Ну и да. INI-файл это тоже база данных. С широкой точки зрения. Стоит ли менять шило на мыло?
0
 Аватар для krapotkin
6851 / 4677 / 1465
Регистрация: 14.04.2014
Сообщений: 20,674
Записей в блоге: 21
20.06.2022, 15:52
у меня в JSON все настройки хранятся издавна
в БД стоит хранить лишь то, что должно сохраниться если мы зайдем в ту же программу на другом компьютере
иначе - зачем ?
0
 Аватар для DjSens
5 / 7 / 0
Регистрация: 19.09.2019
Сообщений: 94
Записей в блоге: 3
20.06.2022, 19:34  [ТС]
northener, в INI файле я хранил зарегенных юзеров (логины, емэйлы) и их сообщения, и ещё много всякого,
потом столкнулся с быстродействием - перешёл на TMemIniFile - помогло.
Но эти MemIniFile хранятся в ОЗУ, а если они вырастут до пары гигов ? у меня на арендованном виндовс-сервере памяти маловато (1Гб RAM, 30Гб HDD, 2.2ГГц).
Поэтому небольшие и требующие быстродействия таблицы хочу оставить в MemIni, а всякие текстовые сообщения и базу юзеров - загнать в БД
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.06.2022, 19:34
Помогаю со студенческими работами здесь

Delphi 7,ini файлы,при чтении с ini файлов весь файл загружается в оп или каким образом это происходит?
причина вопроса заключается в том, есть ли смысл разбивать один ini файл на несколько

Хранение файлов в базе данных
У меня есть БД в которуй будут хранить вордовские документы. Как выполнить открытие файла?

Сохранение больших файлов в базе данных
Как сохранять большие файлы в базе данных? У меня есть программа, которая предоставляет возможность загрузить файлы с компьютера в...

Сохранение бинарных файлов в базе данных
Добрый день! Есть некий массив классов. Сейчас этот массив сохраняется в бинарном виде в файл с помощью ofstream. Загружается с...

Записи в базе данных, как встать на последнюю запись в базе после открытия?
Есть два вопроса. Во-первых - как встать на последнюю запись в базе после открытия? И во-вторых - есть база в которую каждые 10...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: показать затраченные материалы за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В качестве. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru