Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.08.2015, 01:46
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию БД файлов с описанием

Доброго времени суток. Делаю большой проект (для меня он большой и сложный) и так получилось что необходимо подключать БД, так как данных будет много. Создал БД и две таблицы. В первой таблице должен быть список файлов. При запуске функция сканирует каталог и необходимо это записать в таблицу без повторяемых записей при следующем запуске.
http://hexadecimal.url.ph/db.7z

Последний раз редактировалось Kaktuz, 28.08.2015 в 01:50.
Ответить с цитированием
  #2  
Старый 28.08.2015, 05:50
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Сделай временную таблицу. При запуске вставляешь записи туда. Потом просто переносишь только те записи, которых нет в основной таблице. Читать SQL по ключевому слову EXISTS.
Ответить с цитированием
  #3  
Старый 28.08.2015, 14:24
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Я не могу разобраться с тем как объединить Delphi и Access. Какие компоненты использовать, через какой компонент лучше добавлять / удалять / изменять данные в таблице. Как получить данные из строки таблицы и вывести их допустим в Label1. Основная масса примеров ссылаются на то что ADOConnection подключились, ADOQueri сделали запрос в DataSource и вывели в DBGrid. Но мне не нужно DBGrid это еще один объект с которым я не знаю как работать и общее изучение займет много времени. Нужно чтобы все было проще и понятнее как в PHP. Сделал запрос, получил массив запрашиваемой строки и выводи потом что и куда хочешь. Я уже недель колупаю, а результат нулевой.
Ответить с цитированием
  #4  
Старый 28.08.2015, 19:19
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Просто ничего не бывает.
ADOConnection нужен для подсоединения к БД.
ADOQuery - для выполнения SQL запросов, результатом будет набор записей (собственно, та информация, котрую ты из БД хочешь получить)
DataSource - просто посредник между набором данных и компонентами отображения.
DBGrid - это просто отображение данных.

Можно и без БД обойтись.
Создай TStringList при старте приложения и подгрузи туда из файла текущий список (если файл существует). При закрытии - сохраняешь.
В принципе, если не ошибаюсь, можно просто использовать Key-Value возможности StringList'а. Должно хватить для твоей задачи.

Код:
const
  dataFile : String = 'c:\myfile.txt';

type
  TForm1 = class(TForm)
    ...
    Lst : TStringList;
  end;
...
procedure TForm1.FormCreate(Sender : TObject);
begin
  Lst := TStringList.Create;
  If FileExists(dataFile) Then
    Lst.LoadFromFile(dataFile);
end;

procedure TForm1.FormDestroy(Sender : Tobject);
begin
  Lst.SaveToFile(dataFile);
  Lst.Free;
end;

procedure TForm1.Button1Click(Sender : TObject);
begin
  // Loop through files
    Lst.Values[filename] := 'aaa';
end;
Ответить с цитированием
  #5  
Старый 28.08.2015, 23:21
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Финальная задача куда более масштабная. И список файлом может достигать 5000. Я изначально так и делал, подключил TIniFile для удобства, но когда файлов стало больше 400, он перестал читать остальные. Как выяснилось это из-за маленького буфера чтения. Вроде можно увеличить, но при таком количестве файлов посоветовали использовать БД, а как не сказали)) Единственно посоветовали использовать две таблицы. Список файлов и список данных.

Таблица #1
Содержит три важных параметра
id - уникальный номер, через него будем читать данные с второй таблицы.
file - путь к файлу
condition - состояние файла

Таблица #2
id - уникальный номер для поиска
string - данные
text1 - данные
text2 - данные

Ниже привет рисунок работы, как-то так должно получить и вроде будет нормально.

При чтении хочу добавить условие. Если файла нет, спросить пользователя об удалении данных связанных с этим файлов, тоесть удалить данные с обоих таблиц. Ну и конечно удобно когда список файлов и данные будут в одном файле. Удобно переносить.
Кстати заметил такую особенность. Если тип ячейки "текст" то его длина максимум 255. Если установить тип "memo" то в delphi при отображении данных в таблице просто написано "(MEMO)". Эм... Это вообще нормально? Я не могу нормально записать строку длинее 255 символов чтоли?

