Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
 Аватар для DjSens
5 / 7 / 0
Регистрация: 19.09.2019
Сообщений: 94
Записей в блоге: 3

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

18.06.2022, 23:43. Показов 2587. Ответов 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
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
19.06.2022, 00:19
Цитата Сообщение от DjSens Посмотреть сообщение
и чтоб в каждой строчке таблицы можно было лепить разное число произвольных полей
Такого не было, нет и не будет никогда в БД.
0
Модератор
 Аватар для D1973
9924 / 6460 / 2457
Регистрация: 21.01.2014
Сообщений: 27,410
Записей в блоге: 3
19.06.2022, 04:43
Цитата Сообщение от DjSens Посмотреть сообщение
чтоб в каждой строчке таблицы можно было лепить разное число произвольных полей
Нет, если в понятие "Базы данных" Вы вкладываете смысл "реляционные БД"... Тогда с утверждением
Цитата Сообщение от northener Посмотреть сообщение
Такого не было, нет и не будет никогда
можно согласиться... Но ведь все многообразие видов БД не ограничивается только двумерными таблицами. Если уровень позволяет - можете кубы попробовать... ( господи, о чем это я, человек с Access разобраться не может)
DjSens, или вот - иерархические БД! Самая известная иерархическая БД - реестр Windows. А чем работа с реестром принципиально отличается от работы с INI? Да почти ничем! Тот факт, что требуются повышенные права и можно систему положить на раз - пока оставляем в стороне.
0
368 / 333 / 83
Регистрация: 17.04.2022
Сообщений: 1,116
Записей в блоге: 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 / 2267 / 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
6793 / 2290 / 348
Регистрация: 10.12.2013
Сообщений: 7,901
19.06.2022, 12:04
---
1
368 / 333 / 83
Регистрация: 17.04.2022
Сообщений: 1,116
Записей в блоге: 8
19.06.2022, 12:20
Хех. Я вчера на хакерньюз ткнулся видимо одним из первых по ссылке (комментариев еще не было) https://news.ycombinator.com/item?id=31785170 , бегло пробежался по тексту и подумал вот ребята молодцы. Сейчас смотрю на появившиеся там комментарии, о том что проект закрыт. кто-то хорошо пошутил.

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

Добавлено через 9 минут
странно. куда-то пропало текст от volodin661, на который я отвечал
0
 Аватар для volodin661
6793 / 2290 / 348
Регистрация: 10.12.2013
Сообщений: 7,901
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
Модератор
4146 / 2357 / 812
Регистрация: 15.11.2015
Сообщений: 9,433
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 / 2267 / 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 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
19.06.2022, 21:58
Можно и больше 255, но тогда используйте уже новую версию базы Акцес, там текстовые поля уже существенно больше до 64к, а если у вас XE версия Delphi, я бы вместо Акцеса использовал SQLite
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
20.06.2022, 01:37
Цитата Сообщение от DjSens Посмотреть сообщение
В очередном проекте решил хранить накапливаемые программой данные в БД, чтоб не переживать за размер и скорость работы.
А стоило ли переживать?
Например о размере. Размер хранимых данных в общем случае никак не оптимизируется местом и способом их хранения.
Скорость работы... Ну тут вряд ли вам помогут какие-то готовые инструменты. В конце концов скорость определяется поиском данных в некоем/некоих файле/ах. А это самая времязатратная операция.

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

Добавлено через 10 минут
P.S. Ну и да. INI-файл это тоже база данных. С широкой точки зрения. Стоит ли менять шило на мыло?
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru