|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
БД файлов с описанием
Доброго времени суток. Делаю большой проект (для меня он большой и сложный) и так получилось что необходимо подключать БД, так как данных будет много. Создал БД и две таблицы. В первой таблице должен быть список файлов. При запуске функция сканирует каталог и необходимо это записать в таблицу без повторяемых записей при следующем запуске.
http://hexadecimal.url.ph/db.7z Последний раз редактировалось Kaktuz, 28.08.2015 в 01:50. |
#2
|
|||
|
|||
Сделай временную таблицу. При запуске вставляешь записи туда. Потом просто переносишь только те записи, которых нет в основной таблице. Читать SQL по ключевому слову EXISTS.
|
#3
|
|||
|
|||
Я не могу разобраться с тем как объединить Delphi и Access. Какие компоненты использовать, через какой компонент лучше добавлять / удалять / изменять данные в таблице. Как получить данные из строки таблицы и вывести их допустим в Label1. Основная масса примеров ссылаются на то что ADOConnection подключились, ADOQueri сделали запрос в DataSource и вывели в DBGrid. Но мне не нужно DBGrid это еще один объект с которым я не знаю как работать и общее изучение займет много времени. Нужно чтобы все было проще и понятнее как в PHP. Сделал запрос, получил массив запрашиваемой строки и выводи потом что и куда хочешь. Я уже недель колупаю, а результат нулевой.
|
#4
|
|||
|
|||
Просто ничего не бывает.
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
|
|||
|
|||
Финальная задача куда более масштабная. И список файлом может достигать 5000. Я изначально так и делал, подключил TIniFile для удобства, но когда файлов стало больше 400, он перестал читать остальные. Как выяснилось это из-за маленького буфера чтения. Вроде можно увеличить, но при таком количестве файлов посоветовали использовать БД, а как не сказали)) Единственно посоветовали использовать две таблицы. Список файлов и список данных.
Таблица #1 Содержит три важных параметра id - уникальный номер, через него будем читать данные с второй таблицы. file - путь к файлу condition - состояние файла Таблица #2 id - уникальный номер для поиска string - данные text1 - данные text2 - данные Ниже привет рисунок работы, как-то так должно получить и вроде будет нормально. При чтении хочу добавить условие. Если файла нет, спросить пользователя об удалении данных связанных с этим файлов, тоесть удалить данные с обоих таблиц. Ну и конечно удобно когда список файлов и данные будут в одном файле. Удобно переносить. Кстати заметил такую особенность. Если тип ячейки "текст" то его длина максимум 255. Если установить тип "memo" то в delphi при отображении данных в таблице просто написано "(MEMO)". Эм... Это вообще нормально? Я не могу нормально записать строку длинее 255 символов чтоли? Последний раз редактировалось Kaktuz, 28.08.2015 в 23:45. |
#6
|
|||
|
|||
Ну тогда читай, что я тебе ответил в первый раз и разбирайся с доступом к БД.
|
#7
|
|||
|
|||
Одно смущает. Тип "Text" ограничен до 255 символов. А тип "Memo" не виден в таблице Delphi. Это решаемо?
|
#8
|
|||
|
|||
Походу - нет.
Можно использовать не Access, а что-нить получше. Например, Embedded FireBird. Там VARCHAR достаточно длинный. Или SQLite, там в принципе все поля текстовые и без ограничения длинны. |
#9
|
||||
|
||||
Можно сделать так, что memo будет в таблице отображаться. Вот вам ссылочка на демо-проектик, как это можно сделать.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#10
|
|||
|
|||
Цитата:
Цитата:
Я так понимаю данные то обрабатываются правильно, просто сам DBGrid не отображает Memo поскольку это не строка? Так у меня там по сути будут строки, длинные строки. И вообще можно управлять данными без DBGrid? Я бы лучше вывел их в StringGrid обработал и потом сразу все значения обновил. |
#11
|
||||
|
||||
Цитата:
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете. |
#12
|
|||
|
|||
Цитата:
Вот вроде работает, но что-то не пойму, появилась ошибка которой ранее не было. Связанно это с тем что когда код записан в событие Form1.Action, а не напрямую в объекте. Код:
Form1.ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+WorkingFolder+'db1.mdb;Persist Security Info=False'; Последний раз редактировалось Kaktuz, 31.08.2015 в 18:47. |
#13
|
|||
|
|||
Похоже, что у тебя объект подключения к БД активный, т.е. подключение активированно на этапе дизайна. Поэтому сразу при запуске приложения (создании окна) происходит подключение к БД. Соответсвенно, коль соединение уже открыто, то смена строки подключения не разрешена.
Поставь в Design time свойство Active объекта ADOConnection1 в False. В обработчике события OnCreate формы установи стоку подключения (не в OnActivate, т.к. это событие может происходить несколько раз, а оно тебе не нужно), а после этого либо вызови метод Open, либо просо присвой св-ву Active знение True. |
#14
|
|||
|
|||
Нет. Я это проверил и специально прикрепил проект.
|
#15
|
|||
|
|||
Проверь еще раз. Очень уж специфичная ошибка.
|