Последний раз редактировалось Kaktuz, 28.08.2015 в 23:45.
Ответить с цитированием
  #6  
Старый 29.08.2015, 08:31
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну тогда читай, что я тебе ответил в первый раз и разбирайся с доступом к БД.
Ответить с цитированием
  #7  
Старый 29.08.2015, 16:13
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Одно смущает. Тип "Text" ограничен до 255 символов. А тип "Memo" не виден в таблице Delphi. Это решаемо?
Ответить с цитированием
  #8  
Старый 30.08.2015, 06:21
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Походу - нет.
Можно использовать не Access, а что-нить получше. Например, Embedded FireBird. Там VARCHAR достаточно длинный. Или SQLite, там в принципе все поля текстовые и без ограничения длинны.
Ответить с цитированием
  #9  
Старый 30.08.2015, 10:42
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Можно сделать так, что memo будет в таблице отображаться. Вот вам ссылочка на демо-проектик, как это можно сделать.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #10  
Старый 30.08.2015, 18:57
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Походу - нет.
Можно использовать не Access, а что-нить получше. Например, Embedded FireBird. Там VARCHAR достаточно длинный. Или SQLite, там в принципе все поля текстовые и без ограничения длинны.
SQLite - это подключение новых компонентов, FAQ по этому дело почти нет, тут с Access разобраться не могу при том что уже все установлено и поиск выдает похожие результаты. Хотя вариант конечно интересный.

Цитата:
Сообщение от Страдалецъ
Можно сделать так, что memo будет в таблице отображаться. Вот вам ссылочка на демо-проектик, как это можно сделать.
Вот это интересный пример. Надо проделать парочку экспериментов. Разобраться как оно это делает.

Я так понимаю данные то обрабатываются правильно, просто сам DBGrid не отображает Memo поскольку это не строка? Так у меня там по сути будут строки, длинные строки. И вообще можно управлять данными без DBGrid? Я бы лучше вывел их в StringGrid обработал и потом сразу все значения обновил.
Ответить с цитированием
  #11  
Старый 31.08.2015, 00:09
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 339
Версия Delphi: 10.4
Репутация: 429
Сообщение

Цитата:
Сообщение от Kaktuz
Если установить тип "memo" то в delphi при отображении данных в таблице просто написано "(MEMO)".
А подключить компонент TDBMemo к полю типа Memo не подойдет? И все нормально будет отображаться.
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
  #12  
Старый 31.08.2015, 15:57
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Цитата:
Сообщение от Kailon
А подключить компонент TDBMemo к полю типа Memo не подойдет? И все нормально будет отображаться.
Это будет не очень удобно при работе.

Вот вроде работает, но что-то не пойму, появилась ошибка которой ранее не было.

Связанно это с тем что когда код записан в событие Form1.Action, а не напрямую в объекте.
Код:
Form1.ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+WorkingFolder+'db1.mdb;Persist Security Info=False';
Проект: Project1.7z

Последний раз редактировалось Kaktuz, 31.08.2015 в 18:47.
Ответить с цитированием
  #13  
Старый 31.08.2015, 19:48
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

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

Поставь в Design time свойство Active объекта ADOConnection1 в False. В обработчике события OnCreate формы установи стоку подключения (не в OnActivate, т.к. это событие может происходить несколько раз, а оно тебе не нужно), а после этого либо вызови метод Open, либо просо присвой св-ву Active знение True.
Ответить с цитированием
  #14  
Старый 31.08.2015, 20:10
Kaktuz Kaktuz вне форума
Начинающий
 
Регистрация: 30.10.2011
Сообщения: 149
Репутация: 10
По умолчанию

Нет. Я это проверил и специально прикрепил проект.
Ответить с цитированием
  #15  
Старый 31.08.2015, 21:09
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Проверь еще раз. Очень уж специфичная ошибка.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:45.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter